Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GOSy / ГОСы / шп I.doc
Скачиваний:
56
Добавлен:
21.05.2015
Размер:
2.32 Mб
Скачать

Грамматика языков программирования

Описанию грамматики языка предшествует описание его алфавита. Алфавит любого языка состоит из фиксированного набора символов, однозначно трактуемых. Алфавит языков программирования, как правило, связан с литерами клавиатуры печатной машинки. Клавиатуры персональных компьютеров близки к ним по наличию литер.

Алфавиты большинства языков программирования близки друг другу и основываются на буквах латинского алфавита, арабских цифрах и общепринятых спецсимволах, таких как знаки препинания, математических операций, сравнений и обозначений. Большинство популярных языков программирования в своем алфавите содержат следующие элементы:

<буква> : : = AaBbCcDdEeFfи т.д.

<цифра> ::=0123456789

<знак арифметической операции >::=*/+-

<разделитель> ::=.,;:()[]{}':=

<служебное слово> :: = begin end if then else for next и т.д.

<спецсимвол> :: = <знак арифметической операции> | <разделитель> |

<служебное слово>

<основной символ>::=<буква> | <цифра> | <спецсимвол>

<комментарий>::=<любая последовательность символов>

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

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

Большая часть операторов ведет обработку величин. Величинымогут быть постоянными и переменными.Значения постоянных величин не изменяются в ходе выполнения программы. Величина характеризуется типом, именем и значением. Наиболее распространенные типы величин - числовые (целые и вещественные), символьные, логические. Тип величины определяется ее значением.

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

Важнейшие характеристики структурированной величины таковы: упорядоченность(да или нет),однородность(да или нет),способ доступак элементам,фиксированность числа элементов(да или нет). Так, массив является упорядоченной однородной структурой с прямым доступом к элементам и фиксированным их количеством.

Всем программным объектам в языках даются индивидуальные имена.Имя программного объекта называютидентификатором(от слова «идентифицировать»). Чаще всего идентификатором является любая конечная последовательность букв к цифр, начинающаяся с буквы.

Упомянуть функции, процедуры, модули

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

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

  • Q — конечное множество состоянийавтомата;

  • q0начальное состояниеавтомата ();

  • F — множество заключительных(илидопускающих) состояний, таких что;

  • Σ — допустимый входной алфавит(конечное множество допустимых входных символов), из которого формируются строки, считываемые автоматом;

  • δ — заданное отображение множества во множествоподмножеств Q:

(иногда δ называют функцией переходов автомата).

Автомат начинает работу в состоянии q0, считывая по одному символу входной строки. Считанный символ переводит автомат в новое состояние из Q в соответствии с функцией переходов. Если по завершении считывания входного слова (цепочки символов) автомат оказывается в одном из допускающих состояний, то слово «принимается» автоматом. В этом случае говорят, что оно принадлежит языку данного автомата. В противном случае слово «отвергается».

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

Конечные автоматы подразделяются на детерминированные и недетерминированные.

Детерминированный конечный автомат

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

  • Недетерминированный конечный автомат (НКА) является обобщением детерминированного.

Существует теорема, гласящая, что «Любой недетерминированный конечный автомат может быть преобразован в детерминированный так, чтобы их языки совпадали» (такие автоматы называются эквивалентными). Однако, поскольку количество состояний в эквивалентном ДКА в худшем случае растёт экспоненциально с ростом количества состояний исходного НКА, на практике подобная детерминизация не всегда возможна.

Автомат с магазинной памятьюявляется расширением абстракцииконечных автоматов.

В отличие от конечных автоматов, автомат с магазинной памятью является набором:

Где K — конечное множество состояний автомата, — единственно допустимое начальное состояние автомата,— множество конечных состояний, причём допустимо F=Ø, и F=K, Σ — допустимый входной алфавит, из которого формируются строки, считываемые автоматом, S — алфавит памяти (магазина),— нулевой символ памяти. Память работает какстек, то есть для чтения доступен последний записанный в неё элемент. Таким образом, функция перехода является отображением. То есть, по комбинации текущего состояния, входного символа и символа на вершине магазина автомат выбирает следующее состояние и, возможно, символ для записи в магазин. В случае, когда в правой части автоматного правила присутствует ε, в магазин ничего не добавляется, а элемент с вершины стирается. Если магазин пуст, то срабатывают правила с ε в левой части.

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

Генерация кода

Задача генератора кода - построение для программы на входном языке эквивалентной машинной программы. Обычно в качестве входа для генератора кода служит некоторое промежуточное представление программы.

Генерация кода включает ряд специфических, относительно независимых подзадач: распределение памяти (в частности, распределение регистров), выбор команд, генерацию объектного (или загрузочного) модуля. Конечно, независимость этих подзадач относительна: например, при выборе команд нельзя не учитывать схему распределения памяти, и, наоборот, схема распределения памяти (регистров, в частности) ведет к генерации той или иной последовательности команд. Однако удобно и практично эти задачи все же разделять, обращая при этом внимание на их взаимодействие.

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

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

Соседние файлы в папке ГОСы