Есть ли способ собрать ноль или более шаблонов нескольких правил в один список в Antlr4? - PullRequest
1 голос
/ 19 января 2020

Возможно, это дублированный вопрос, но я не могу найти вопрос, который хочу прочитать, поэтому я написал здесь.

Я новичок ie из Antlr, и я пытаюсь использовать Antlr4 для сделать абстрактное синтаксическое дерево с шаблоном посетителя в Scala.

Однако я не могу придумать, как собрать результаты нескольких правил, как показано ниже, в один список.

foo: (rule0 | rule1)*
rule0: ...
rule1: ...

Я знаю есть способ получить каждый список (то есть список rule0 с и список rule1 с). Однако этот способ, вероятно, нарушает порядок появления (я хочу сохранить порядок). Способ, подобный rules=(rule0 | rule1)*, также недопустим, поэтому я не могу писать, как показано ниже

ctx.rules().asScala.map(...).toArray`

Мой вопрос заключается в том, как объединить в список несколько результатов правил, сохраняя порядок появления в шаблоне посетителя.

1 Ответ

1 голос
/ 20 января 2020

Посетитель - это просто ходок по дереву разбора, сгенерированному вашим прогоном разбора. Класс посетителя перебирает дочерние элементы каждого контекста синтаксического анализатора и вызывает функции посетителя. Это означает, что фактическая информация хранится в дереве разбора, и вы можете использовать ее напрямую.

Когда вы получаете итерацию FooContext для своего дочернего списка, который содержит найденные экземпляры Rule0Context и Rule1Context в порядок их использования в исходном коде. Это дает вам как позиционную информацию о деталях, так и информацию о каждой из частей.

...