我试图用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:)