Golang Go语言中写 parser 时对语法定义有疑惑
比如 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
好像没有特殊含义,就是表示一个句子的结尾
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)的深入理解。以下是一些建议,希望能帮助你解决疑惑:
-
明确语法规则:首先,确保你完全理解你要解析的语言的语法规则。这通常包括词法单元(如关键字、标识符、操作符等)和它们的组合方式(语法结构)。
-
使用工具辅助:Go语言社区提供了许多工具和库来帮助构建解析器,如
go/token
和go/parser
包,它们可以用于词法分析和语法分析。此外,你还可以考虑使用第三方库,如goparser
或peg
,它们提供了更高级的解析功能。 -
参考文档和示例:查阅Go语言的官方文档,了解
go/parser
和其他相关包的用法。同时,搜索和研究一些开源项目中的解析器实现,这可以帮助你理解如何在实际项目中应用这些工具。 -
实践出真知:编写小型的解析器示例,从简单的语法开始,逐步增加复杂性。通过实践,你会对语法定义和解析过程有更深刻的理解。
-
寻求社区帮助:如果你在某个具体问题上遇到困难,不妨在Go语言的社区论坛、Stack Overflow或GitHub上提问。Go语言社区非常活跃,通常会有经验丰富的开发者愿意提供帮助。
希望这些建议能帮助你解决在编写Go语言parser时对语法定义的疑惑。