ANTLR: парсинг двузначных чисел, когда возможны и другие числовые литералы - PullRequest
1 голос
/ 20 мая 2009

Я пишу грамматику для языка среднего размера и пытаюсь реализовать временные литералы вида hh:mm:ss.

Однако всякий раз, когда я пытаюсь проанализировать, например, 12:34:56 как timeLiteral, я получаю несоответствующие токену исключения из цифр. Кто-нибудь знает, что я могу делать не так?

Вот соответствующие правила, определенные в настоящее время:

timeLiteral
    :   timePair COLON timePair COLON timePair -> ^(TIMELIT timePair*)
    ;

timePair
    :   DecimalDigit DecimalDigit
    ;

NumericLiteral
    : DecimalLiteral
    ;

fragment DecimalLiteral
    : DecimalDigit+ ('.' DecimalDigit+)?
    ;

fragment DecimalDigit
    : ('0'..'9')
    ;

1 Ответ

3 голосов
/ 20 мая 2009

Проблема в том, что лексер поглощает десятичную цифру и возвращает NumericLiteral.

Парсер никогда не увидит DecimalDigits, потому что это правило фрагмента.

Я бы порекомендовал переместить timeLiteral в лексер (с заглавной буквы). Так что у вас будет что-то вроде

timeLiteral
    :   TimeLiteral -> ^(TIMELIT TimeLiteral*)
    ;

number
    :   DecimalLiteral
    ;

TimeLiteral
    :   DecimalDigit DecimalDigit COLON 
        DecimalDigit DecimalDigit COLON
        DecimalDigit DecimalDigit
    ;

DecimalLiteral
    :   DecimalDigit+ ('.' DecimalDigit+)?
    ;

fragment DecimalDigit
    :   ('0'..'9')
    ;

Имейте в виду, что лексер и парсер полностью независимы. Лексер определяет, какие токены будут переданы парсеру, , а затем парсер получит их для группировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...