antlr4 + python: соответствие токена отладки

Я использую цель antlr4 + python, чтобы подобрать фразу вроде этой

select 1 from dual where id=.0union select 1

Токены являются:

['select', '1', 'from', 'dual', 'where', 'id', '=', '.0union', 'select', '1']

Моя проблема в том, .0 а также union токен был объединен в один токен, иначе .0unionи antlr сообщает об ошибке, подобной этой,

line 1:32 mismatched input '=' expecting {<EOF>, '&&', <INVALID>, ';', <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>, <INVALID>}

Есть идеи по его устранению?

Есть ли способ отладки процесса сопоставления токенов?

1 ответ

Решение

Как мы выяснили в частном обсуждении, эта проблема связана с тем, как правило грамматики точек определяется в грамматике. Существует конфликт между входом, как .0union а также .union, Первая должна рассматриваться как десятичное число и ключевое слово, а вторая форма должна быть взята целиком и помечена как точка-идентификатор. Таким образом, решение состоит в том, чтобы не допустить использование цифр после точки в идентификаторе точки (которое всегда должно быть разрешено до десятичной дроби):

FLOAT_NUMBER: DECIMAL_NUMBER [eE] (MINUS_OPERATOR | PLUS_OPERATOR)? DIGITS;
DECIMAL_NUMBER: DIGITS? DOT_SYMBOL DIGITS;

// Special rule that should also match all keywords if they are directly preceded by a dot.
// Hence it's defined before all keywords.
DOT_IDENTIFIER: DOT_SYMBOL LETTER_WHEN_UNQUOTED_NO_DIGIT LETTER_WHEN_UNQUOTED*;

fragment LETTER_WHEN_UNQUOTED:
    DIGIT
    | LETTER_WHEN_UNQUOTED_NO_DIGIT
;

fragment LETTER_WHEN_UNQUOTED_NO_DIGIT:
    [a-zA-Z_$\u0080-\uffff]
;
Другие вопросы по тегам