我有一个词法分析器为传递给词法分析器的宏字符串的动态列表创建 MACRO token 。我在最顶级的词法分析器规则中使用了语义谓词来实现此功能:
MACRO: { macros != null && tryMacro() }? .;
其中
tryMacro()
只检查是否有任何宏字符串与输入序列匹配。这种方法的性能非常糟糕,经过一些研究,我尝试将词法分析器规则更改为以下内容:
MACRO: . { macros != null && tryMacro() }?;
这大大提高了性能,但我真的不明白为什么。 :) 由于 '.'匹配任何字符,语义谓词规则应该像以前一样被调用多次,不是吗?有人可以为这种行为提供解释吗?
最佳答案
原因很简单:如果将谓词放在开头,词法分析器将对其进行评估以决定是否应应用 MACRO
规则。如果你把它放在最后,它只会在它与 MACRO
规则有潜在匹配时才执行检查。
由于 MACRO
非常通用,我想你把它放在规则的末尾,并且由于 priority rules 它肯定会最后尝试。它只能匹配单个字符标记,因此更精确的规则将被优先考虑。
如果 MACRO
规则被更优先的规则取代,则不会考虑它并且不会调用您的谓词。
关于antlr4 - 语义词法分析器谓词性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39493251/