我正在使用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语句中使用的记录必须与循环中使用的记录相同。我怎么检查这个?
答案 0 :(得分:1)
您的访问者可以维护一堆变量定义(范围):
for_stmt
的访问方法将变量声明推送到堆栈(并在访问子节点后弹出它)set_stmt
的访问方法检查堆栈,如果无法在堆栈中找到访问的ID,则抛出运行时异常