我开始了一个关于为Go添加一些功能的类项目。Go使用Go来解析它自己?
但是,我对Go的结构感到十分困惑。我的印象是Go使用了flex和bison,但在Go源代码中找不到任何熟悉的东西。
另一方面,目录go/src/pkg/go具有熟悉的名称(ast,token,parser等)的文件夹,但它们包含的都是.go文件。我很困惑!
我的请求是,任何熟悉Go的人都可以给我一个关于Go是如何lexed,parsed等的概述,以及在哪里可以找到编辑文法和文件的文件?
我开始了一个关于为Go添加一些功能的类项目。Go使用Go来解析它自己?
但是,我对Go的结构感到十分困惑。我的印象是Go使用了flex和bison,但在Go源代码中找不到任何熟悉的东西。
另一方面,目录go/src/pkg/go具有熟悉的名称(ast,token,parser等)的文件夹,但它们包含的都是.go文件。我很困惑!
我的请求是,任何熟悉Go的人都可以给我一个关于Go是如何lexed,parsed等的概述,以及在哪里可以找到编辑文法和文件的文件?
目录结构:
src/cmd/5* ARM
src/cmd/6* amd64 (x86-64)
src/cmd/8* i386 (x86-32)
src/cmd/cc C compiler (common part)
src/cmd/gc Go compiler (common part)
src/cmd/ld Linker (common part)
src/cmd/6c C compiler (amd64-specific part)
src/cmd/6g Go compiler (amd64-specific part)
src/cmd/6l Linker (amd64-specific part)
词法是用纯C(无flex
)。语法是写在野牛:
src/cmd/gc/lex.c
src/cmd/gc/go.y
src/cmd
下,许多目录包含doc.go
文件与目录的内容简短描述。
如果您打算修改语法,应该注意的是,Bison语法有时不区分表达式和类型。
Go编译器是用c编写的,这就是为什么你需要flex和野牛。不使用Go包解析。如果您想在Go中编写自主托管编译器,则可以使用Go解析包。
它甚至有一个深度优先的AST walker和一个内置的Visitor接口。我实际上正在研究为该语言的最简单部分编写codegen(基本上,任何不需要更复杂的运行时部分,比如goroutines和垃圾收集,所以它最终会成为一个更好的语法C)。 – matthias 2012-04-07 08:00:23
如果他们手工编写解析器(并且手动翻译词法分析器也不是非常怪异),我不会感到惊讶。这对于成熟的编译器来说确实很常见,并且具有各种优点。 – delnan 2012-03-27 16:56:56