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

C# 如何使用多个规则在ANTLR4中创建AST?,c#,antlr,antlr4,abstract-syntax-tree,C#,Antlr,Antlr4,Abstract Syntax Tree,我正在尝试用ANTLR4构建一个AST。我遵循了卢卡斯·特泽斯涅夫斯基的答案:,这对本很有帮助。(我使用Sam Harwell的“Antlr语言支持”用C#编写) 我的问题是我有3条规则,而不是上面链接中的一条“expr”规则,我不知道如何将它们链接到一个AST生成器中。为了理解我的问题,这里有一个简单的语法版本(只有两条规则): 现在我了解了如何为“expr”和“dcl”构建AST构建器,但我不知道如何为“program”构建AST构建器,因此它能够同时访问规则(dcl和stmt),以及为“s

我正在尝试用ANTLR4构建一个AST。我遵循了卢卡斯·特泽斯涅夫斯基的答案:,这对本很有帮助。(我使用Sam Harwell的“Antlr语言支持”用C#编写)

我的问题是我有3条规则,而不是上面链接中的一条“expr”规则,我不知道如何将它们链接到一个AST生成器中。为了理解我的问题,这里有一个简单的语法版本(只有两条规则):

现在我了解了如何为“expr”和“dcl”构建AST构建器,但我不知道如何为“program”构建AST构建器,因此它能够同时访问规则(dcl和stmt),以及为“stmt”构建链接到“expr”的AST构建器

我的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...

}
内部类BuildAstDclVisitor:ParserBaseVisitor{
公共覆盖声明节点访问程序。。。
public override DeclarationNode VisitNumber DCL。。
}
内部类BuildAstStmtVisitor:ParserBaseSevisitor{
公共覆盖语句节点访问程序。。。
public override语句node VisitAssignStmt…//不确定如何链接到表达式
}
内部类BuildAsExpvisitor:ParserBaseSevisitor{
公共重写表达式节点VisitInfixExpr。。。
}
现在在我的'AssignNode'中,我有一个'IdentifierNode'和一个'ExpressionNode',我不知道如何从我的上下文设置我的'ExpressionNode',最后还有一个整体AST生成器

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


这是我的第一篇帖子,希望我做的一切都正确,否则请随意教我如何使用StackOverflow:)

欢迎使用SO。你的问题非常好:-)(我可以向你保证,这是我第一次在这里就第一个问题这样说)。然而,我想知道你为什么要创建一个AST。为了计算表达式,您可以轻松地使用提供的解析树。事实上,AST较差,因为它们只显示匹配的输入(您已经可以从令牌流中获得此信息)。解析树要多得多,因为它们显示了解析过程的路径。我的建议是:现在远离ASTs。我正在学校学习一门课程,这门课程更多的是学习和理解你可以使用的技术,而不是“现实世界”中最实际的技术。欢迎来到SO。你的问题非常好:-)(我可以向你保证,这是我第一次在这里就第一个问题这样说)。然而,我想知道你为什么要创建一个AST。为了计算表达式,您可以轻松地使用提供的解析树。事实上,AST较差,因为它们只显示匹配的输入(您已经可以从令牌流中获得此信息)。解析树要多得多,因为它们显示了解析过程的路径。我的建议是:现在远离ASTs。我在学校学习一门课程,它更多的是学习和理解你可以使用的技术,而不是在“现实世界”中最实际的技术。
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...

}