ANTLR4变量类型和操作顺序

时间:2018-09-14 08:42:58

标签: antlr antlr4

我有两种语法:

Hello.g4:

grammar Hello;
start: exp? EOF;
exp: int_exp | vector_exp;
int_exp: int_exp '*' int_exp | int_exp '+' int_exp | INT;
vector_exp: vector_exp '*' int_exp | int_exp '*' vector_exp | 
            vector_exp '+' vector_exp | VECTOR;
INT  : ('0'..'9') | (('1'..'9')('0'..'9')+);
VECTOR: 'v';
WS  : [ \t\r\n]+ -> skip ;

Hello2.g4

grammar Hello2;
start: exp? EOF;
exp: add;
add: add '+' add | mult '+' add | add '+' mult | mult;
mult: mult '*' mult | INT '*' mult | mult '*' INT | INT | VECTOR;
INT  : ('0'..'9') | (('1'..'9')('0'..'9')+);
VECTOR: 'v';
WS  : [ \t\r\n]+ -> skip ;

第一个语法正确检查类型:将向量添加到标量v+1上无效。但是它没有正确的操作顺序。

1+1*v给出

wrong order

第二种语法具有正确的顺序,但允许v+1使用,该语法不起作用。

我了解为什么这样的语法,但是我无法将两者结合起来,无法创建一种检查类型并具有正确操作顺序的语法。

无论我首先检查哪种方法,我的问题是我必须从某个地方中断我第二次要做的事情。如何将这两个要求结合起来?

1 个答案:

答案 0 :(得分:0)

不允许将标量添加到向量是一种语义规则,而不是一种语法规则。解析器只能覆盖语法规则。您必须在解析后强制执行语义规则,例如在参观者中走过产生的分析树。