ANTLR GOTO语句

问题描述 投票:0回答:2

我正在研究用于代码的简单解析器:

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声明吗?也许还有另一种解决方案?

c++ label antlr goto
2个回答
0
投票

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


0
投票

您的建议两次穿过树是最简单也是最好的主意。在解析器中,我可以做更多的事情。每当我有goto语句时,我就会无数次地穿过树。这可能会导致无限循环,但这是否是解析程序编写得很好的又一个问题。这不是最佳解决方案,但对我的问题来说是完美的。非常感谢大家的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.