ANTLR4变量类型和操作顺序
ANTLR4 variable types and order of operations
我有两个语法:
你好.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
给出
第二个语法的顺序正确,但允许 v+1
,这不应该起作用。
我理解为什么语法是这样工作的,但我无法将这两者结合起来,创建一个检查类型并具有正确操作顺序的语法。
无论我首先检查的是什么,我的问题是我必须从某个地方开始打破我第二做的事情。如何将这两个要求结合起来?
不允许将标量添加到向量是语义规则,而不是句法规则。解析器只能涵盖句法规则。您必须在解析后强制执行语义规则,例如在遍历生成的解析树的访问者中。
我有两个语法:
你好.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
给出
第二个语法的顺序正确,但允许 v+1
,这不应该起作用。
我理解为什么语法是这样工作的,但我无法将这两者结合起来,创建一个检查类型并具有正确操作顺序的语法。
无论我首先检查的是什么,我的问题是我必须从某个地方开始打破我第二做的事情。如何将这两个要求结合起来?
不允许将标量添加到向量是语义规则,而不是句法规则。解析器只能涵盖句法规则。您必须在解析后强制执行语义规则,例如在遍历生成的解析树的访问者中。