Какой обход дерева даст мне правильный результат

У меня есть дерево разбора для моего компилятора, и мне было интересно, какой обход моего дерева разбора даст мне тот же порядок, в котором мой исходный код тестировался для генерации,

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

Кроме того, если я хочу узнать, что в моем парсере, когда было сделано какое-то объявление идентификаторов, (скажем, нетерминальный declaration имеет производство для этого), чем какой порядок обхода я выберу. Предварительный заказ?

3 ответа

Решение

Вы хотите сделать обход в порядке. Если вы выполняете обход по порядку в этом AST, вы посещаете конструкции в порядке, в котором они написаны в источнике.

Кроме того, если я хочу выяснить, что в моем парсере, когда было сделано какое-то объявление идентификаторов (скажем, нетерминальное объявление имеет для этого производство), то какой порядок обхода я должен выбрать. Предварительный заказ?

Не совсем уверен, что вы имеете в виду здесь, но если вы имеете в виду нахождение местоположения (строки, символа или номера столбца), в котором объявлен символ, то эта информация должна быть сохранена с идентификатором узла AST, когда он был вставлен в дерево. Большинство парсеров отслеживают эту информацию при сопоставлении некоторого токена.

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

Чтобы разобраться, вы разбираете что-то вроде:

 x = a + b

предварительный заказ:

(=, (+, a, b))

и порядок

(x, =, (a, +, b))

право?

Я не уверен, что вы имеете в виду под "тем же самым порядком, в котором мой Исходный код был проверен для поколения", но я действительно предполагаю, что вы спрашиваете о порядке ваших выражений.

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

Скажи, что вы хотите разобрать

int a;

и правило производства для этой декларации

Устав -> Идентификатор типа;
Тип -> int | плавать;

Итак, вы видите, вам нужно передать тип (int или float) в id (в данном случае, a). Передача этой информации может быть осуществлена ​​путем обхода заказа.

Другие вопросы по тегам