ANTLR AST tree - поиск конкретных узлов - PullRequest
3 голосов
/ 26 июня 2011

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

a) Напишите грамматику дерева со связанными действиями, чтобы пройти по дереву, чтобы отметить присутствие определенных узлов.Проблема в том, что мне нужно написать древовидную грамматику для каждого типа узла, который меня может заинтересовать в поиске

b) Проблемно пройти через CommonTree, рекурсивно получив дочерние элементы и проверив Token.Text, чтобы определить, является ли конкретныйтип узла обнаруженКакие утилиты доступны для этого?

Спасибо

Виджай

1 Ответ

2 голосов
/ 26 июня 2011

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

AFAIKнет доступных утилит для ручного «обхода» (небольшой части) дерева , и в этом нет особой необходимости, поскольку это тривиальная операция (псевдокод):

walk(Tree) {

  if Tree is null {
    return
  }

  inspect the Tree (node) type

  for every Child in Tree.getChildren() {
    walk(Child)
  }
}

EDIT

Подумав немного больше об этом, я вспомнил какую-то новую функцию, которая более или менее выполняет то, что вы хотите.Термин ANTLR, который вы ищете, - это «сопоставление с образцом дерева».

Цитата: «Вместо указания всей грамматики дерева средство сопоставления с образцом дерева позволяет нам сосредоточиться только на тех поддеревьях, которые нас интересуют.- http://www.antlr.org/wiki/display/ANTLR3/Tree+pattern+matching "

Имейте в виду, что для этого вам нужен ANTLR 3.2+.

...