9

这个语法有什么区别:

...
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';
....

?

如果有任何区别,因为这会影响性能......谢谢

4

4 回答 4

9

除了 Will 的回答之外,最好明确定义您的词法分析器标记(在您的词法分析器语法中)。如果您在解析器语法中混合它们,则词法分析器以什么顺序标记标记并不总是很清楚。当明确定义它们时,它们总是按照它们在词法分析器中的顺序(从上到下)进行标记。

于 2010-03-23T07:37:04.420 回答
2

最大的区别是对您来说可能无关紧要的区别。如果您的词法分析器规则在词法分析器中,那么您可以使用继承让多个词法分析器共享一组通用的词法规则。

如果您只是在解析器规则中使用字符串,那么您不能这样做。如果您从不打算重用您的词法分析器语法,那么这个优势就无关紧要了。

此外,我猜大多数 Antlr 资深人士更习惯于在实际的词法分析器语法中找到词法分析器规则,而不是与解析器语法混合,因此有人可能会认为通过将规则放入词法分析器可以提高可读性。

在 Antlr 解析器针对任一方法构建后,都不会影响运行时性能。

于 2010-03-24T19:43:42.853 回答
1

唯一的区别是在您的第一个生产规则中,关键字标记是隐式定义的。对于隐式定义和显式定义的令牌没有运行时性能影响。

于 2010-03-23T07:29:37.727 回答
0

还有一个区别:当您明确定义词法分析器规则时,您可以通过您给它们的名称访问它们(例如,当您需要检查特定的令牌类型时)。否则 ANTLR 将使用任意数字(带有前缀)。

于 2015-09-21T09:12:44.970 回答