ANTLR 4.7.1 日期操作的不匹配输入错误
ANTLR 4.7.1 mismatch input error for date operation
我正在尝试使用 ANTLR 语法添加日期操作,我想添加以下选项
variable(date) after(date operation) date(value check against)
我修改了语法并尝试测试以下字符串
"01012010" AFTER date(01012009)
我收到以下错误
line 1:5 mismatched input 'AFTER' expecting {<EOF>, AND, OR}
我还在学习使用 ANTLR,不知道为什么会出现这个错误?
语法文件有什么问题。
感谢帮助。
我正在使用的语法
grammar DateRule;
parse: expr EOF
;
expr
: expr binop expr #logicalExpression
| lhs=VARIABLE compop rhs=VARIABLE #variableExpression
| lhs=VARIABLE stringop rhs=STRING #stringExpression
| lhs=VARIABLE compop rhs=NUMBER #numberExpression
| lhs=DATEVARIABLE dateop rhs=DATESTR #dateExpression
| TRUE #booleanTrue
| FALSE #booleanFalse
| VARIABLE #booleanVariable
| LEFTPAREN expr RIGHTPAREN #enclosedExpression
;
binop : AND | OR
;
compop: EQUAL | LT | GT | LE | GE | NE
;
stringop: CONT | STARTSWITH | EQUAL | ENDSWITH
;
dateop : AFTER | BEFORE ;
TRUE: 'true' | 'TRUE' ;
FALSE: 'false' | 'FALSE';
STRING: '"' ~([\t\n\r]| '"')* '"'
;
LEFTPAREN: '(';
RIGHTPAREN: ')';
CONT : 'CONTAINS' | 'contains';
STARTSWITH: 'STARTSWITH' | 'startswith' | 'sw' | 'SW';
ENDSWITH: 'ENDSWITH' | 'endswith' ;
AFTER: 'AFTER' | 'after';
BEFORE: 'BEFORE' | 'before';
BETWEEN: 'BETWEEN' | 'between';
DATESTR: 'date''('[0-3][1-9][1-12][2][0][0-9][0-9]')';
EQUAL : '=' | 'EQ';
LT : '<' | 'LT';
GT : '>' | 'GT';
LE : '<=' | 'LE';
GE : '>=' | 'GE';
NE : '!=' | 'NE';
AND : 'AND' | '&' | 'and';
OR : 'OR' | 'or' | '|';
VARIABLE : [a-zA-Z]+[a-zA-Z0-9_.-]*;
NUMBER : [0-9]+ ('.'[0-9]+)?;
DATEVARIABLE :'"'[0-3][1-9][1-12][2][0][0-9][0-9]'"' ;
SPACE : [ \t\r\n] -> skip;
"01012010"
被标记为 STRING
,而不是 DATEVARIABLE
,因为 STRING
在词法分析器中首先出现。
您可以将 DATEVARIABLE
放在 STRING
上方:
DATEVARIABLE :'"'[0-3][1-9][1-12][2][0][0-9][0-9]'"' ;
STRING: '"' ~([\t\n\r]| '"')* '"';
因此 DATEVARIABLE
优先于 STRING
。
你还需要做这样的事情:
expr
: ...
| lhs=VARIABLE stringop rhs=string #stringExpression
| ...
;
string
: STRING
| DATEVARIABLE
;
我正在尝试使用 ANTLR 语法添加日期操作,我想添加以下选项
variable(date) after(date operation) date(value check against)
我修改了语法并尝试测试以下字符串
"01012010" AFTER date(01012009)
我收到以下错误
line 1:5 mismatched input 'AFTER' expecting {<EOF>, AND, OR}
我还在学习使用 ANTLR,不知道为什么会出现这个错误? 语法文件有什么问题。
感谢帮助。
我正在使用的语法
grammar DateRule;
parse: expr EOF
;
expr
: expr binop expr #logicalExpression
| lhs=VARIABLE compop rhs=VARIABLE #variableExpression
| lhs=VARIABLE stringop rhs=STRING #stringExpression
| lhs=VARIABLE compop rhs=NUMBER #numberExpression
| lhs=DATEVARIABLE dateop rhs=DATESTR #dateExpression
| TRUE #booleanTrue
| FALSE #booleanFalse
| VARIABLE #booleanVariable
| LEFTPAREN expr RIGHTPAREN #enclosedExpression
;
binop : AND | OR
;
compop: EQUAL | LT | GT | LE | GE | NE
;
stringop: CONT | STARTSWITH | EQUAL | ENDSWITH
;
dateop : AFTER | BEFORE ;
TRUE: 'true' | 'TRUE' ;
FALSE: 'false' | 'FALSE';
STRING: '"' ~([\t\n\r]| '"')* '"'
;
LEFTPAREN: '(';
RIGHTPAREN: ')';
CONT : 'CONTAINS' | 'contains';
STARTSWITH: 'STARTSWITH' | 'startswith' | 'sw' | 'SW';
ENDSWITH: 'ENDSWITH' | 'endswith' ;
AFTER: 'AFTER' | 'after';
BEFORE: 'BEFORE' | 'before';
BETWEEN: 'BETWEEN' | 'between';
DATESTR: 'date''('[0-3][1-9][1-12][2][0][0-9][0-9]')';
EQUAL : '=' | 'EQ';
LT : '<' | 'LT';
GT : '>' | 'GT';
LE : '<=' | 'LE';
GE : '>=' | 'GE';
NE : '!=' | 'NE';
AND : 'AND' | '&' | 'and';
OR : 'OR' | 'or' | '|';
VARIABLE : [a-zA-Z]+[a-zA-Z0-9_.-]*;
NUMBER : [0-9]+ ('.'[0-9]+)?;
DATEVARIABLE :'"'[0-3][1-9][1-12][2][0][0-9][0-9]'"' ;
SPACE : [ \t\r\n] -> skip;
"01012010"
被标记为 STRING
,而不是 DATEVARIABLE
,因为 STRING
在词法分析器中首先出现。
您可以将 DATEVARIABLE
放在 STRING
上方:
DATEVARIABLE :'"'[0-3][1-9][1-12][2][0][0-9][0-9]'"' ;
STRING: '"' ~([\t\n\r]| '"')* '"';
因此 DATEVARIABLE
优先于 STRING
。
你还需要做这样的事情:
expr
: ...
| lhs=VARIABLE stringop rhs=string #stringExpression
| ...
;
string
: STRING
| DATEVARIABLE
;