我最近开始研究使用 javacc 的语法分析器,其中一个字段是选项 one...我有如下代码:
options
{
LOOKAHEAD=1;
}
PARSER_BEGIN(Calculator)
public class Calculator
{
...
}
PARSER_END(Calculator)
LOOKAHEAD 选项到底是什么意思? 谢谢
最佳答案
JavaCC 创建递归下降解析器。这种类型的解析器通过查看下一个符号来决定选择哪个规则来工作。默认情况下,它只查看下一个交易品种 (lookahead=1)。但是您可以将解析器配置为不仅查看下一个,而且还查看下一个 N 个符号。如果将 lookahead 设置为 2,生成的解析器将查看接下来的两个符号来决定选择哪个规则。这样,您可以更自然地定义您的语法,但要以牺牲性能为代价。前瞻越大,解析器要做的事情就越多。
如果您将一般先行设置为更大的数字,您的解析器对于所有输入(对于非平凡语法)都会变慢。如果您想让解析器默认使用 lookahead=1 并仅在特定情况下使用更大的 lookahead,则可以在本地使用 lookahead。
http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc4.5
例如,lookahead=1 的解析器无法决定采用哪条规则(1 或 2),但 lookahead=2 的解析器可以:
void rule0() : {} {
<ID> rule1()
| <ID> rule2()
}
您可以更改语法的定义以获得相同的结果,但使用 lookahead=1:
void rule0() : {} {
<ID> ( rule1() | rule2() )
}
关于Javacc 解析器选项 LOOKAHEAD,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2302872/