JavaCC lookahead的行为不同,没有选择正确的方法进行解析

JavaCC lookahead的行为不同,没有选择正确的方法进行解析,java,parsing,javacc,lookahead,Java,Parsing,Javacc,Lookahead,我是JavaCC新手,已经阅读了多篇前瞻性教程。然而,当在一个简单的语法文件上测试lookahead时,我感到困惑。在这个语法文件中,我刚刚创建了两个解析规则,1->double,2->integers 如果输入符合上下文,程序应该选择其中一个 options { STATIC =false; debug_parser = true; debug_lookahead = true; } PARSER_BEGIN(testin) public class testin { p

我是JavaCC新手,已经阅读了多篇前瞻性教程。然而,当在一个简单的语法文件上测试lookahead时,我感到困惑。在这个语法文件中,我刚刚创建了两个解析规则,1->double,2->integers

如果输入符合上下文,程序应该选择其中一个

options
{
  STATIC =false;
  debug_parser = true;
  debug_lookahead = true;
}

PARSER_BEGIN(testin)
public class testin
{
    public void parse() throws ParseException
    {
        testin b = new testin(System.in);
        b.go();
    }
}
PARSER_END(testin)

TOKEN:
{
//testing lookahead
<NUMBER : (["0"-"9"])+>|
<DOT : ".">
}


void go()
:
{}
{

LOOKAHEAD(2) doub() | number()
}

void doub()
:
{
Token bool;
}
{
bool = <NUMBER><DOT><NUMBER>
{
    System.out.println(Double.parseDouble(bool.image));
}
} 

void number()
:
{
Token mo;
}
{
mo = <NUMBER>
{
    System.out.println(Integer.parseInt(mo.image));
}
} 
选项
{
静态=假;
debug_parser=true;
debug_lookahead=true;
}
解析器_BEGIN(testin)
公共类测试
{
public void parse()引发ParseException
{
testin b=新的testin(System.in);
b、 go();
}
}
解析器_端(testin)
代币:
{
//测试前瞻
|
}
void go()
:
{}
{
前瞻(2)doub()| number()
}
void doub()
:
{
代币布尔;
}
{
布尔=
{
System.out.println(Double.parseDouble(bool.image));
}
} 
空号()
:
{
代币mo;
}
{
mo=
{
System.out.println(Integer.parseInt(mo.image));
}
} 
当使用小数输入时,使用此代码进行测试后,它可以工作,但使用整数输入时,它不会工作,也不会输出任何内容。以下是调试输出:

Call:   go
Call:   doub(LOOKING AHEAD...)
75
   Visited token: <<NUMBER>: "75" at line 1 column 1>; Expected token:<<NUMBER>>
呼叫:开始
电话:doub(展望未来…)
75
访问令牌:;预期令牌:

尝试指定空白字符:

SKIP : {
    < " " | "\t" | "\r" | "\n" >
}
跳过:{
<“”|“\t”|“\r”|“\n”>
}
此外,请尝试指定
的预期位置:

void go()
:
{}
{
(LOOKAHEAD(2) doub() | number())
<EOF>
}
void go()
:
{}
{
(前瞻(2)doub()| number())
}

Umm,不起作用,似乎解析器只是立即进入doub()方法。@Pun3rs是的,但它会在必要时回溯。@Pun3rs另外,我认为您应该在词汇级别区分整数和双精度;i、 定义两个标记,是的,我知道,但我故意这么做是为了学习前瞻系统。因此,在未来的情况下,我可以实现前瞻系统。75年后,你点击返回。这将导致抛出TokenManagerError。你确定你的程序没有抛出任何异常吗?