我正在为代码编写简单的解析器:
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++找到任何类似的解决方案。有没有人能给我一个提示,如何使GOTO语句在反the访客?或者还有别的解决办法?
发布于 2020-02-04 18:20:37
你可以通过两次穿过树就可以做到这一点。在第一次传递时,收集与标签对应的节点列表。在第二次测试中,执行一次树遍历来解释语句。这个理想化的机器有一个IP,也就是在语句树中的一个节点的“指令指针”。大多数语句执行起来都很简单,可以改变变量的状态,下一个IP是要执行的下一个树节点。但是,当您访问goto语句时,需要将IP调整为与标签相对应的新节点。除了这台理想化机器的IP寄存器之外,您还需要表示变量、数组和基本类型。您需要考虑如何为下一个语句找到树节点。还不清楚您是否也想要定义过程。如果是这样,您还需要一个调用堆栈。如果您打算将程序表示为字节码(而不是解析树),则需要编写翻译器(又名编译器)和虚拟机。因为它看起来像你对这个新的,它是为一个小项目,我建议你解释树是原样。这个问题你会在第一学期的编译器课程中看到。
发布于 2020-02-05 11:55:40
你的建议,两次穿过树是最简单和最好的想法。在我的解析器中,我做的更多。我在树上走了很多次,每一次我都有要说的话。这可能会导致无限循环,但如果解析的程序编写得很好,这是另一个问题。这不是最好的解决办法,但对我的问题是完美的。非常感谢大家的帮助。
https://stackoverflow.com/questions/60057694
复制相似问题