Какой обход дерева даст мне правильный результат - PullRequest
0 голосов
/ 23 марта 2012

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

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

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

Ответы [ 3 ]

1 голос
/ 23 марта 2012

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

 x = a + b

Предзаказ:

(=, (+, a, b))

и номер заказа

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

право

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

0 голосов
/ 23 марта 2012

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

скажем, вы хотите разобрать

int a;

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

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

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

0 голосов
/ 23 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...