在我正在ANTLR(v4)工作的项目中,我有这样的规则:
Equal : '::='
Identifier
: ('A'..'Z' | '_' | '0'..'9') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
;
Constant
: Identifier Equal Expression
;
我给它代码如下:
X ::= 1
,而不是它是“常量”,它作为三个单独的标记出现:标识符,等号和标识符。我似乎无法弄清楚我做错了什么。也许我应该回到使用Haskell的Parsec库。 (我停止使用它的原因很长。)
答案 0 :(得分:1)
它们是3个令牌,因为它们之间有空格。当您执行X::=1
时,它最终会成为一个Constant
令牌。
您可能定义了一个跳过空格字符的词法分析器规则,但这只会导致解析器永远不会看到这些空格,而不是词法分析器。
您的常量规则应该是解析器规则,那么您将不会遇到任何问题。创建1个单一常量标记没有多大意义。大概你的表达规则也应如此。令牌(词法规则)是您语言的基本构建块。像化学中的原子一样。解析器规则(较低的规则)用于将这些令牌粘合在一起。