使用冲突名称时,antlr4行1:10输入不匹配

使用冲突名称时,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

我正在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中的第一个规则。