我有一个词法分析器为传递给词法分析器的宏字符串的动态列表创建MACRO标记。我用了一个语义谓词在最高层的词法规则来实现此功能:语义词法分析器谓词性能
MACRO: { macros != null && tryMacro() }? .;
如有宏字符串输入序列匹配凡tryMacro()
只检查。
这种方法的表现很糟糕,一些研究后,我试图改变词法规则为以下内容:
MACRO: . { macros != null && tryMacro() }?;
这严重地提高性能,但我真的不明白为什么。 :)因为'。'匹配任何字符,语义谓词规则应该像以前一样被调用多次,不是吗?有人可以提供这种行为的解释吗?
这个问题是众所周知的。我在我的ANLTR4 C++目标博客文章中描述过:http://www.soft-gems.net/index.php/tools/49-the-antlr4-c-target-is-here。规则左侧的谓词可防止为其生成的DFA不被缓存,但会导致它们被一次又一次地评估。如果你有许多交易者,这是尤其糟糕的,例如许多关键字(词法分析器规则都是隐藏的根上下文的一种)。 –