Я новичок в 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>>