Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОГРАММНАЯ ИНЖЕНЕРИЯ.docx
Скачиваний:
115
Добавлен:
09.09.2018
Размер:
2.83 Mб
Скачать

2.9 Определение ll(k)- грамматики и принципы построения распознавателей для этой грамматики.

Одним из таких подклассов КС-грамматик являются так называемые LL(k)- грамматики. Это самый большой “естественный” класс левоанализируемых грамматик.

Грамматика обладает свойством LL(k) (называется LL(k)- грамматикой) для k>0, если на каждом шаге вывода для однозначноговыбора очередной альтернативы автомату с магазинной памятью необходимо знать один верхний символ стека и рассмотреть k символов

входной цепочки справа от положения считывающей головки.

Существуют LL(1), LL(2), LL(3), … грамматики. Все они в совокупности образуют класс LL-грамматик. В этом обозначении (LL) первая L означает, что входная цепочка считывается в направлении слева направо, а вторая L – что выполняется левосторонний разбор. Число k показывает, сколько символов справа от считывающей головки нужно

рассмотреть для однозначного выбора альтернативы.

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

Всякая LL(k)-грамматика для любого k>0 является однозначной.

В основе распознавателя LL(k)- грамматик лежит левосторонний разбор строки языка

Для построения распознавателей LL(k)-грамматик используются два

специальных множества, определяемых следующим образом:

Очевидно, что, если имеется цепочка терминальных символов α ∈ VT*,

то FIRST(k, α) – это первые k символов этой цепочки.

2.10-2.11 Трансляторы, компиляторы, интерпретаторы. Общие схемы и их отличия.

Транслятор (в пер. с англ. - "переводчик") – это программа, принимающая на вход программу на одном языке и преобразующая её в программу на другом языке.. Как видно из определения, в работе транслятора всегда участвуют три программы:

1. Сам транслятор является программой

2. Исходными данными для работы транслятора служит текст входной про- граммы – некоторая последовательность предложений входного языка программирования. Обычно это символьный файл, но этот файл должен содержать текст программы, удовлетворяющий синтаксическим и семантическим требованиям входного языка. Кроме того, этот файл несет в себе некоторый смысл, определяемый семантикой входного языка.

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

Важным требованием в определении транслятора является эквивалентность входной и выходной программ. Эквивалентность двух программ означает совпадение их смысла с точки зрения семантики входного языка (для исходной программы) и семантики выходного языка (для результирующей программы). Без выполнения этого требования сам транслятор теряет всякий практический смысл.

Если исходная программа содержит хотя бы одну ошибку, то результатом работы транслятора будет сообщение об ошибке (как правило, с дополнительными пояснениями и указанием места ошибки в исходной программе).

Компилятор – это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера. Таким образом, компилятор отличается от транслятора лишь тем, что его результирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера. Результирующая

программа транслятора же, в общем случае, может быть написана на любом языке – возможен, например, транслятор программ с языка Pascal на язык С.

Результирующая программа компилятора называется «объектной программой» или «объектным кодом». Файл, в который она записана, обычно называется «объектным файлом».

Интерпретатор – это программа, которая воспринимает входную программу на исходном языке и выполняет ее.

В отличие от трансляторов интерпретаторы не порождают результирующую программу (и вообще какого-либо результирующего кода) – и в этом принципиальная разница между ними. Интерпретатор, так же как и транслятор, анализирует текст исходной программы. Однако он не порождает результирующей программы, а сразу же выполняет исходную в соответствии с ее смыслом, заданным семантикой входного языка. И компиляторы и интерпретаторы преобразуют исходный код в машинный код, только разными путями. Интерпретатор читает исходный код программы и выполняет его. Преобразование исходного кода в бинарный и выполенение выполняется построчно. Вот схема работы интерпретаторов: [1]исходный код программы -> [2]интерпретатор -> [3]ОС -> [4]результат Компиляторы же, полностью переобразовывают исходный код программы в бинарный (а не построчно, как в случае с интрепретаторами), который ОС может выполнять самостоятельно. То есть, для запуска программы иметь компилятор нет необходимости. Вот схема работы компилятора: [1]исходный код программы -> [2]компилятор -> [3]объектный код -> [4]ОС -> [5]результат Как я уже говорил ранее, при использовании программы, 1-ый и 2-ой пункт этой схемы откидывается. Откомпилированные компилятором программы работают заметно быстрее, т.к. не требуется делать повторный анализ и преобразование исходного кода в код, понятный компьютеру.