Как создать пользовательский AST с помощью посетителя в Antlr - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу использовать шаблон посетителя, чтобы пройти ParserRuleContext и построить AST, используя предопределенные узлы.

В моей грамматике у меня есть следующее правило:

expr
    : loop
    | block

Я хотел бысоздайте AST, который имеет следующую структуру:

    exprNode
      / 
loopNode

Сгенерированный Antlr BaseVisitor имеет следующий метод:

public T visitExpr(MyParser.ExprContext ctx) { return visitChildren(ctx); }

ASTBuilder переопределяет этот метод и создаетexprNode.К этому exprNode я хочу добавить либо loopNode, либо blockNode, вызвав мои измененные версии visitLoop и visitBlock.У меня проблема в том, что я не знаю личность expr, поскольку я только получил exprContext от родителя.Как проверить, какой вызов правила expr использовался?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Обозначение правила alts предоставляет удобные контексты для определения идентичности:

expr
    : loop   #loopExpr
    | block  #blockExpr
    ;

Сгенерированный синтаксический анализатор теперь будет содержать LoopExprContext extends ExprContext и BlockExprContext extends ExprContext классы с подходящими для поведения методами входа и выхода посетителя.

0 голосов
/ 10 февраля 2019

Не переопределять visitExpr.Просто переопределите visitLoop и visitBlock.

Автоматически сгенерированный visitExpr вызовет соответствующий из этих двух (через visitChildren) и вернет все, что вернуло visitLoop или visitBlock.Поэтому, пока вы переопределяете эти методы для получения правильного результата, visitExpr также будет возвращать правильный результат автоматически.

...