Мне нужно ваше мнение, чтобы выбрать лучшую альтернативу между выбором: генерировать дерево синтаксического анализатора (ST) или генерировать абстрактное синтаксическое дерево (AST). Это контекст:
Я хочу проанализировать такой язык, как C (просто подмножество C с некоторыми изменениями, чтобы сделать его более ориентированным на псевдокод), но не для того, чтобы перевести его на другой выходной язык / файл, а чтобы выполнить его предложения для анимации процесса его выполнения. (Я использую Qt для рисования). Особенностью этого подмножества C является включение вложенных областей. Мое сомнение в отношении моего выбора между ST и AST вытекает из таблицы символов. Общая идея (используя Boost.spirit):
Два рассуждения:
Статическую таблицу символов с областями управления сложнее спроектировать и использовать, чем динамическую таблицу символов. Таблица статических символов должна иметь идентификатор (например) для каждой области и связывать каждый узел дерева с каждым идентификатором. Динамическая таблица символов работает проще, потому что, если я нахожусь в области действия i, нужны только два «вектора» (возможно, двойная очередь и стек):
Например, для области я:
Если я покину область действия i, только я должен стереть последнее целое число и символы с позиции 8 до конца. Дерево остается неизменным.
Из-за того, что я должен выполнять каждое предложение во время исполнения, ST облегчает мое исполнение.
Два вопроса:
Я думаю, что вы ищете абстрактный семантический граф (ASG), который представляет семантика (в отличие от синтаксиса) программы. Что вы можете сделать, это:
Кроме того, я бы сказал, что вы Можно действительно построить AST, который не тоже Аннотация; например, в настоящее время я создаю свой собственный интерпретатор языка сценариев, и AST будет содержать имена переменных (это полезно для отладки синтаксического анализатора / интерпретатора и самой анализируемой программы).
Других решений пока нет …