Access denied, Please sign in and make sure you have proper permission.
Go 语言本身很小,但是背后的支持工具却异常丰富。之前整理了 AST 部分的内容,但是对 Go 前端的实现没有涉及。这个本书希望展示如何从头实现一个 Go 语言的子集µGo 语言。内容计划包含 Go 语言词法解析、语法树构建、语言特性底层实现等内容,最终通过输出 LLVM 编译为本地可执行程序。感谢关注
这个报错正常吗?运行不了。
$./ugo -ast -file ../examples/ch1.1/01/hello.ugo
fatal error: panic while printing panic value
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x10b45d8]
goroutine 1 [running]:
runtime.throw({0x10e7ec8, 0x10994a5})
/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc000076a70 sp=0xc000076a40 pc=0x1030231
runtime.preprintpanics.func1()
/usr/local/go/src/runtime/panic.go:695 +0x45 fp=0xc000076a90 sp=0xc000076a70 pc=0x1058a05
runtime.deferCallSave(0xc000076b98, 0x10eb670)
/usr/local/go/src/runtime/panic.go:950 +0x82 fp=0xc000076aa0 sp=0xc000076a90 pc=0x102f9c2
ugo 还在完善中,目前只能输出 file.ugo 的语法树,不能执行。内容也可能有变动导致代码不能跑,建议每个 ch 的例子独立运行
我把代码补齐了,书中没有提供 main,建议加上,我是猜测的。
ugo 项目对于推广 go 语言和编译器都很有帮助,谢谢分享,加油!
我看到了,代码在 examples 目录。
package main
import (
"fmt"
"iol"
"os"
"os/exec"
)
func compile ( code string ) {
output := fmt . Sprintf ( tmpl , code )
os . WriteFile ( "a.out.ll" , [] byte ( output ), 0666 )
exec . Command ( "clang" , "-Wno-override-module" , "-o" , "a.out" , "a.out.ll" ) . Run ()
}
const tmpl = `
define i32 @main() {
ret i32 %v
}
`
func main () {
code , _ := io . ReadAll ( os . Stdin )
compile ( string ( code ))
}
👍,ugo 目录会提供一个最终版本的实现,但是目前还在初级阶段。examples 下每个 ch 子目录,可以看作是 ugo 中间实现过程中更不完整的版本。目前只是空闲时间边实现边完善内容,进度可能比较慢,也欢迎 PR