Go使用Go语言解析自己?

12

我正在开始一个课程项目,涉及向Go语言中添加一些功能。

然而,我对Go语言的结构感到十分困惑。我原本认为Go是使用flex和bison解析器生成的,但在Go源代码中我找不到任何熟悉的东西。

另一方面,目录go/src/pkg/go下有一些文件夹,它们的名称很熟悉(如ast、token、parser等),但它们只包含.go文件。我很困惑!

我的请求是,如果有人熟悉Go语言,能否给我一个关于Go的词法分析、语法分析等方面的概述,并告诉我在哪里可以找到编辑语法等文件?


2
如果他们手写解析器的话,我不会感到惊讶(手写词法分析器也不是太离谱)。对于成熟的编译器来说,这实际上是相当普遍的做法,并且具有各种优点。 - user395760
3个回答

8
目录结构如下:
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)。语法分析器是用Bison编写的:

src/cmd/gc/lex.c
src/cmd/gc/go.y

许多在src/cmd下的目录都有一个doc.go文件,其中包含该目录内容的简短描述。

如果您计划修改语法,则应注意Bison语法有时不区分表达式和类型。


4

谢谢!由于8g是我的计算机上的Go编译器,我认为文件应该在src/cmd/8g中。8g文件夹中的文件是做什么用的? - calvin
@user736932:这些源代码提供特定体系结构的代码生成。gc是/应该是编译器中与体系结构无关的部分。 - zzzz

3

Go编译器是用c语言编写的,所以你需要flex和bison。不使用Go解析包。如果你想在Go中编写自我托管编译器,可以使用Go解析包。


它甚至内置了深度优先 AST 遍历器和访问者接口。我其实正在研究为语言的简单部分编写 codegen(基本上,任何不需要更复杂的运行时部分,如 goroutines 和垃圾回收的东西,因此最终将变成带有更好语法的 C)。 - matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接