使用冲突名称时,antlr4行1:10输入不匹配
我正在sql语法中使用限制标记。它工作得很好,但是当我使用与令牌名相同的列名时,我就遇到了问题。我有一个与使用冲突名称时,antlr4行1:10输入不匹配,antlr4,Antlr4,我正在sql语法中使用限制标记。它工作得很好,但是当我使用与令牌名相同的列名时,我就遇到了问题。我有一个与limit相同的列名。我如何解决这个问题 输出: line 1:10 mismatched input 'limit' expecting VAL line 1:10 mismatched input 'limit' expecting VAL 输入: select a, limit from abc limit 55 ; 语法: grammar SQLCmd; parse : sql
limit
相同的列名。我如何解决这个问题
输出:
line 1:10 mismatched input 'limit' expecting VAL
line 1:10 mismatched input 'limit' expecting VAL
输入:
select a, limit from abc limit 55 ;
语法:
grammar SQLCmd;
parse : sql
;
sql : ('select' ((columns (',' columns)*)|count) 'from')
tables
('where' condition ((and|or) condition)*)* (limit)? ';'
;
num : NUM
;
count : 'count(*)'
;
columns : VAL
;
limit : 'limit' num
;
tables : VAL
;
condition : ( left '=' right )+
;
and : 'and'
;
or : 'or'
;
left : VAL
;
right : VAL
;
NUM : [0-9]+
;
VAL : [*a-z0-9A-Z~?]+
;
WS : [ \t\n\r]+ -> skip
;
您必须展开
列
规则以允许限制
:
columns
: VAL
| 'limit'
;
@user3536913令牌只能有一种类型,并且lexer在解析器之前运行。由于相同的输入文本
limit
同时匹配'limit'
和VAL
,因此将根据首先出现的规则为其分配类型。隐式定义的规则(作为在解析器规则中使用文本的结果)始终是lexer中的第一个规则。