这个语法有什么区别:
...
if_statement : 'if' condition 'then' statement 'else' statement 'end_if';
...
和此:
...
if_statement : IF condition THEN statement ELSE statement END_IF;
...
IF : 'if';
THEN: 'then';
ELSE: 'else';
END_IF: 'end_if';
....
?
如果有任何差异,因为这会影响表现...... 感谢
答案 0 :(得分:8)
除了Will的答案之外,最好明确定义词法分析器标记(在词法分析器语法中)。如果你在解析器语法中混合使用它们,那么词法分析器将令牌标记为什么顺序并不总是很清楚。在明确定义它们时,它们总是按照它们被放入词法分析器语法的顺序(从上到下)进行标记。
答案 1 :(得分:2)
最大的区别是对你而言无关紧要。如果您的词汇表规则在词法分析器中,那么您可以使用继承来让多个词法分享器共享一组常用的词法规则。
如果您只是在解析器规则中使用字符串,那么您就无法执行此操作。如果您从未计划重复使用词法分析器语法,则此优势无关紧要。
另外,我猜测大多数Antlr老手,更习惯于在实际词法分析器语法中找到词法分析器规则,而不是与解析器语法混合使用,因此有人可能认为通过将规则放入可用性来提高可读性词法分析器。
在将Antlr解析器构建到任一方法之后,没有运行时性能影响。
答案 2 :(得分:1)
唯一的区别是,在第一个生产规则中,关键字标记是隐式定义的。隐式和明确定义的令牌没有运行时性能影响。
答案 3 :(得分:0)
另一个区别是:当您明确定义词法规则时,您可以通过您提供的名称访问它们(例如,当您需要检查特定的令牌类型时)。否则ANTLR将使用任意数字(带前缀)。