Хранит ли Таблица символов узлы AST (Декларация) или «Символы» - это разные объекты / классы? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть несколько вещей относительно отношения AST / Таблица символов, которые я не понимаю.

В настоящее время у меня есть AST, реализованный в C #, который имеет узлы для объявлений переменных (они содержат информацию об имени,тип, исходная позиция, возможное значение константы в качестве узла выражения и т. д.).

Теперь я хочу заполнить таблицу символов (используя шаблон посетителя на моем AST), но мой вопрос: являются ли "символы" новымиклассы, например, VariableSymbol или таблица символов непосредственно хранит VariableDeclarationNode из AST?

Если символы являются новыми классами, то кто будет хранить оцененное значение выражения для константных переменных, VariableDeclarationNode или VariableSymbol или где-то еще?

(я видел несколько примеров интерпретаторов, и они хранятвсе значения переменных, включая константы, в дополнительной хеш-таблице, но я работаю над компилятором источник-источник, а не интерпретатором, поэтому я не уверен, где вы храните вычисленные константы в этом случае. Извините, я знаю, что это несколько кратновопросы)

1 Ответ

0 голосов
/ 03 июня 2018

являются новыми классами «символов», например, VariableSymbol или таблица символов непосредственно хранит VariableDeclarationNode из AST?

Если информации в узле AST достаточно для задачитогда вы хорошо просто храните ссылки в области дерева / таблицы.если вы интерпретируете из синтаксического дерева вместо просто выдачи кода, то вам потребуются сложные структуры данных, где существование ссылки на исходные узлы AST является второстепенной задачей.Мы видели и сделали обе и обе работы.Не хранить ссылки на «примитивные» узлы AST на этапах, выходящих за рамки лексирования и синтаксического анализа, - более чистый подход.

[было бы] грязно хранить сохраненные значения констант (для особого случая) в символеклассы или я должен создать дополнительную таблицу для них?

Это тоже действительно зависит ... Если вы представляете постоянное значение как свойство, присущее объявлению, сохраните его в своем классе дескриптора символа:

class Symbol : ISymbol {
    ASTNode DeclaringNode;
    SymbolType RuntimeType;
    bool InitializeAsConstant;
    RuntimeValue ConstantValue;

    ...
}

Если вы сохраняете составляющие значения r, чтобы можно было дословно повторить объявление на целевом языке, то обрабатывайте их как переменную до конца процесса:

/* fantasy source language */
Constant $$IAMCONSTANT :=> /03\ MUL /02\ KTHXBYE

/* target language */
const int IAMCONSTANT = 3 * 2;

/* as opposed to compilation stage 1 precomputed */
const int IAMCONSTANT = 6;

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

...