【发布时间】:2014-06-08 08:10:44
【问题描述】:
我无法让 JavaCC 通过它们在语法中的位置来正确地消除标记的歧义。我有以下 JJTree 文件(我称之为bug.jjt):
options
{
LOOKAHEAD = 3;
CHOICE_AMBIGUITY_CHECK = 2;
OTHER_AMBIGUITY_CHECK = 1;
SANITY_CHECK = true;
FORCE_LA_CHECK = true;
}
PARSER_BEGIN(MyParser)
import java.util.*;
public class MyParser {
public static void main(String[] args) throws ParseException {
MyParser parser = new MyParser(new java.io.StringReader(args[0]));
SimpleNode root = parser.production();
root.dump("");
}
}
PARSER_END(MyParser)
SKIP:
{
" "
}
TOKEN:
{
<STATE: ("state")>
|<PROD_NAME: (["a"-"z"])+ >
}
SimpleNode production():
{}
{
(
<PROD_NAME>
<STATE>
<EOF>
)
{return jjtThis;}
}
使用以下代码生成解析器代码:
java -cp C:\path\to\javacc.jar jjtree bug.jjt
java -cp C:\path\to\javacc.jar javacc bug.jj
现在编译后,您可以从命令行运行 MyParser 并使用要解析的字符串作为参数。如果成功,它会打印production,如果失败,则会发出错误。
我尝试了两个简单的输入:foo state 和 state state。第一个解析,但第二个不解析,因为两个state 字符串都被标记为<STATE>。当我将LOOKAHEAD 设置为3 时,我希望它使用语法并看到一个字符串state 必须是<STATE> 而另一个必须是<PROD_NAME。然而,没有这样的运气。我尝试更改各种前瞻参数无济于事。我也无法使用标记器状态(您可以在其中定义不同状态下允许的不同标记),因为此示例是更复杂系统的一部分,可能会有很多此类歧义。
谁能告诉我如何在不使用标记器状态的情况下使 JavaCC 正确地消除这些标记的歧义?
【问题讨论】:
标签: java parsing tokenize javacc