Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
эл.лекции.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
6.74 Mб
Скачать

2.1.2.3. Программное моделирование конечных преобразователей

Известно несколько подходов к программному моделированию конечных автоматов и преобразователей. Медленный, но экономный с точки зрения расхода памяти способ заключается в том, что кодируется функция переходов соответствующего устройства и работа с ней реализуется в режиме интерпретации, так как лексический анализ составляет значительную долю процесса трансляции, такой метод часто оказывается слишком медленным, чтобы его можно было принять. Однако некоторые вычислительные машины имеют команды, распознающие те или иные виды лексем, и хотя этими командами нельзя промоделировать произвольный конечный автомат, они очень хорошо работают, когда лексемами служат ключевые слова или идентификаторы. Другой подход состоит в том, чтобы завести кусок программы для каждого состояния. В функции программы входит определение очередной буквы (для локализации буквы можно использовать подпрограмму), выдача требуемого выхода и переход к тому месту программы, которое соответствует следующему состоянию.

Важную проблему представляет выбор подходящего метода определения очередной буквы. Если для данного текущего состояния функция переходов такова, что большинство различных очередных букв приводят к различным следующим состояниям, то, по-видимому, нет ничего лучше, чем передавать управление косвенно через таблицу, основанную на очередной букве. Этот метод по скорости не уступает любому другому, но для него нужна таблица, объем которой пропорционален числу различных букв.

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

Пример :

Решение:

Для объединенного автомата из предыдущего примера дадим программную реализацию

Добавить программную реализацию в псевдокоде для конечных преобразователей в двух вариантах: 1) кодирование функций переходов; 2) завести кусок кода для каждого состояния

2.1.3. Синтаксический анализ

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

2.1.3.1. Определение разбора

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

К счастью, большинство компиляторов осуществляют разбор моделированием МП-автомата, анализирующего входные цепочки либо сверху вниз, либо снизу вверх. Известно, что способность МП-автомата проводить нисходящий анализ связана со способностью МП-преобразователя отображать входные цепочки в соответствующие левые выводы. Аналогично восходящий анализ связан с отображением входных цепочек в их обращенные правые выводы. Таким образом, мы будем трактовать проблему разбора как проблему отображения цепочек в их левые или правые выводы. Хотя известно много других стратегий разбора, мы будем опираться на эти две.

Определение: Пусть дана КС-грамматика и в этой грамматике правила пронумерованы целыми числами . Пусть . Тогда

  1. левым разбором цепочки называется последовательность правил, примененных при левом выводе цепочки из ;

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

Эти разборы можно представить в виде последовательности номеров из множества .

Пример :

Рассмотрим грамматику с такой нумерацией правил:

1.

2.

3.

4.

5.

6. .

Требуется построить левый и правый разбор цепочки .

Решение:

Левый разбор

.

Правый разбор

.