如何使用多个规则在ANTLR4中创建AST?

时间:2017-04-27 13:20:02

标签: c# antlr antlr4 abstract-syntax-tree

我试图用ANTLR4构建AST。我已经按照Lucas Trzesniewski的回答:How to create AST with ANTLR4?了,它非常有帮助。 (我使用Sam Harwell" Antlr Language Support"在C#中写作。)

我的问题是我有3个规则,而不是一个' expr'在上面的链接中规则,我不知道如何将它们链接到一个AST构建器。要理解我的问题,这里是我的语法的简单版本(只有2条规则):

program
    : dcl stmt EOF
    ;

dcl
    : 'number' id=identifier  #numberDcl
    ;

stmt
    : id=identifier '=' expr  #assignStmt
    | IF expression ...       #conditionStmt
    ;

expr
    : left=expr op=('+' | '-') right=expr    #infixExpr
    ;

现在,我了解如何为' expr'构建AST构建器。和' dcl',但我不知道如何为程序'构建AST构建器,因此它能够访问规则(dcl和stmt),以及为' stmt'建立一个AST构建器,它链接到' expr'。

我的答案是让我的AST节点与Lucas Trzesniewski类似。我试图做的事情我将在下面的代码中解释:

internal class BuildAstDclVisitor : ParserBaseVisitor<DeclarationNode> {

    public override DeclarationNode VisitProgram...

    public override DeclarationNode VisitNumberDcl..
}

internal class BuildAstStmtVisitor : ParserBaseVisitor<StatementNode> {

    public override StatementNode VisitProgram...

    public override StatementNode VisitAssignStmt... //Unsure how link to an expression

}

internal class BuildAstExprVisitor : ParserBaseVisitor<ExpressionNode> {

    public override ExpressionNode VisitInfixExpr...

}

现在我的分配节点&#39;我有一个&#39; IdentifierNode&#39;和一个表达式节目&#39;而且我不知道如何设置我的表情符号&#39;从我的上下文以及最终有一个整体AST构建器。

我希望我已经清楚地描述了我的问题。我试图找到一个解决方案,但到目前为止,Lucas Trzesniewski的回答是最好的,但是当我有多个规则时,它并不能帮助我理解如何构建我的AST。

这是我的第一篇文章,希望我已经正确完成了所有事情,否则请随时教我如何使用StackOverflow:)

0 个答案:

没有答案