antlr4等于/分配模棱两可

时间:2019-03-29 08:14:53

标签: antlr4

我的语法如下:

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

然后我收到一条错误消息,指出不支持该运算符。

我尝试了一些不同的操作,但无法正常工作。关于如何改善我的语法有什么想法或建议吗?

1 个答案:

答案 0 :(得分:2)

请注意,您说的输入是IF ...,但是词法分析器仅处理小写的if。并且有2个词法器规则匹配零个字符,这是错误的。

更改:

NL : [\n\r]*;
WS: [ ]*;

进入:

NL : [\n\r]+;
WS: [ ]+;

除此之外,我无法复制您所描述的内容。当我使用您发布的语法解析if age = 2 then status = baby时,会得到以下解析树:

enter image description here

此外,简单地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;