Golang Go语言中写 parser 时对语法定义有疑惑

发布于 1周前 作者 caililin 来自 Go语言

比如 import 语句的定义如下,可知 import 语句由 “import” + 可选的 ImportSpec + ImportPath 组成 ( https://go.dev/ref/spec#ImportSpec

ImportDecl       = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) .
ImportSpec       = [ "." | PackageName ] ImportPath .
ImportPath       = string_lit .

但问题是,连接这三者的“空白区域”的定义并不明确,比如,我认为 空白区域可以填充任意形式的注释,但并非如此:

import /*
 */f "fmt"

上面这个注释的使用是正确的

import /*
 */f /*
 */ "fmt"

但这个注释的使用就是错误的,ImportSpec 和 ImportPath 之间只能用不含换行的注释

问题是,我如何能知道哪些空白区域可以换行,哪些地方不能?


Golang Go语言中写 parser 时对语法定义有疑惑

更多关于Golang Go语言中写 parser 时对语法定义有疑惑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

. 表示什么?

更多关于Golang Go语言中写 parser 时对语法定义有疑惑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好像没有特殊含义,就是表示一个句子的结尾

tokenizer 的第一步是消除注释, 第二步是处理空格, 普遍是两种做法, 一是无用空格消除, 二是空格展开.

http://accu.cc/content/misc/minits/, 见词法分析一节.

嗯,但后来我发觉这个问题其实和 comment 没有关系,其实是空白区域能不能换行的问题,因为我刚才在文档里看到了多行注释会被视为一个换行符、单行注释会被视为一个空白符

只是消除注释不能解决问题

我现在不得不手动遍历一下看看那些地方能够插入换行符 。。 像 fmt.\nPrintln 这样的 ident 也是 OK 的

抱歉,没懂你的意思

这明显是一个 BUG ,先把 patch 准备好了再提 issue 。重写 parser 没必要严格遵循语法,简单点才好。
也开一个手写 uGo 的坑,欢迎关注: https://github.com/wa-lang/ugo-compiler-book

在Go语言中编写parser(解析器)时,对语法定义产生疑惑是很常见的,这通常涉及到对词法分析(Lexical Analysis)和语法分析(Syntax Analysis)的深入理解。以下是一些建议,希望能帮助你解决疑惑:

  1. 明确语法规则:首先,确保你完全理解你要解析的语言的语法规则。这通常包括词法单元(如关键字、标识符、操作符等)和它们的组合方式(语法结构)。

  2. 使用工具辅助:Go语言社区提供了许多工具和库来帮助构建解析器,如go/tokengo/parser包,它们可以用于词法分析和语法分析。此外,你还可以考虑使用第三方库,如goparserpeg,它们提供了更高级的解析功能。

  3. 参考文档和示例:查阅Go语言的官方文档,了解go/parser和其他相关包的用法。同时,搜索和研究一些开源项目中的解析器实现,这可以帮助你理解如何在实际项目中应用这些工具。

  4. 实践出真知:编写小型的解析器示例,从简单的语法开始,逐步增加复杂性。通过实践,你会对语法定义和解析过程有更深刻的理解。

  5. 寻求社区帮助:如果你在某个具体问题上遇到困难,不妨在Go语言的社区论坛、Stack Overflow或GitHub上提问。Go语言社区非常活跃,通常会有经验丰富的开发者愿意提供帮助。

希望这些建议能帮助你解决在编写Go语言parser时对语法定义的疑惑。

回到顶部