我的语法如下:
bRules: bRule ( NL bRule )*;
bRule: IF WS lhs WS THEN WS rhs;
lhs: condition (WS AND WS condition)*;
rhs: result (WS AND WS result)*;
condition: parameter WS operator WS value ;
result: parameter WS EQ WS value ;
parameter: STRING;
value: STRING;
IF: 'if';
THEN: 'then';
AND: '&';
NL : [\n\r]*;
WS: [ ]*;
operator: GT|LT|GE|LE|EQ;
GT: '>';
LT: '<';
GE: '>=';
LE: '<=';
EQ: '=';
STRING: [0-9a-zA-Z]+;
我的目标是制定如下规则:
IF age < 2 THEN status = baby
...
大多数情况下都可以使用,但是不起作用的是我可以在条件端使用equals运算符'=',如下所示:
IF age = 2 THEN status = baby
然后我收到一条错误消息,指出不支持该运算符。
我尝试了一些不同的操作,但无法正常工作。关于如何改善我的语法有什么想法或建议吗?
答案 0 :(得分:2)
请注意,您说的输入是IF ...
,但是词法分析器仅处理小写的if
。并且有2个词法器规则匹配零个字符,这是错误的。
更改:
NL : [\n\r]*;
WS: [ ]*;
进入:
NL : [\n\r]+;
WS: [ ]+;
除此之外,我无法复制您所描述的内容。当我使用您发布的语法解析if age = 2 then status = baby
时,会得到以下解析树:
此外,简单地skip
而不是在解析器规则中乱扔它们是否更方便?像这样的东西:
bRules: bRule (NL bRule )* EOF;
bRule: IF lhs THEN rhs;
lhs: condition (AND condition)*;
rhs: result (AND result)*;
condition: parameter operator value ;
result: parameter EQ value ;
...
WS: [ \t]+ -> skip;