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]
;