Golang : 实验性的Jawi编程语言

114 阅读1分钟

好吧,今天是星期天,我有一些空闲时间。所以,我利用我的空闲时间建立了这个使用Jawi作为编程语言的简单项目。这个项目的灵感来自于文言文语言(一种使用古代汉语的编程语言,又称福建话)。

github.com/wenyan-lang…

由于建立词典、解析器、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的问题是,它是从右到左的书写系统,也许只是一个需要克服的小问题。我将看看情况如何。

参考资料。

golang.org/pkg/text/sc…