ANTLR4:if语句的代码生成

时间:2014-09-03 07:14:48

标签: if-statement compiler-construction code-generation antlr antlr4

如何为ANTLR4中定义的“if”语句发出分支代码?

statement
    : // stuff
    | If LPar cond=expression RPar trueBlock=statement (Else falseBlock=statement)? # IfStatement
    ;

基本上,它就像我用作参考的Java.g4示例一样(参见“声明”和“表达式”规则)。

问题是我无法弄清楚如何在侦听器中为其发出分支代码,我试图避免在语法文件中添加任何{code}。例如,如果我EnterIfStatement,则发布分支为时尚早,因为尚未生成条件代码。当我ExitIfStatement时,为时已晚,因为已经创建了整个if块代码。 ANTLR4不会创建任何EnterTrueBlock事件或类似事件。

我想到了一些可能的解决方法,使用字典来记住上下文并在捕获相关表达式时生成跳转指令,但它感觉不自然。

1 个答案:

答案 0 :(得分:0)

今天我了解到访问者模式更适合编译任务。

public override string VisitIfStatement(MylangParser.IfStatementContext context)
{
    var hash = context.GetHashCode();
    Visit(context.cond);
    var elseLabel = "else" + hash;
    var endIfLabel = "end_if" + hash;
    emitter.Emit(OpCode.Jiz, elseLabel);
    if (context.trueBlock != null)
    {
        Visit(context.trueBlock);
    }
    emitter.Emit(OpCode.Jmp, endIfLabel);
    emitter.Mark(elseLabel);
    if (context.falseBlock != null)
    {
        Visit(context.falseBlock);
    }
    emitter.Mark(endIfLabel);
    return null;
}