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 语句。
但我的目标是能够执行 GOTO 和 Label 语句。
不幸的是,我找不到任何类似的 C++ 解决方案。
有人可以给我提示如何在 ANTLR 访问者中制作 GOTO 语句吗?
或者也许还有其他解决方案?
你可以通过两次遍历树来做到这一点。在第一遍中,收集与标签相对应的节点列表。在第二遍中,进行树上行走以解释语句。这个理想化的机器有一个 IP aka "instruction pointer" 作为语句树中的一个节点。大多数语句执行起来都很简单,改变变量的状态,下一个 IP 是下一个要执行的树节点。但是,当你访问一个goto语句时,你需要将IP调整为标签对应的新节点。除了这个理想化机器的 IP 寄存器之外,您还需要表示变量、数组和基本类型。您需要考虑如何为下一条语句找到树节点。不清楚您是否还想定义过程。如果是这样,您还需要一个调用堆栈。如果您打算将程序表示为字节码而不是解析树,那么您正在编写一个翻译器(也称为编译器)和一个虚拟机。因为它看起来像你的新手,而且它是一个小项目,我只建议你按原样解释这棵树。你会在第一学期的编译器课程中看到这个问题。
你建议在树中遍历两次是最简单也是最好的主意。在我的解析器中,我做的更多。每当我有 goto 语句时,我都会按照我的意愿多次穿过我的树。这可能会导致无限循环,但如果解析的程序编写得好,这是另一个问题。这不是最佳解决方案,但非常适合我的问题。非常感谢大家的帮助。
我正在为代码开发简单的解析器:
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 语句。 但我的目标是能够执行 GOTO 和 Label 语句。 不幸的是,我找不到任何类似的 C++ 解决方案。 有人可以给我提示如何在 ANTLR 访问者中制作 GOTO 语句吗? 或者也许还有其他解决方案?
你可以通过两次遍历树来做到这一点。在第一遍中,收集与标签相对应的节点列表。在第二遍中,进行树上行走以解释语句。这个理想化的机器有一个 IP aka "instruction pointer" 作为语句树中的一个节点。大多数语句执行起来都很简单,改变变量的状态,下一个 IP 是下一个要执行的树节点。但是,当你访问一个goto语句时,你需要将IP调整为标签对应的新节点。除了这个理想化机器的 IP 寄存器之外,您还需要表示变量、数组和基本类型。您需要考虑如何为下一条语句找到树节点。不清楚您是否还想定义过程。如果是这样,您还需要一个调用堆栈。如果您打算将程序表示为字节码而不是解析树,那么您正在编写一个翻译器(也称为编译器)和一个虚拟机。因为它看起来像你的新手,而且它是一个小项目,我只建议你按原样解释这棵树。你会在第一学期的编译器课程中看到这个问题。
你建议在树中遍历两次是最简单也是最好的主意。在我的解析器中,我做的更多。每当我有 goto 语句时,我都会按照我的意愿多次穿过我的树。这可能会导致无限循环,但如果解析的程序编写得好,这是另一个问题。这不是最佳解决方案,但非常适合我的问题。非常感谢大家的帮助。