как и в названии, я недавно начал работать с парсером / интерпретатором в c ++ с другом, который позже будет интегрирован в более крупный проект (если он будет работать);мы решили начать создавать классы, которые мы будем использовать для абстрактного синтаксического дерева, и позже мы будем работать над соответствующей стороной синтаксического анализатора.Мы начали с понятий области и переменной.Выполнив некоторый поиск, мы нашли пример, в котором каждая область имеет таблицу символов и ссылку на предыдущую область, поэтому, если переменная не найдена в текущей области, она будет выглядеть в верхней и так далее.Первое, на что я должен был обратить внимание в этом примере, это то, что попытка получить доступ к переменной, которая имеет много областей действия в стеке или даже не существует, будет иметь высокую стоимость (в худшем случае сценарий достигает глубины стека).Я был как ... нет, мы можем добиться большего успеха.
Результатом нашего мышления было следующее: таблица символов в корне программы, состоящая из отображения строк в стек переменных
map<string, stack<variable>> table;
тогда каждая область будет содержать набор строк, которые будут теми, которые выделены в этой области
set<string> allocated;
Когда переменная "a" размещена, добавляется строка ее именив этот локальный набор областей действия, то новая переменная помещается в таблицу e (таблица ["a"]. push ()).Чтобы получить доступ к этой переменной для редактирования или чтения, нужно выполнить чтение верхней части той же позиции (таблица ["a"]. Top ()) И, наконец, деструктор области действия будет циклически перебирать все расположенные элементы и извлекать их из стеков карты.
for(variable_name in allocated)
{
table[variable_name].pop();
}
Этот способ будет делать выделение, чтение и запись O (1) в любом случае.Вот два моих вопроса:
1) Нужно ли сохранять строки для каждой переменной как в таблице, так и в области видимости, вместе с необходимостью проходить через все из них в конце области видимости, неэффективно, по сравнениюк системе с множеством таблиц, которая должна была бы просто удалить массив?
2) Пример, который я нашел, был не очень эффективным, потому что он был очень уроком для начинающих, или есть кое-что, что яне хватает того, что делает его более ценным, чем идея, предложенная мной и моим другом?