Есть ли лучший способ проверить тип дочернего узла и вернуть его соответственно? - PullRequest
2 голосов
/ 05 мая 2020

Я работаю над развитием небольшого языка с использованием ANTLR. У меня есть готовый класс интерпретатора, который может распознавать и выполнять любое дерево синтаксиса этого языка. К сожалению, ANTLR создает деревья синтаксического анализа. Таким образом, я использую шаблон посетителя для преобразования дерева синтаксического анализа в дерево синтаксиса.

Учитывая следующее правило,

<Factor> = <Identifier> | <Literal>

visitFactor(FactorContext ctx) в моем класс посетителя должен возвращать литерал или идентификатор ....

 public Statement visitFactor(FactorContext ctx) {
        if (ctx.ID() != null)
            return new Identifier(ctx.ID().getText());
        else if (ctx.literal() != null)
            return visit(ctx.literal());
        return null; // should never happen, factor *must* be either id or literal.
    }

У меня следующий вопрос. Есть ли лучший способ узнать тип ребенка Фактора? Или мне нужно работать с операторами if, проверяя, является ли каждый дочерний элемент ненулевым?

1 Ответ

3 голосов
/ 05 мая 2020

Вы можете использовать альтернативные метки , например:

factor
 : ID      #factorID
 | literal #factorLiteral
 ;

, которые затем будут создавать следующие методы вместо одного visitFactor(...):

public Statement visitFactorID(FactorIDContext ctx) {
   return new Identifier(ctx.ID().getText());
}

public Statement visitFactorLiteral(FactorLiteralContext ctx) {
   return visit(ctx.literal());
}
...