为什么ANTLR4C语法分析器规则是;“类型说明符”;“不使用lexer规则”;“双”字;?

为什么ANTLR4C语法分析器规则是;“类型说明符”;“不使用lexer规则”;“双”字;?,antlr4,Antlr4,我用这个词作为我自己语法的灵感。我想到了一件我不太明白的事。为什么不使用数据类型时会有Lexer规则?例如规则Double:'Double'从未被使用,但解析器规则类型说明符:('double'|…)(其他数据类型已删除以简化)用于多个位置。解析器规则类型说明符没有使用lexer规则Double有什么原因吗?该页面上的所有语法都是自愿提交的,不是ANTLR4的一部分。这显然是一个错误,但按照lexer规则的匹配方式,它不会对lexer产生影响。您可以选择实现显式规则: Double : 'dou

我用这个词作为我自己语法的灵感。我想到了一件我不太明白的事。为什么不使用数据类型时会有Lexer规则?例如规则
Double:'Double'从未被使用,但解析器规则
类型说明符:('double'|…)(其他数据类型已删除以简化)用于多个位置。解析器规则类型说明符没有使用lexer规则Double有什么原因吗?

该页面上的所有语法都是自愿提交的,不是ANTLR4的一部分。这显然是一个错误,但按照lexer规则的匹配方式,它不会对lexer产生影响。您可以选择实现显式规则:

Double : 'double';
或者隐含的一点:

typeSpecifier
    :   ('void'
    |   'char'
    |   'short'
    |   'int'
    |   'long'
    |   'float'
    |   'double'
两种方法都不会产生不良影响,即使你混合使用了不同的方法。事实上,如果你更全面地看一下整个语法,作者对许多其他词法规则也做了同样的事情,比如
Register
。在实际操作中没有区别


底线是什么?选择你喜欢的方法并始终如一地应用。我个人倾向于简洁,所以我喜欢隐式标记,只要它们只在语法中的一个地方使用。一旦一个代币可能在两个地方使用,我宁愿用它制作一个明确的代币,并更新使用它的两个或多个位置。

感谢您的澄清!