将侦听器与Antlr4一起使用:编译器如何知道如何处理变量左值而不是右值?



在我的语法中,变量以$开头,所以

$a = 10

有效。当然,以下声明也是如此:

$c = $a + $b

我的语法用这个(部分)定义处理变量;

start: (expr | stmt)* EOF ;
stmt
: lvalue=id EQUAL assignexpr=expr # AssignId
| declare EQUAL assignexpr=expr #DeclareAndAssign
| declare # DeclareVar
;
expr
: sign=(PLUS|MINUS) expr # signed_expr
| LPAREN expr RPAREN # paren_exp
| id # idval
| value #constval
| lvalue=expr op=(PLUS | MINUS | MULT |DIV) rvalue=expr # arith
;

到目前为止,当我在侦听器中遇到常量值时,我只需发出一个 ICONST(假设它是一个整数),它将值推送到堆栈。当我到达一个变量时,我会发出一个 ILOAD 来获取变量值并将其推送到堆栈 - 只要它在语句的右侧就可以了。

我遇到的问题是:当变量在左侧时.我不需要发出 ILOAD,因为该值将被覆盖,并且不会在任何时候从堆栈中弹出。因此,在代码中到达此变量后,我需要一种方法来知道它将如何使用。

我怎样才能知道如何$c处理这个变量?我是否需要更改语法以更具体地处理这种情况?我需要在树上走两次吗?人们通常如何对待一定是微不足道的常见病例?

正如您在评论中澄清的那样,您正在侦听ids,它被赋值和变量表达式使用。如果您改为侦听idvals,则只会获得用作表达式/右值的变量。

您可以直接在侦听器中将变量作为 lvalue 处理AssignId

最新更新