варианты и с хэш таблицами и с деревьями и со стеком. Symtable если что для scheme. И ещё вопрос, я правильно понимаю, что нужно создавать ее отдельным проходом по аст, а не во время парсинга?
Зависит от языка. Есть языки где парсинг от таблицы символов зависит, например все семейство Си-подобных языков
Ну меня как я сказал сейчас интересует схема
Для учебного интерпретатора — любую, хоть список пар. Берите стандартный BTreeMap или HashMap.
а в каких не зависит?
в js например не зависит
А в не учебном что использовалось бы?
Впрочем, если Вы спрашиваете про Symtable для реализации Environment, то нужно будет реализовать корректный name shadowing, т.е. всё равно стек в той или иной форме.
Просто хочется ознакомиться с best practice, не вижу в этом ничего плохого
Брать структуры данных из стандартной библиотеки — best of the best practices. 👍
А что насчёт момента создания symtable? В моем примере
Начните с простого — хэш таблицы, если с ней возникнут проблемы то будет понятно в какую сторону ее доработать или на что лучше заменить
Я уже понял, ее и возьму, нужно только разобраться с затенением
организуйте из них стек
Из хэш таблиц? Как говорится все гениальное просто..
ну да, когда входите в новый скоуп — пушите очередную таблицу в ваш стек, когда выходите — попаете. Поиск — сверху вниз (от текущего скоупа до корневого)
Только что насчёт этого, мне лично больше симпатичен второй вариант(отдельный проход по аст), но с другой стороны при парсинге это тоже не так трудно сделать, так как будет лучше? P.S. scheme (r7rs)
Я бы сначала сделал отдельно, если окажется что оно достаточно органично объединяется и в этом есть какой-то смысл (например код станет проще) то смержите
Тут ловушка есть (ну или соблазн). До генерации эти таблицы дожить должны в большинстве случаев, не будет выталкивания здесь, кмк. А потому стек может быть не очень уместен. Но это сильно зависит от стратегии обработки скоупов.
Оставьте человеку хоть что-то на самому подумать :)
Вообще, напишите как-нибудь, а потом за учебники засядете, станет и проще, и интереснее
Он пишет интерпретатор. 😊
А можно пример, где окружение нужно при кодогененрации? Или вы про область видимости C/C++?
Вложенные циклы с именованными метками, вложенные функции, если правильно помню, требовали живых таблиц имен на генерации.
Вынос переменной цикла, генерация условий и т.д. Довольно много вообще требовало наличия и скоупов, и имён
Понятно, что ключами хранить идентификаторы, но какие метаданные хранить нужно в значении? Я видел пример игрушечного интерпретатора на расте, там хранили значение при инициализации, но мне кажется это не то, да и схема не статически типизируемая, чтобы хранить тип, не будет ли достаточно просто вектора при анализе?
Не понял вопроса... Тип в Схеме — часть значения, там будет в духе Fixnum(1234). Так что хранить нужно только значения, не знаю кому какая метаинформация и зачем нужна...
Обсуждают сегодня