好吧,今天是星期天,我有一些空闲时间。所以,我利用我的空闲时间建立了这个使用Jawi作为编程语言的简单项目。这个项目的灵感来自于文言文语言(一种使用古代汉语的编程语言,又称福建话)。
由于建立词典、解析器、AST、编译器和代码生成器对我来说需要很长的时间,因此我作了一点小弊。Jawi代码将被翻译成Golang等效代码,由Golang编译器编译。
注:下面这个例子将产生足够的Golang代码来产生一个简单的Hello World例子。如果我需要涵盖Golang的所有保留字,还有更多的工作要做,这将需要我在另一个自由的星期天。
package main
import (
"fmt"
"strings"
"text/scanner"
)
func main() {
jawiGolang := map[string]string{}
dictionary := `var,ڤايمباولايهوباه
Println,چايتاقڬاراس
const,مالر
package,ڤاکيج
import,امڤاوت
main,اوتام
func,فوڠسي`
lines := strings.Split(dictionary, "\n")
// build the dictionary
for _, line := range lines {
if len(line) > 0 {
split := strings.Split(line, ",")
golang := split[0]
jawi := split[1]
jawiGolang[jawi] = golang
}
}
//test
jawiCode := `ڤاکيج اوتام
امڤاوت (
"fmt"
)
ڤايمباولايهوباه txt = "世界汝好 ! Hello World !"
مالر jawitxt = "هاي دنيا !"
فوڠسي اوتام() {
fmt.چايتاقڬاراس (txt)
fmt.چايتاقڬاراس (jawitxt)
}`
codeReader := strings.NewReader(jawiCode)
var scn scanner.Scanner
scn.Init(codeReader)
scn.Whitespace ^= 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' ' // don't skip tabs and new lines
for tok := scn.Scan(); tok != scanner.EOF; tok = scn.Scan() {
switch tok {
case '\n':
fmt.Println()
case '\t':
fmt.Print(" ")
default:
if jawiGolang[scn.TokenText()] != "" {
fmt.Print(jawiGolang[scn.TokenText()])
} else {
fmt.Print(scn.TokenText())
}
}
}
fmt.Println()
}
一个朋友建议我用LLVM完成整个项目。我将尝试进一步探索LLVM,看看情况如何。Jawi的问题是,它是从右到左的书写系统,也许只是一个需要克服的小问题。我将看看情况如何。
参考资料。