- •Задание
- •Описание языка
- •Описания и типы
- •Способы описания собственных типов:
- •Описание констант:
- •Описание переменных:
- •Имена и выражения Выражения:
- •Переменные:
- •Операторы
- •Оператор присваивания
- •Структуры данных
- •Подграмматика для выражения:
- •Подграмматика для описания типов:
- •Подграмматика для переменных:
- •Подграмматика для операторов:
- •Описание промежуточного языка
- •Описание перевода (таг) каждой конструкции входного языка Основная грамматика:
- •Подграмматика для выражения:
- •Подграмматика для описания типов:
- •Подграмматика для переменных:
- •Подграмматика для операторов:
Переменные:
<переменная> ::= [(<имя типа>)] <переменная старого типа>
<переменная старого типа> ::= <имя переменной> | <индексированная переменная> | <обозначение поля>
При указании имени типа происходит явное преобразование типа значения переменной, в этом случае тип должен быть ранее определен. Неявное преобразование типов происходит в операторе ввода. Явное преобразование типов возможно для предопределенных типов в следующих случаях:
из \ в |
integer |
real |
complex |
boolean |
integer |
+ |
+ |
+ |
+ |
real |
- |
+ |
- |
- |
complex |
- |
- |
+ |
- |
boolean |
+ |
+ |
+ |
+ |
<имя переменной> ::= идентификатор
Указанный идентификатор должен соответствовать имени определенной ранее переменной.
<индексированная переменная> ::= <переменная-массив> [<индекс>{,<индекс>}]
<переменная-массив> ::= <переменная>
Переменная должна соответствовать определенному ранее массивному типу.
<индекс> ::= <арифметическое выражение>
Арифметическое выражение должно соответствовать типу, приводимому к типу integer.
<обозначение поля> ::= <переменная-запись>.<имя поля>
<имя поля> ::= идентификатор
<переменная-запись> ::= <переменная>
Переменная должна соответствовать определенному ранее записному типу.
Операторы
Операторы объединяются в раздел операторов:
<раздел операторов> ::= <составной оператор>
Перед оператором допускается метка, на которую можно ссылаться с помощью оператора перехода.
<оператор> ::= <помеченный оператор> | <непомеченный оператор>
<помеченный оператор> ::= метка: <непомеченный оператор>
<непомеченный оператор> ::= <пустой оператор> | <оператор присваивания> | <оператор ввода> | <оператор вывода> | <составной оператор> | <оператор безусловного перехода> | <условный оператор> | <цикл с предусловием>
<пустой оператор> ::=
Оператор присваивания
<оператор присваивания> ::= <переменная>:=<выражение>
Семантика:
вычисление значения выражения;
проверка соответствия типа вычисленного значения типу переменной;
в случае совпадения типов, замена текущего значения переменной на новое значение.
Оператор ввода
<оператор ввода> ::= read(<переменная>)
Семантика:
ввод значения;
попытка неявного преобразования типа введенного значения к типу переменной;
в случае успеха, замена текущего значения переменной на новое значение.
Оператор вывода
<оператор вывода> ::= write(<данные для вывода>)
<данные для вывода> ::= <переменная> | строка_символов
Семантика:
вычисление значения выражения;
попытка вывода вычисленного значения;.
Составной оператор
<составной оператор> ::= begin <последовательность операторов> end
<последовательность операторов> ::= <оператор> {;<оператор>}
Семантика:
составной оператор задает последовательность выполнения операторов.
Оператор безусловного перехода
<оператор безусловного перехода> ::= goto метка
Семантика:
оператор перехода указывает, что процесс выполнения должен продолжаться с другого «места» программы, обозначенного меткой.
Условный оператор
<условный оператор> ::= if <выражение> then <оператор> [else <оператор>]
вычисление значения отношения (логического выражения);
если значение - «истина», то выполняется оператор, следующий за словом then;
если значение - «ложь», то выполняется оператор, следующий за словом else, если оно (слово) есть.
Цикл с предусловием
<цикл с предусловием> ::= while <выражение> do <оператор>
вычисление значения отношения (логического выражения);
если значение - «истина», то выполняется оператор, следующий за словом do, затем переход к пункту 1;
если значение - «ложь», то оператор завершается.
Описание меток
Описания меток объединяются в раздел меток:
<раздел меток> ::= label <определение метки>; {<определение метки>;}
<определение метки> ::= метка
Программа
<программа> ::= [<раздел меток>] [<раздел описания констант>] [<раздел определения типов>] [<раздел описания переменных>] <раздел операторов>.
Лексический анализ
Вход лексического анализатора: последовательность литер.
Выход лексического анализатора: последовательность лексем.
Перечисление лексем
Таблица ключевых слов.
1 |
array |
2 |
begin |
3 |
const |
4 |
do |
5 |
else |
6 |
end |
7 |
goto |
8 |
if |
9 |
label |
10 |
of |
11 |
program |
12 |
record |
13 |
then |
14 |
type |
Таблица типов.
1 |
integer |
2 |
boolean |
3 |
real |
4 |
complex |
Таблица разделителей.
1 |
, |
2 |
. |
3 |
; |
4 |
[ |
5 |
] |
6 |
{ |
7 |
} |
8 |
( |
9 |
) |
10 |
: |
11 |
:= |
12 |
.. |
Таблицы операций.
1 |
+ |
1 |
* |
1 |
= |
2 |
- |
2 |
/ |
2 |
> |
|
|
|
|
3 |
< |
Данные пользователя:
Таблица меток.
1 |
|
2 |
|
... |
|
Таблица пользовательских типов.
1 |
|
|
2 |
|
|
... |
|
|
|
|
атрибуты |
Таблица идентификаторов.
1 |
|
|
2 |
|
|
... |
|
атрибуты |
Таблица целых констант.
1 |
|
2 |
|
... |
|
Таблица вещественных констант.
1 |
|
2 |
|
... |
|
Таблица комплексных констант.
1 |
|
2 |
|
... |
|
Таблица строк.
1 |
|
2 |
|
... |
|