У меня есть набор S
"маленьких" деревьев S[i]
, для которых мне нужно найти их позиции внутри большего , которые используются в качестве шаблонов для поиска соответствующих поддеревьев в большем дерево T
. Я знаю S
до того, как я начну создавать T
(который является деревом разбора), поэтому я подумываю о применении метода плоскости резки для сопоставления узлов по мере того, как я иду (так как парсер генерирует CST).
Деревья в S
- это не те же AST, что и T
- подумайте о XPath и XML - S
содержит древовидное представление XPath, тогда как T
- это фактическое AST исходного кода - Мне нужны карты между i
и вектором совпадающих узлов T
.
Однако я не уверен в названиях алгоритмов, которые бы использовал.
В принципе, я знаю, что я хочу сделать, это похоже на « разделяй и властвуй для деревьев» со стеком, в котором я держу возможных кандидатов для сопоставления, при каждом сдвиге парсера LALR я дублирую вершина стека и исключить кандидатов i
из S[i]
, которые в любом случае не будут совпадать, и после сокращения я выскользну из стека. В начале все члены от S
являются возможными кандидатами.
Обратите внимание : это как раз об AST, ASG - это другая история ...
Добавление
Здесь будет дерево разбора T
.
Функция синтаксического анализа будет знать список того, что я называю «древовидными путями», в канонической форме, также представленной в виде деревьев, хранящейся в S
. Но они не будут похожи на парсет, у них будет свой собственный язык, похожий на XPath.
Пример пути к дереву, чтобы получить все функции, которые имеют возвращаемое значение переменной:
function[body[return[expr[@type="variable"]]]]]
- Так что же мне искать в существующей литературе?
- Есть еще какие-нибудь советы?
- Уже есть языки, которые могут запрашивать мета-аннотированные деревья, как это? Библиотека с открытым исходным кодом C (не C ++) была бы идеальной.