это простой tree-walking интерпрететор в CPS стиле) с использованием байткода и виртуальной машины. Свой интерпретатор я изначально делал не правильно, сейчас он парсит s-выражения, а магические конструкции просто определены в глобальном окружении как макросы и все прекрасно работает. Но возникает проблема, если генерировать байткод, синтаксически вызов функции и макроса одинаковы, но байткод для них очевидно должен быть разный, т.к. при аргументы макроса не нужно исполнять. Как вообще такое решается на данном этапе, когда синтаксис одинаковый, но семантика зависит от окружения?
1. Парсим синтаксис, получаем AST 2. Анализируем AST, в частности и в особенности строим таблицу символов, по которой узнаём, кто функция, кто макрос, а кто просто переменная 3. Оптимизируем (опционально) 4. Генерируем нужный байт-код, глядя в таблицу символов чтобы узнать кто есть кто 5. ... 6. PROFIT!!!!111
А разве таблица символов не строится во время парсинга синтаксиса? Или не всегда?
Это что, если все объявления раньше использований? Откуда иначе информация об имени возьмётся?
А как использования относятся к построению таблицы символов? Кроме случая, когда есть вывод типов
Обсуждают сегодня