JavaCC IntegerLiteral

Я использую JavaCC для создания лексера и парсера, и у меня есть следующий код:

TOKEN:
{
   < #DIGIT : [ "0"-"9" ] >
  |< INTEGER_LITERAL : (<DIGIT>)+ >
}


SimpleNode IntegerLiteral() :
{
  Token t;
}
{
(t=<INTEGER_LITERAL>)
{
    Integer n = new Integer(t.image);
    jjtThis.jjtSetValue( n );
    return jjtThis;
}
}

Следовательно, он должен принимать только целые числа, но он также принимает 4. или 4 %%%%%% и т. Д.


person user3505334    schedule 01.05.2014    source источник
comment
Если IntegerLiteral - начальный символ для вашего парсера, вам нужно добавить <EOF> после t=<INTEGER_LITERAL.   -  person Theodore Norvell    schedule 01.05.2014
comment
когда я добавляю ‹EOF›, он говорит, что ожидаемый EOF, и не принимает никаких других входных данных   -  person user3505334    schedule 05.05.2014
comment
Я думаю, вам нужно прояснить, какой язык вы хотите, чтобы ваш синтаксический анализатор распознавал. Пока мы знаем, что 4 есть в языке, а 4 и 4 %%% - нет. Также, что язык включает более (<DIGIT>)+. Это не так уж и много.   -  person Theodore Norvell    schedule 05.05.2014
comment
что ты имеешь в виду? целое число должно работать, хотя   -  person user3505334    schedule 05.05.2014
comment
Я имею в виду, что ваш вопрос непонятен, потому что вы не уточнили, какой именно набор строк необходимо принять. Перепишите вопрос, чтобы было понятнее, что следует, а что не следует принимать.   -  person Theodore Norvell    schedule 05.05.2014


Ответы (2)


Попробуйте включить отладку в файле спецификации парсера, например:

OPTIONS {
  DEBUG_TOKEN_MANAGER=true
}

Это создаст распечатку того, что делает TokenManager во время синтаксического анализа.

person Frank Endriss    schedule 28.01.2015

«4.» и "4 %%%%" на самом деле не принимаются, потому что то, что читает ваш синтаксический анализатор, всегда равно "4", если вы установите DEBUG_PARSER = true; в разделе OPTION вы увидите текущий прочитанный токен . Я думаю, если вы измените свою грамматику таким образом, вы увидите, что она выдает TokenMgrError, когда читает необработанный символ

    SimpleNode IntegerLiteral() :
    {
      Token t;
    }
    {
    (
        t=<DIGIT>
    {
        Integer n = new Integer(t.image);
        jjtThis.jjtSetValue( n );
        return jjtThis;
    })+
    }
person ps_messenger    schedule 17.08.2015