我有一个词法分析器为传递给词法分析器的宏字符串的动态列表创建 MACRO 标记。我在最顶层的词法分析器规则中使用了语义谓词来实现此功能:
MACRO: { macros != null && tryMacro() }? .;
Where tryMacro()
只是检查是否有任何宏字符串与输入序列匹配。
这种方法的性能非常糟糕,经过一些研究,我尝试将词法分析器规则更改为以下内容:
MACRO: . { macros != null && tryMacro() }?;
这极大地提高了性能,但我不太明白为什么。 :) 由于'.'匹配任何字符,语义谓词规则应该被调用与以前一样多的次数,不是吗?有人可以解释这种行为吗?
原因很简单:如果将谓词放在开头,词法分析器将对其进行评估以决定是否MACRO
规则应适用。如果你把它放在最后,它只会在有潜在匹配项时才执行检查MACRO
rule.
Since MACRO
is very通用的,我想你把它放在规则的末尾,并且由于优先规则 https://stackoverflow.com/a/46267981/3764814肯定会被尝试的last。它只能匹配单个字符标记,因此更精确的规则将是优先考虑的。
If the MACRO
规则被更优先的规则取代,它不会被考虑,并且您的谓词也不会被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)