Javacc 解析器选项 LOOKAHEAD,Java

标签 java javacc

我最近开始研究使用 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/

相关文章:

c - javacc C 语法和 C "Bit fields";解析异常

JavaCC 初学者 - 如何使程序仅接受没有重复项的情况?

java - 为什么我的 JavaCC 解析器不解析小于 2 个字符的标记?

java - 在 .jj 文件中检测到左递归

java - Android 和 json 使用嵌套对象的 REST 服务中的 gson

java - 从查询中填充 Jtable

java - <mvc :resources> - Does it cache to memory? Spring 4.0.5

java - 为什么 HashMap get() 方法在修改插入的对象后返回 null?

parsing - 有没有一种方法可以强制JavaCC接受模糊的非LL(1)语法?

java - 接口(interface)/类/实现/扩展困惑