如何检查我的赋值是否使用了正确的变量?

How do I check if my assignment is using the right variable?

我正在使用 ANTLR4 的访问者在 C# 中开发一个解释器。 在我的语法中,我有一个循环规则和一个赋值规则,如下所示:

for_stmt
: FOR  EACH  ID  IN  collection  DO NEWLINE+
         (block NEWLINE*)?
  END  FOR
;

set_stmt
:SET  ID '.' ID TO  arithExpr
;

block
: for_stmt
| set_stmt
;

在 for 循环中,我们可以设置这样的语句:

for each record in recordCollection do
    set record.name to 10
end for

set 语句中使用的 record 必须与循环中使用的 record 相同。我该如何检查?

您的访问者可以维护一堆变量定义(范围):

  • for_stmt 的访问方法将变量声明压入堆栈(并在访问子节点后将其弹出)
  • set_stmt 的访问方法检查堆栈,如果在堆栈上找不到访问的 ID,则抛出运行时异常