Теория алгоритмов и формальных языков. Мелихов А.Н - 73 стр.

UptoLike

формального задания контекстных условий языка, затрудняет построение трансляторов.
Практически очень часто и те и другие задаются неформально, на естественном языке.
Структура транслятора зависит от уровня (типа) входного языка, а также от объема
памяти и типа ЭВМ. Наиболее часто для трансляции с языков высокого уровня
используются трансляторы компилирующего типа (или просто
компиляторы),
реализующие синтаксические методы трансляции.
Наиболее простые, так называемые однопросмотровые компиляторы
осуществляют следующие действия: лексический анализ, синтаксический анализ,
генерацию промежуточного кода, оптимизацию, семантический анализ, генерацию
объектного кода (машинной программы).
На этапе лексического анализа определеннык терминальные символы
группируются в так называемые лексемыцепочки терминальных символов языка, с
которыми связывают его лексическую
структуру. Лексемыэто пары, состоящие из двух
компонент, одна из которых определяет синтаксическую категорию, например
«константа», «идентификатор», а вторая- указатель, задающий информацию о лексеме.
Для любого языка число лексем конечно. Лексический анализатор анализирует цепочки
символов языка и выделяет в них лексемы, число которых в программе обычно очень
большое.
Особенностью
лексического анализа является то, что синтаксис лексем задается А-
грамматиками, а значит, для целей лексического анализа могут быть использованы
конечные автоматы. Поскольку число лексем в реальных программах велико, лексический
анализ, формально являясь частью синтаксического анализа, выносится в отдельный этап.
Это позволяет упростить последующий синтаксический анализ.
На этапе собственно синтаксического анализа
исследуется цепочка лексем,
устанавливается ее соответствие синтаксису языка, а такие проверяются контактные
условия языка. Синтаксис языков программирования можно задать с помощью КС-
грамматик, а значит, синтаксический анализ можно выполнить с помощью автоматов
(преобразователей) с магазинной памятью. Контестные условия (вместе с синтаксисом)
языка можно задать с помощью КС- грамматик. Однако при
этом получаются грамматики,
содержащие настолько много правил, что построить анализатор, приемлемый по
сложности, не удается. Поэтому наиболее перспективен путь построения грамматик,
являющихся расширением КС-грамматик и порождающих языки уже НС-языков, но шире
КС-языков. Правила вывода в таких грамматиках похожи на правила вывода в КС-
грамматиках, но их применение зависит
от того, какие правила были применены на
последующем шаге. Отметим, что для распознавания языков, порождаемых ими, можно
использовать слегка модифицированные анализаторы с КС-языков (то есть автоматы с
магазинной памятью), к числу действий которых добавляются операции по проверке КУ.
В результате синтаксического анализа мы имеем дерево вывода входной цепочки.
По
нему можно было бы с учетом смысла разобранной конструкции сформулировать
(сгенерировать) машинную программу, однако предварительно производится
оптимизация. Из практических соображений удобно использовать при этом некое
промежуточное представление программы.
Семантический анализ выявляет смысл компонент опознанной при синтаксическом
анализе конструкции и определяет способ ее исполнения.
На всех этих этапах компиляции широко
используются таблицы, подпрограмм и
применяются специальные методы их организации и работы с ними.
В принципе, возможно, создать компилятор, универсальный для целого класса
языков. Такой компилятор по формально заданным синтаксису и семантике языка при
неизменной своей структуре, не зависящей от исходного языка, формирует машинную
программу.
Компилятор состоит из трех блоков:
синтаксического заг крузчика, семантического
загрузчика и ядра. Взаимосвязь блоков показана на рис.4.1.