Чем фаза синтаксического анализа в компиляторе отличается от механизма правил? - PullRequest
4 голосов
/ 06 мая 2010

Я плохо понимаю, как работают компиляторы (я имею в виду языки, грамматику, лексический анализ, анализ и т. Д.).Механизмы правил имеют различные правила и связанные действия, так же, как у вас есть правила в грамматиках, и вы можете связать действия с ними в инструментах генератора синтаксических анализаторов, таких как ANTLR.Поэтому я немного запутался в том, как провести различие между этими двумя.Кто-нибудь может дать более четкое, более формальное объяснение различий?

Спасибо, Абхинав.

1 Ответ

4 голосов
/ 06 мая 2010

Механизм правил имеет базу данных фактов и набор правил, которые могут проверять элементы базы данных, а также изменять, вставлять или удалять факты. Обычно база данных состоит из того, что составляет набор теговых структур (T V1 V2 ... Vn), каждая из которых имеет различные типы значений V_i. Правило часто является шаблоном, определяющим, что если некоторый набор экземпляров структуры имеет свойства [какое-то условие над значениями этих структур, это может быть конъюнктивным или дизъюнктивным], что одно или несколько значений одной из соответствующих структур изменяются, или согласованная структура удаляется, или вставляется новая структура с некоторым вычисленным набором значений. Действительно сложный механизм правил рассматривает правила как такие структуры и, следовательно, может также вставлять и удалять правила, но это довольно необычно. Механизм правил (эффективно, и это сложная часть) определяет, какой набор правил может совпадать в любой момент, выбирает одно и выполняет его многократно. Ценность этой идеи заключается в том, что можно иметь произвольное множество «фактов» (каждое из которых представлено теговой структурой), которые являются примерно независимыми, и набор правил, которые аналогичным образом независимы, и объединять их все вместе единым способом. Надежда состоит в том, что легко определить структуры, представляющие аспекты мира, и легче определить правила для управления ими. Это способ кодирования множества разрозненных знаний, и именно поэтому им нравятся «деловые» парни. (Идея исходит от мира ИИ).

Синтаксические анализаторы имеют две задачи, объединенные в одно действие: 1) решение, является ли входной поток текста (разбитый на маркеры языка) легальным экземпляром определенного языка программирования, и 2) если это так, создание структур данных компилятора (обычно деревья абстрактного синтаксиса и таблицы символов), которые представляют программу, чтобы остальная часть компилятора могла генерировать код. Люди, занимающиеся компиляцией, потратили около 50 лет, чтобы понять, как сделать это быстро, и использовать очень специализированные алгоритмы (например, генераторы синтаксического анализатора LALR с настраиваемыми действиями в соответствии с правилом грамматики), чтобы выполнить работу.

Можно было бы реализовать компилятор-компилятор с механизмом правил; вам потребуется тип данных, состоящий из потоков токенов и других типов данных, соответствующих узлам AST и элементам таблицы символов. Скорее всего, будет сложнее кодировать синтаксический анализатор и вряд ли приблизится к скорости компилятора, и поэтому никто не делает этого.

Вы не можете использовать парсер компилятора для реализации механизма правил, точка. Таким образом, механизм правил является строго более мощным.

...