ANTLR: Как изменить сгенерированный AST на основе правила, которое мы разбираем? - PullRequest
2 голосов
/ 11 июля 2020

Может ли ANTLR изменить AST в зависимости от условия, которое мы имеем во время синтаксического анализа?

Например, при синтаксическом анализе строки типа: foo (). DropLastBar (true) .bar () мы надеюсь отбросить последнее появление панели, если мы знаем, что существует dropLastBar (true).

Теперь я использовал «members» в ANTLR, чтобы записать, существует ли dropLastBar с истинным значением. Но я не знаю, как изменить правило ANTLR, чтобы сгенерированный AST отличался в зависимости от имеющейся у нас строки. Строка может быть foo (). DropLastBar (true) .bar (). Bar (). Bar (), тогда мы можем получить AST, сгенерированный foo (). DropLastBar (true) .bar (). bar () без двойного анализа?

1 Ответ

5 голосов
/ 11 июля 2020

Я думаю, вы здесь излишне усложняете. Парсер - это инструмент синтаксиса. Синтаксические анализаторы на основе ANTLR4 генерируют дерево синтаксического анализа ( не AST btw.), Которое представляет входные данные, полученные в соответствии с указанной грамматикой.

То, что вам нужно, это semanti c обработка , который не является задачей парсера и в любом случае не предназначен для этого. Вместо этого выполните шаг semanti c после выполнения синтаксического анализа, на котором вы обрабатываете дерево синтаксического анализа для извлечения необходимой информации. Попытка принудительно включить такую ​​обработку в грамматику / синтаксический анализатор не сработает (поскольку это замедлит синтаксический анализатор и сделает его более сложным).

...