Какой обход дерева даст мне правильный результат
У меня есть дерево разбора для моего компилятора, и мне было интересно, какой обход моего дерева разбора даст мне тот же порядок, в котором мой исходный код тестировался для генерации,
Я думаю, что это должен быть Предварительный заказ, но мне говорят, что это в порядке, может кто-то сказать мне, почему.
Кроме того, если я хочу узнать, что в моем парсере, когда было сделано какое-то объявление идентификаторов, (скажем, нетерминальный declaration
имеет производство для этого), чем какой порядок обхода я выберу. Предварительный заказ?
3 ответа
Вы хотите сделать обход в порядке. Если вы выполняете обход по порядку в этом AST, вы посещаете конструкции в порядке, в котором они написаны в источнике.
Кроме того, если я хочу выяснить, что в моем парсере, когда было сделано какое-то объявление идентификаторов (скажем, нетерминальное объявление имеет для этого производство), то какой порядок обхода я должен выбрать. Предварительный заказ?
Не совсем уверен, что вы имеете в виду здесь, но если вы имеете в виду нахождение местоположения (строки, символа или номера столбца), в котором объявлен символ, то эта информация должна быть сохранена с идентификатором узла AST, когда он был вставлен в дерево. Большинство парсеров отслеживают эту информацию при сопоставлении некоторого токена.
Однако было бы более эффективно хранить информацию о местоположении вместе с записью в таблице символов, а не обходить дерево всякий раз, когда вам это нужно.
Чтобы разобраться, вы разбираете что-то вроде:
x = a + b
предварительный заказ:
(=, (+, a, b))
и порядок
(x, =, (a, +, b))
право?
Я не уверен, что вы имеете в виду под "тем же самым порядком, в котором мой Исходный код был проверен для поколения", но я действительно предполагаю, что вы спрашиваете о порядке ваших выражений.
Если вы унаследовали атрибуты, вам может понадобиться обход по порядку.
Скажи, что вы хотите разобрать
int a;
и правило производства для этой декларации
Устав -> Идентификатор типа;
Тип -> int | плавать;
Итак, вы видите, вам нужно передать тип (int или float) в id (в данном случае, a). Передача этой информации может быть осуществлена путем обхода заказа.