JavaCC前瞻行为不同,未选择正确的方法进行解析

时间:2018-07-10 06:44:39

标签: java parsing javacc lookahead

我是JavaCC的新手,并且阅读了多个前瞻教程。但是,当在一个简单的语法文件上测试前瞻时,我感到困惑。在此语法文件中,我仅制定了两个解析规则,即1->双重,2->整数。

如果输入适合上下文,则程序应从中选择。

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));
}
} 

使用此代码测试后,使用十进制输入时,输入有效,但是使用整数输入时,则无效,并且不输出任何内容。这是调试输出:

Call:   go
Call:   doub(LOOKING AHEAD...)
75
   Visited token: <<NUMBER>: "75" at line 1 column 1>; Expected token:<<NUMBER>>

1 个答案:

答案 0 :(得分:0)

尝试指定空格字符:

SKIP : {
    < " " | "\t" | "\r" | "\n" >
}

还要尝试指定<EOF>的位置:

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