我最近开始使用javacc来使用语法分析器,其中一个字段是options…我有一个类似如下的代码:
options
{
LOOKAHEAD=1;
}
PARSER_BEGIN(Calculator)
public class Calculator
{
...
}
PARSER_END(Calculator)先行选项到底是什么意思?谢谢
发布于 2010-02-21 00:59:32
JavaCC创建递归下降解析器。这种类型的解析器通过查看下一个符号来决定选择哪个规则。默认情况下,它只查看下一个符号(lookahead=1)。但您可以配置解析器,使其不仅查看下一个符号,而且还查看下N个符号。如果将lookahead设置为2,则生成的解析器将查看下两个符号,以决定选择哪个规则。这样,您可以更自然地定义语法,但代价是性能。前视越大,解析器需要做的事情就越多。
如果你将一般的前视设置为一个更大的数字,你的解析器对于所有的输入都会变慢(对于非平凡的语法)。如果您想让解析器在默认情况下使用lookahead=1,并仅在特定情况下使用更大的先行,则可以在本地使用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() )
}发布于 2010-02-21 00:57:06
请参阅http://en.wikipedia.org/wiki/Lookahead#Lookahead_in_parsing
通常,解析器只查看下一个令牌来确定要应用的产生式规则。然而,在某些情况下,这还不足以做出选择。例如,给定两个产生式规则:
p0: foo -> identifier "=" expr
p1: bar -> identifier "(" arglist ")"如果下一个令牌的类型是identifier,那么解析器就无法确定它应该使用foo还是bar产品。然后JavaCC会给出一个错误,说它需要使用更多的前瞻。将look-ahead更改为2意味着允许解析器查看下两个标记,在本例中,这足以在两个结果之间进行选择。
正如Steve所指出的,这在javacc文档中:https://javacc.org/tutorials/lookahead
发布于 2010-02-21 00:59:13
LOOKAHEAD值告诉生成的解析器使用多少未处理(即未来)的令牌来决定转换到哪种状态。在严格约束的语言中,只需要一个先行标记。语言越模棱两可,就需要越多的前视标记来确定要进行哪个状态转换。
我认为这在javacc(1)教程中已经介绍过了。
https://stackoverflow.com/questions/2302872
复制相似问题