Упреждающий просмотр JavaCC действует по-другому, не выбирая правильный метод для синтаксического анализа

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

person Pun3rs    schedule 10.07.2018    source источник
comment
После 75 вы нажимаете возврат. Это должно привести к возникновению ошибки TokenManagerError. Вы уверены, что ваша программа не выдавала никаких исключений?   -  person Theodore Norvell    schedule 13.07.2018


Ответы (1)


Попробуйте указать пробельные символы:

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

Кроме того, попробуйте указать, где ожидается <EOF>:

void go()
:
{}
{
(LOOKAHEAD(2) doub() | number())
<EOF>
}
person Maurice Perry    schedule 10.07.2018
comment
Хм, не работает, похоже парсер просто сразу входит в метод doub(). - person Pun3rs; 10.07.2018
comment
@ Pun3rs да, но при необходимости он отступит. - person Maurice Perry; 10.07.2018
comment
@ Pun3rs Кроме того, я считаю, что вы должны различать целые и двойные числа на лексическом уровне; то есть определить два токена, - person Maurice Perry; 10.07.2018
comment
Да, я это знаю, но я намеренно сделал это, чтобы изучить систему Lookahead. Так что в будущих случаях я могу внедрить систему Lookahead. - person Pun3rs; 10.07.2018