首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javacc解析器选项LOOKAHEAD,Java

Javacc解析器选项LOOKAHEAD,Java
EN

Stack Overflow用户
提问于 2010-02-21 00:46:25
回答 3查看 9.3K关注 0票数 9

我最近开始使用javacc来使用语法分析器,其中一个字段是options…我有一个类似如下的代码:

代码语言:javascript
复制
options
{
  LOOKAHEAD=1;
}
PARSER_BEGIN(Calculator)

public class Calculator
{
 ...
}
PARSER_END(Calculator)

先行选项到底是什么意思?谢谢

EN

回答 3

Stack Overflow用户

发布于 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可以:

代码语言:javascript
复制
void rule0() : {} { 
  <ID> rule1() 
| <ID> rule2()
}

您可以更改语法的定义以获得相同的结果,但使用lookahead=1:

代码语言:javascript
复制
void rule0() : {} { 
  <ID> ( rule1() | rule2() )
}
票数 8
EN

Stack Overflow用户

发布于 2010-02-21 00:57:06

请参阅http://en.wikipedia.org/wiki/Lookahead#Lookahead_in_parsing

通常,解析器只查看下一个令牌来确定要应用的产生式规则。然而,在某些情况下,这还不足以做出选择。例如,给定两个产生式规则:

代码语言:javascript
复制
p0: foo -> identifier "=" expr
p1: bar -> identifier "(" arglist ")"

如果下一个令牌的类型是identifier,那么解析器就无法确定它应该使用foo还是bar产品。然后JavaCC会给出一个错误,说它需要使用更多的前瞻。将look-ahead更改为2意味着允许解析器查看下两个标记,在本例中,这足以在两个结果之间进行选择。

正如Steve所指出的,这在javacc文档中:https://javacc.org/tutorials/lookahead

票数 7
EN

Stack Overflow用户

发布于 2010-02-21 00:59:13

LOOKAHEAD值告诉生成的解析器使用多少未处理(即未来)的令牌来决定转换到哪种状态。在严格约束的语言中,只需要一个先行标记。语言越模棱两可,就需要越多的前视标记来确定要进行哪个状态转换。

我认为这在javacc(1)教程中已经介绍过了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2302872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档