ANTLR4:if语句的代码生成

问题描述:

如何在ANTLR4中为这样定义的“if”语句发出分支代码?ANTLR4:if语句的代码生成

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

基本上,它就像在我用作参考的Java.g4例子(见“陈述”和“表达”规则)。

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

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

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

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; 
}