ANTLR GOTO 语句

ANTLR GOTO statement

我正在为代码开发简单的解析器:

DEF Test( )

a = false
b = false
c = false

IF a THEN
  GOTO LabelA
ENDIF

IF b THEN
  GOTO LabelB
ENDIF

IF c THEN
  GOTO LabelC
ENDIF

GOTO LabelD

LabelA:
$OUT[1]=TRUE

LabelB:
$OUT[2]=TRUE

LabelC:
$OUT[3]=TRUE

LabelD:
$OUT[4]=TRUE

END

现在我可以编写访问者并评估 IF 语句。 但我的目标是能够执行 GOTOLabel 语句。 不幸的是,我找不到任何类似的 C++ 解决方案。 有人可以给我提示如何在 ANTLR 访问者中制作 GOTO 语句吗? 或者也许还有其他解决方案?

你可以通过两次遍历树来做到这一点。在第一遍中,收集与标签相对应的节点列表。在第二遍中,进行树上行走以解释语句。这个理想化的机器有一个 IP aka "instruction pointer" 作为语句树中的一个节点。大多数语句执行起来都很简单,改变变量的状态,下一个 IP 是下一个要执行的树节点。但是,当你访问一个goto语句时,你需要将IP调整为标签对应的新节点。除了这个理想化机器的 IP 寄存器之外,您还需要表示变量、数组和基本类型。您需要考虑如何为下一条语句找到树节点。不清楚您是否还想定义过程。如果是这样,您还需要一个调用堆栈。如果您打算将程序表示为字节码而不是解析树,那么您正在编写一个翻译器(也称为编译器)和一个虚拟机。因为它看起来像你的新手,而且它是一个小项目,我只建议你按原样解释这棵树。你会在第一学期的编译器课程中看到这个问题。

你建议在树中遍历两次是最简单也是最好的主意。在我的解析器中,我做的更多。每当我有 goto 语句时,我都会按照我的意愿多次穿过我的树。这可能会导致无限循环,但如果解析的程序编写得好,这是另一个问题。这不是最佳解决方案,但非常适合我的问题。非常感谢大家的帮助。