antlr4 + python: 调试令牌匹配
antlr4 + python: debug token match
我正在使用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>}
关于调试它有什么想法吗?
有没有办法调试令牌匹配过程?
正如我们在私人讨论中发现的那样,这个问题与语法中如何定义点标识符规则有关。 .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]
;
我正在使用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>}
关于调试它有什么想法吗?
有没有办法调试令牌匹配过程?
正如我们在私人讨论中发现的那样,这个问题与语法中如何定义点标识符规则有关。 .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]
;