我使用antlr4 c grammar作为我自己语法的灵感来源。我找到了一件我不懂的东西。为什么没有使用数据类型的Lexer规则?例如,从未使用过规则Double : 'double';
,但是在几个地方使用了解析器规则typeSpecifier:('double' | ... );
(其他数据类型已被删除以简化)。是否有理由解析器规则 typeSpecifier 未使用词法分析器规则 Double ?
答案 0 :(得分:1)
该页面上的所有语法都是志愿者提交的,而不是ANTLR4的一部分。这显然是一个错误,但是lexer规则的匹配方式,它不会对lexing产生影响。您可以选择实施显式规则:
Double : 'double';
或隐含的:
typeSpecifier
: ('void'
| 'char'
| 'short'
| 'int'
| 'long'
| 'float'
| 'double'
即使你混合方法也没有任何不良影响。实际上,如果你对整个语法进行更全面的研究,那么作者就会使用许多其他词法分析器规则做同样的事情,例如Register
。在实际操作中没有任何区别。
底线?选择您喜欢的方法并始终如一地应用它。我个人的偏好是简洁,所以我喜欢隐含的标记,只要它们只用在语法中的一个地方。一旦令牌可能在两个地方使用,我更愿意从中提取一个明确的令牌并更新它所使用的两个或更多位置。