我正在尝试为我们的自定义规则引擎编写语法,该引擎使用 ANTLR(用于解析)和 Pentaho Kettle(用于执行规则)
解析器的有效输入将是以下类型:
(<Attribute_name> <Relational_Operator> <Value>) AND/OR (<Attribute_name> <Relational_Operator> <Value>)
即 PERSON_PHONE = 123456789
这是我的语法:
grammar RuleGrammar;
options{
language=Java;
}
prog : condition;
condition
: LHSOPERAND RELATIONOPERATOR RHSOPERAND
;
LHSOPERAND
: STRINGVALUE
;
RHSOPERAND
: NUMBERVALUE |
STRINGVALUE
;
RELATIONOPERATOR
: '>' |
'=>' |
'<' |
'<=' |
'=' |
'<>'
;
fragment NUMBERVALUE
: '0'..'9'+
;
fragment STRINGVALUE
: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_')*
;
fragment LOGICALOPERATOR
: 'AND' |
'OR' |
'NOT'
;
我面临的问题是与字符串值进行比较,即 PERSON_NAME=1 将通过语法,但该值PERSON_NAME=BATMAN
不起作用。我正在使用 ANTLRWorks 并且在调试时PERSON_NAME=BATMAN
,我得到了MismatchTokenException
RHS 值。
谁能指导我哪里出错了?