Как получить абстрактное синтаксическое дерево, используя конкретное синтаксическое дерево языка?

Как использовать конкретное синтаксическое дерево для анализа файла и создания абстрактного синтаксического дерева?

Я наткнулся на конкретные синтаксические деревья в этом сообщении блога о неграмме . Но я не могу осмыслить, как построить парсер.

1 ответ

Конкретное синтаксическое дерево - это просто представление исходного кода в древовидной форме без потерь. По сути, это надмножество абстрактного синтаксического дерева, поскольку оно содержит ту же информацию с относительной той же структурой, но с дополнительной «мелочью», которую абстрактное синтаксическое дерево отбрасывает.

Если вы знакомы с более традиционными формальными методами синтаксического анализа, вы, возможно, слышали, что это называется просто "дерево синтаксического анализа", которое будет выводиться генератором синтаксического анализатора, не основанным на действиях, который вы обычно затем обрабатываете в AST более податлив для более поздних передач компилятора.

CST ближе к AST в том смысле, что он обычно больше соответствует семантической структуре языка, чем лексической структуре, но в конечном итоге все они являются одной и той же базовой идеей структуры, просто представляя несколько разные представления анализируемого языка.

Итак, выполняете ли вы синтаксический анализ в формальном дереве синтаксического анализа, CST или непосредственно в AST (или даже в байт-коде IR), ничто из этого не имеет прямого влияния на то, какие методы синтаксического анализа вы используете, а только на то, какую структуру вы создаете, пока парсинг.

Итак, ваш вопрос сводится к вопросу мнения о том, «как мне анализировать исходный код», что является довольно открытым вопросом. Комбинаторы синтаксического анализатора, как правило, популярны в Rust, но даже простой рекурсивный спуск с фиксированным просмотром вперед довольно эффективен и прост в реализации.

Другие вопросы по тегам