为什么 antlr4 c 语法解析器规则"typeSpecifier"不使用词法分析器规则"Double"?



我正在使用antlr4 c语法作为我自己语法的灵感。我遇到了一件我不太明白的事情。为什么在不使用数据类型时会有字典分析规则?例如,从不使用规则Double : 'double';,但多次使用解析器规则typeSpecifier:('double' | ... );(为简化而删除了其他数据类型(。解析器规则类型说明符不使用词法分析器规则Double的原因是什么?

该页面上的所有语法都是志愿者提交的内容,而不是ANTLR4的一部分。 这显然是一个错误,但词法分析器规则的匹配方式不会对词法产生影响。 您可以选择实现显式规则之一:

Double : 'double';

或隐式的:

typeSpecifier
:   ('void'
|   'char'
|   'short'
|   'int'
|   'long'
|   'float'
|   'double'

即使你混合使用方法,也不会产生不良影响。 事实上,如果你更全面地看待整个语法,作者对许多其他词法分析器规则做了同样的事情,例如Register。 在实际操作中没有区别。

底线? 选择您喜欢的方法并始终如一地应用它。 我个人更喜欢简洁,所以我喜欢隐式标记,只要它们只在语法中的一个地方使用。 一旦令牌可能在两个地方使用,我更喜欢用它创建一个显式令牌,并更新使用它的两个或多个位置。

最新更新