【问题标题】:ANTLR grammar: parser- and lexer literalsANTLR 语法:解析器和词法分析器文字
【发布时间】:2011-01-30 16:34:54
【问题描述】:
这个语法有什么区别:
...
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';
....
?
如果有任何差异,因为这会影响性能......
谢谢
【问题讨论】:
标签:
parsing
antlr
token
lexer
antlr3
【解决方案1】:
唯一的区别是在您的第一个生产规则中,关键字标记是隐式定义的。隐式定义和显式定义的标记对运行时性能没有影响。
【解决方案2】:
除了 Will 的回答之外,最好明确定义您的词法分析器标记(在您的词法分析器语法中)。如果您在解析器语法中混合它们,则词法分析器以什么顺序标记标记并不总是很清楚。在明确定义它们时,它们总是按照它们在词法分析器语法中的顺序(从上到下)进行标记化。
【解决方案3】:
最大的不同是对你来说可能无关紧要。如果您的 Lexer 规则在词法分析器中,那么您可以使用继承让多个词法分析器共享一组通用的词法规则。
如果您只是在解析器规则中使用字符串,那么您不能这样做。如果您从不打算重用您的词法分析器语法,那么这个优势就无关紧要了。
另外,我猜是大多数 Antlr 资深人士,更习惯于在实际的词法分析器语法中找到词法分析器规则,而不是与解析器语法混合,因此有人可能会争辩说,通过将规则放入其中可以提高可读性词法分析器。
Antlr 解析器针对任一方法构建后都不会影响运行时性能。
【解决方案4】:
还有另一个区别:当您明确定义词法分析器规则时,您可以通过您给它们的名称访问它们(例如,当您需要检查特定的令牌类型时)。否则 ANTLR 将使用任意数字(带前缀)。