Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing Go使用Go来解析自身?_Parsing_Go_Grammar_Token - Fatal编程技术网

Parsing Go使用Go来解析自身?

Parsing Go使用Go来解析自身?,parsing,go,grammar,token,Parsing,Go,Grammar,Token,我正在开始一个关于添加一些功能的类项目 然而,我对围棋的结构完全感到困惑。我的印象是Go使用了flex和bison,但我在Go源代码中找不到任何熟悉的东西 另一方面,目录go/src/pkg/go有一些名称熟悉的文件夹(ast、token、parser等),但它们都包含.go文件。我糊涂了 我的要求是,对于任何熟悉Go的人,你能给我一个关于Go是如何进行词法分析、解析等的概述,以及在哪里找到文件来编辑语法等等吗?Go编译器是用c编写的,这就是为什么你需要flex和bison。未使用用于分析的Go

我正在开始一个关于添加一些功能的类项目

然而,我对围棋的结构完全感到困惑。我的印象是Go使用了flex和bison,但我在Go源代码中找不到任何熟悉的东西

另一方面,目录go/src/pkg/go有一些名称熟悉的文件夹(ast、token、parser等),但它们都包含.go文件。我糊涂了


我的要求是,对于任何熟悉Go的人,你能给我一个关于Go是如何进行词法分析、解析等的概述,以及在哪里找到文件来编辑语法等等吗?

Go编译器是用c编写的,这就是为什么你需要flex和bison。未使用用于分析的Go包。如果您想在Go中编写自托管编译器,可以使用Go解析包。


目录结构:

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)
Lexer是用纯C语言编写的(no
flex
)。语法是用野牛写的:

src/cmd/gc/lex.c
src/cmd/gc/go.y
src/cmd
下的许多目录都包含一个
doc.go
文件,其中包含对目录内容的简短描述


如果您打算修改语法,应该注意的是,Bison语法有时不区分表达式和类型。

如果他们手工编写解析器,我也不会感到惊讶(而且手动滚动lexer也不是非常奇怪)。这对于成熟的编译器来说是很常见的,并且有很多优点。谢谢!由于8g是我计算机上的Go编译器,我原以为这些文件应该是src/cmd/8g格式的。8g文件夹中的文件做什么?@user736932:这些源提供特定于体系结构的代码生成。gc是/应该是编译器中独立于arch的部分,它甚至内置了深度优先的AST walker和访问者接口。实际上,我正在研究为语言中最简单的部分编写codegen(基本上,任何不需要运行时中更复杂的部分的东西,比如goroutines和垃圾收集,因此它最终将成为具有更好语法的C)。