为什么 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
。在实际操作中没有任何区别。
底线?选择您喜欢的任何方法并始终如一地应用它。我个人偏向于简洁,所以我喜欢隐式记号 只要它们只在语法中的一个地方使用 。一旦可以在两个地方使用令牌,我更愿意从中创建一个显式令牌并更新使用它的两个或更多位置。
我正在使用 antlr4 c grammar 作为我自己语法的灵感。我经历了一件我真的不明白的事情。为什么不使用数据类型时会有 Lexer 规则?例如,规则 Double : 'double';
从未使用过,但解析器规则 typeSpecifier:('double' | ... );
(其他数据类型已被删除以简化)在多个地方使用。为什么解析器规则 typeSpecifier 没有使用词法分析器规则 Double?
该页面上的所有语法都是自愿提交的,不是 ANTLR4 的一部分。这显然是一个错误,但是匹配词法分析器规则的方式不会对词法分析产生影响。您可以选择实施显式规则:
Double : 'double';
或隐含的:
typeSpecifier
: ('void'
| 'char'
| 'short'
| 'int'
| 'long'
| 'float'
| 'double'
两种方法都没有不良影响,即使混合使用方法也是如此。事实上,如果你更全面地审视整个语法,作者对许多其他词法分析器规则做了同样的事情,例如 Register
。在实际操作中没有任何区别。
底线?选择您喜欢的任何方法并始终如一地应用它。我个人偏向于简洁,所以我喜欢隐式记号 只要它们只在语法中的一个地方使用 。一旦可以在两个地方使用令牌,我更愿意从中创建一个显式令牌并更新使用它的两个或更多位置。