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

Why is antlr4 c grammar parser rule "typeSpecifier" not using lexer rule "Double"?

我正在使用 antlr4 c grammar 作为我自己语法的灵感。我经历了一件我真的不明白的事情。为什么不使用数据类型时会有 Lexer 规则?例如,规则 Double : 'double'; 从未使用过,但解析器规则 typeSpecifier:('double' | ... );(其他数据类型已被删除以简化)在多个地方使用。为什么解析器规则 typeSpecifier 没有使用词法分析器规则 Double?

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

Double : 'double';

或隐含的:

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

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

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