Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа2 / Docs / KursovikOtchet00_.doc
Скачиваний:
27
Добавлен:
01.05.2014
Размер:
791.55 Кб
Скачать

Описание входного языка

Для описания синтаксиса входного языка используем модифицированные металингвистические формулы Бэкуса-Наура (БНФ), основанные на следующих упрощения :

  • необязательные элементы синтаксической конструкции заключаются в квадратные скобки [ и ]

  • альтернативные варианты могут быть в случае необходимости заключаться в квадратные скобки для образования многовариантного выбора

  • повторяющиеся ноль и более раз элементы синтаксической конструкции заключаются в фигурные скобки { и }

Также отметим следующее:

чтобы квадратные, фигурные скобки и различные знаки, являющиеся метасимволами, отличались от терминальных символов определяемого языка – квадратные, фигурные скобки и другие знаки последних записываем в кавычках (например, “]”). Зарезервированные слова определяемого языка записываем с использованием полужирного шрифта (например, program).

Структура программы и секции объявлений

Программы на входном языке может быть представлена в виде БНФ следующим образом:

<программа> ::= [program <идентификатор>;]

{ <описание констант> | <описание переменных> }

<структурный оператор>.

<описание констант> ::= const <идентификатор> = <выражение>;

{ <идентификатор> = <выражение>; }

<описание переменных> ::= var <идентификатор>: <тип>;

{<идентификатор>:<тип>; }

<тип> ::= <простой> | <структурированный>

<простой> ::= integer | real | boolean | char

<структурированный> ::= string | stack

Как следует из определения, программа может предваряться необязательным ключевым словом «program» за которым следует идентификатор и точка с запятой. Далее располагается произвольное количество секций объявлений переменных и констант, а затем – тело программы, завершённое точкой.

В рамках данной формы Бэкуса-Наура накладываются следующие семантические ограничения:

- все используемые идентификаторы должны быть уникальны;

- значения выражений в объявлениях констант должны быть вычислимы к моменту объявления константы. Значение, присвоенное константе в момент объявления, не может изменяться.

Используемые типы данных

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

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

Таблица 1

Тип

Представление

Диапазон значений

integer

2 байтами, ведущий бит - знаковый

-32768 до 32767

real

4 байтами, формат представления числа с плавающей точкой - IEEE

модуля: 1.5 . 10-45 до 3.4 . 1038

char

1 байтом без знака

0 до 255, может представлять символьный код ASCII

boolean

1 байтом без знака

0 до 255, причем значение 0 соответствует FALSE, остальные значения - TRUE

string

256 байтами

содержит строку формата ASCII с завершающим нулём (null-terminated string), таким образом, реальная длина хранимой строки не должна превышать 255 символов

stack

256 байтами

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

Замечание:

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

Представление операторов во входном языке

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

<оператор> ::= <пустой оператор>

| <оператор присваивания>

| <оператор ввода-вывода>

| <оператор стека>

| <оператор ветвления>

| <оператор цикла>

| <структурный оператор>

<оператор присваивания> ::= <идентификатор> := <выражение>

<оператор ввода-вывода> ::= write( <выражение> )

| read( <идентификатор> )

| writeln

<оператор стека> ::= push( <идентификатор>, <выражение> )

<оператор ветвления> ::= if <выражение> then <оператор>

[ else <оператор> ]

<оператор цикла> ::= for <оператор присваивания> to <выражение>

do <оператор>

<структурный оператор> ::= begin <оператор> {; <оператор>} end

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

- идентификаторы, используемые во всех операторах, должны быть предварительно объявлены в секциях объявления переменных или констант;

- идентификатор в левой части оператора присваивания должен соответствовать переменной;

- тип переменной в левой части оператора присваивания и тип выражения в правой части оператора присваивания должны быть совместимы;

- выражение в операторе вывода должно иметь символьный, строковый, целый, либо вещественный тип;

- идентификатор в операторе ввода должен соответствовать переменной;

- переменная в операторе ввода может иметь символьный, строковый, целый, либо вещественный тип;

- идентификатор в операторе стека должен соответствовать переменной, имеющей тип стека;

- выражение в операторе стека должно иметь символьный тип;

- выражение в операторе ветвления должно иметь булевский тип;

- все выражения в операторе цикла с параметром должны иметь целый тип;

- выражение в цикле с условием должно иметь булевский тип.

Представление выражений во входном языке

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

<выражение> ::= <выражение> or <дизъюнктор>

| <дизъюнктор>

<дизъюнктор> ::= <дизъюнктор> and <коньюнктор>

| <конъюнктор>

<конъюнктор> ::= <конъюнктор> <знак отношения> <отношение>

| <отношение>

<знак отношения> ::= = | > | >= | < | <= | <>

<отношение> ::= <отношение> <знак суммы> <слагаемое>

| <слагаемое>

<знак суммы> ::= + | -

<слагаемое> ::= <слагаемое> <знак произведения> <множитель>

| <множитель>

<знак произведения> ::= * | /

<множитель> ::= ( <выражение> )

| <знак суммы> <множитель>

| not <множитель>

| <атом выражения>

<атом выражения> ::= <литерал>

| <идентификатор>

| <функция стека>

<функция стека> ::= top( <идентификатор> )

При вычислении выражений важную роль играют типы операндов и операций. В таблице 2 описаны допустимые типы операндов для каждой из используемых операций:

Таблица 2

Операция

Описание

Логические операции

(or, and, not)

Операнды должны иметь булевский тип.

Возвращаемое значение имеет булевский тип.

Операции сравнения

(=, >, >=, <, <=, <>)

Операнды должны иметь целый, либо вещественный тип.

Возвращаемое значение имеет булевский тип

Арифметические операции

(+, -, *, /)

Операнды должны иметь целый, либо вещественный тип.

Возвращаемое значение имеет целый тип в случае, если все операнды целочисленные, и вещественный тип в противном случае.

При делении целых чисел результат всегда вещественный

Функция стека

(top)

Операнд должен иметь тип стека.

Возвращаемое значение имеет символьный тип.

В качестве элементарных операндов (атомов) выражений могут выступать:

- литералы (значения различных типов, явно указанные в тексте программы);

- идентификаторы, предварительно объявленные в секции объявления переменных, либо констант;

- функция стека, соответствующая значению на вершине стека, указанного в качестве параметра функции, - вызов функции не извлекает значение из стека. Он некорректен в случае, если количество элементов в стеке равно нулю

Ассоциативность и приоритет операций

В таблице 3 приведены все допустимые операции входного языка в порядке возрастания приоритета. Все операции в пределах одной группы имеют одинаковый приоритет и выполняются в порядке, определяемом их ассоциативностью (бинарные операции левоассоциативны, унарные операции правоассоциативны):

Таблица 3

Знак операции

Название операции

Порядок выполнения

*

/

Арифметические операции:

умножение

деление

Слева направо

Слева направо

+

-

Арифметические операции:

сложение

вычитание

Слева направо

Слева направо

not

Логическое отрицание

Слева направо

and

Логическое И (конъюнкция)

Слева направо

or

Логическое ИЛИ (дизъюнкция)

Слева направо

<

<=

>

>=

=

<>

Операции отношения:

меньше

меньше или равно

больше

больше или равно

равно

не равно

Слева направо

Слева направо

Слева направо

Слева направо

Слева направо

Слева направо

+, -

Определение знака

Справа налево

Замечание:

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

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