Мне нужно ваше мнение, чтобы выбрать наилучшую альтернативу для выбора дерева синтаксического анализатора (ST) или для генерации абстрактного синтаксического дерева (AST). Это контекст:Абстрактное дерево против дерева парсеров
Я хочу проанализировать язык, подобный C (только подмножество C с некоторыми изменениями, чтобы сделать его более псевдокодированным), но не для того, чтобы перевести его на другой язык/файл вывода, но для выполнения своих предложений для анимации его выполнения (я использую Qt для рисования). Особенностью этого подмножества C является включение вложенных областей. Мое сомнение, связанное с моим избранием между ST и AST, возникает из таблицы символов. Общая идея (с использованием Boost.spirit):
- Анализ исходного кода с помощью пользовательского парсера Boost.spirit.
- Семантические действия создают дерево синтаксиса, только копию дерева синтаксиса исходного кода (а также копию внутреннего дерева синтаксиса Boost.spirit, но с моими собственными классами и структурами). Таким образом, нет АСТ.
- С помощью этой ST в руке программа считывает это синтаксическое дерево в направлении сверху вниз:
- Выполните первое предложение.
- Загрузите таблицу символов с новыми значениями (результатом предложения).
- Сохранение фактического состояния таблицы символов в стеке состояния программы.
- До 3.1 до полной обработки ST.
- Анимировать алгоритм чтения и рисования стека состояний программы.
Два рассуждения:
- Если я работаю с АСТ, я проиграл, после разбора, информацию о объявлении переменных, его типы и так далее. Таким образом, я должен работать с таблицей символов с помощью семантических действий синтаксического анализатора, усложняя запись и понимание парсера. Более того, я должен работать все время с таблицей символов со всеми переменными независимо от фактической области действия (если я нахожусь в области i, нужны только области i, i-1, ...., 1; not все области по всему алгоритму). Это тратит память.
- Мне нужно, только в стеке состояния программы, переменные фактической и предыдущей областей, чтобы не усложнять понятность алгоритма через анимацию. Если я работаю с ST, я должен удалить все символы, которые мне не нужны, прежде чем сохранять их в стеке. Это тратит время.
Статическую таблицу символов с областями управления сложнее разрабатывать и использовать, чем таблицу динамических символов. Таблица статических символов должна иметь идентификатор (например) для каждой области действия и связывать каждый узел дерева с каждым идентификатором. Динамическая таблица символов работает легче, потому что, если я нахожусь в сфере я, нужна только две «векторы» (возможно, двойную очередь и стека):
- Контейнер (двойная очередь?) С символами и его связанная информация: последняя переменная в контейнере является ближайшей объявленной переменной.
- Контейнер (стек) целых чисел, показывающий начало (индекс двойной очереди) каждой области.
Например, для области I:
- Контейнер 1: [xyzxabzfaz]
- Контейнер 2: [0 3 6 8]
Если я оставить объем я , только мне нужно удалить последнее целое число и символы из позиции 8 до конца. Дерево не изменено.
Должно к выполнению каждого предложения во время выполнения, ST облегчает мое выполнение.
Два вопроса:
- Что лучше тогда?
- Существуют ли какие-либо формы для извлечения внутреннего дерева Духа или его настройки, чтобы не копировать его?
Вы только что напомнили мне, что я потерял (почти), когда мне пришлось переехать на C#: | – quetzalcoatl
Это будет отдаленно ответственно, если бы у вас была грамматика и базовая реализация. Кроме того, что означает «Анимация чтения алгоритма и рисование стека состояний программы». У меня есть догадка, что описание уже предваряет конкретную реализацию. – sehe
Теперь я вижу «Не настоящий вопрос» (потому что нет конкретных требований, только свободные мысли) и «Слишком локализованные» (поскольку «подразумеваемые требования» (анимация (?), Конкретные концепции охвата) вряд ли будут быть актуальным для других в будущем. – sehe