Antlr 不识别令牌

Antlr 不识别令牌,antlr,antlr4,Antlr,Antlr4,我最近将我的SQL解析器代码从paraboiled迁移到ANTLR,迁移非常顺利,但是当我的SQL包含and或or条件运算符时,我收到了这个错误消息。我正在分享示例语法,如果有任何帮助,将不胜感激 如果我试图解析这个示例sql,请从年龄为12、部门为15的员工中选择姓名、年龄、工资 我得到了第1:50行不匹配的输入和期望{,OPAND,OPOR} 然而,若我用下面的规则替换,那个么它就可以工作了,我正在尝试实现不区分大小写的解析 binaryConditionalExp:binaryExp| b

我最近将我的SQL解析器代码从paraboiled迁移到ANTLR,迁移非常顺利,但是当我的SQL包含and或or条件运算符时,我收到了这个错误消息。我正在分享示例语法,如果有任何帮助,将不胜感激

如果我试图解析这个示例sql,请从年龄为12、部门为15的员工中选择姓名、年龄、工资

我得到了第1:50行不匹配的输入和期望{,OPAND,OPOR}

然而,若我用下面的规则替换,那个么它就可以工作了,我正在尝试实现不区分大小写的解析

binaryConditionalExp:binaryExp| binaryConditionalExp CONDOPERATOR='AND'|'或'binaryConditionalExp| 二元parenexp

/**
 * Define a grammar called Hello
 */
grammar SQLParser;


@header
{
    package somu.parsers;   
}




prog  : sqlsyntax;         // match keyword hello followed by an identifier


sqlsyntax : (selectclause fromclause whereclause) | (selectclause fromclause ) ;
selectclause : 'SELECT' columnclause;

columnclause : columnName (',' columnName)*;

columnName : columnLiteral;
columnLiteral : ID | sqlsyntax;

fromclause : 'FROM' tableclause;
tableclause : (tableclausealiaswithas | tableclauseplainalias | tableclausenoalias);  
tableclausenoalias  : ID | ;
tableclausealiaswithas : ID 'as' ID;
tableclauseplainalias : ID ID;

whereclause : 'WHERE' binarystmt;

binarystmt : binaryConditionalExp;
binaryExp: columnName OPERATOR columnName; 
binaryparenExp: '(' binaryConditionalExp ')';
binaryConditionalExp:  binaryExp | 
                       binaryConditionalExp CONDOPERATOR=(OPAND | OPOR) binaryConditionalExp | 
                       binaryparenExp;



ID : [a-zA-Z0-9]+ ;             // match identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 
OPERATOR: [=><]+ ;
OPAND : A N D ;
OPOR : O R;

fragment DIGIT : [0-9];
fragment A : [aA];
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
fragment E : [eE];
fragment F : [fF];
fragment G : [gG];
fragment H : [hH];
fragment I : [iI];
fragment J : [jJ];
fragment K : [kK];
fragment L : [lL];
fragment M : [mM];
fragment N : [nN];
fragment O : [oO];
fragment P : [pP];
fragment Q : [qQ];
fragment R : [rR];
fragment S : [sS];
fragment T : [tT];
fragment U : [uU];
fragment V : [vV];
fragment W : [wW];
fragment X : [xX];
fragment Y : [yY];
fragment Z : [zZ];

由于规则的顺序,lexer将AND视为标识符,而不是关键字。如果将lexer规则部分更改为以下内容,则字符串和将正确标记为OPAND

// match RESERVED WORDS first
OPAND : A N D ;
OPOR : O R;

// match IDENTIFIERS etc.
ID : [a-zA-Z0-9]+ ;
WS : [ \t\r\n]+ -> skip ; 
OPERATOR: [=><]+ ;