【发布时间】:2018-12-17 21:58:05
【问题描述】:
我是 JavaCC 的新手,并且已经阅读了多个前瞻教程。然而,在一个简单的语法文件上测试前瞻时让我感到困惑。在这个语法文件中我只是做了两个解析规则,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));
}
}
在使用小数输入输入时使用此代码进行测试后,它可以工作,但是当使用整数输入时它不会并且它不会输出任何内容。这是调试输出:
Call: go
Call: doub(LOOKING AHEAD...)
75
Visited token: <<NUMBER>: "75" at line 1 column 1>; Expected token:<<NUMBER>>
【问题讨论】:
-
在 75 之后返回。这应该会导致 TokenManagerError 被抛出。你确定你的程序没有抛出任何异常吗?
标签: java parsing javacc lookahead