- •Пояснительная записка к курсовой работе (вар16)
- •2008 Оглавление
- •Задание
- •Описание синтаксиса языка в форме Бэкуса-Наура Teрминальные символы:
- •Программа
- •Оператор ввода
- •Оператор вывода
- •Оператор безусловного перехода
- •Оператор условного перехода
- •Оператор Цикла
- •Арифметические выражения
- •Переменная
- •Оператор присваивания
- •Объявления переменных, констант и типов
- •Операции входного языка и их приоритет
- •Перечисление лексем
- •Синтаксический анализ и перевод во внутреннюю форму
- •Кс-грамматика входного языка
- •Основная грамматика
- •Подграмматика составного оператора
- •Подграмматика оператора
- •Подграмматика оператора_вывода
- •Подграмматика для операторов
- •Подграмматика объявлений
- •Подграмматика объявления констант
- •Подграмматика арифметических выражений
- •Подграмматика переменной
- •Описание промежуточного языка.
- •Спецификация тетрад
- •Описание перевода (постфиксная s – атрибутная транслирующая грамматика) каждой конструкции входного языка
- •Основная грамматика
- •Подграмматика для операторов
- •Подграмматика объявления констант
- •Связь между дмп-процессорами и подграмматиками
- •Пример перехода от основной грамматики к подграмматике составного оператора Управляющая таблица основной грамматики
- •Управляющая таблица подграмматики составного оператора
- •S– атрибутный дмп процессор
- •Пример атрибутного перевода для арифметических выражений
- •Управляющая таблица подграмматики оператора
- •Управляющая таблица подграмматики оператора вывода
- •Реализация компилятора
- •Генерация ассемблерного кода
Программа
<программа>::= <глобальное_описание> void main ( ) <составной_оператор> |
void main ( ) <составной_оператор>
<составной_оператор>::= { <множество_операторов> } | { }
<множество_операторов>::= <оператор> | <множество_операторов> <оператор>
<глобальное_описание>::= <глобальное_описание> <объявления> | <объявления>
<оператор>::= <метка> <оператор_1> | <оператор_1>
<метка>::= id :
<оператор_1>::= <оператор_ввода> | <оператор_вывода> | <оператор_усл_перехода> |
<оператор_безусл_перехода> | <цикл> | <оператор_присваивания> |
<составной_оператор> | <оператор_матр_выражения> | ;
Переменные, константы и типы объявляются в глобальном описании до функции main. Повторное объявление переменных и констант недопустимо.
Константы не могут изменяться в теле программы..
Любой идентификатор программы должен быть ранее объявлен.
Ключевые слова не могут использоваться в качестве идентификаторов.
Оператор ввода
<оператор_ввода>::= scan ( <переменные_ввода> );
<переменные_ввода>::= <переменная> | <переменные_ввода> , <переменная>
Оператор ввода осуществляет чтение из стандартного потока ввода (клавиатуры) значений переменных. Идентификаторы этих переменных должны быть объявлены и не должны быть константами.
Оператор вывода
<оператор_вывода>::= print ( <значения_вывода> );
<значения_вывода>::= <ар_выражение> | <значения_вывода> , <ар_выражение>
Оператор осуществляет вывод в стандартный поток вывода, связанный обычно с экраном дисплея. Вывод может быть как переменных, так и констант.
Оператор безусловного перехода
<оператор_безусл_перехода>::= goto id ;
Оператор осуществляет безусловный переход к оператору, помеченному меткой (id).
Метка должна быть объявлена до данного оператора, и должна быть уникальной в
пределах программы.
Оператор условного перехода
<оператор_усл_перехода>::= if ( <лог_выражение> ) <оператор> |
if ( <лог_выражение> ) <оператор> else <оператор>
Если логическое выражение возвращает истину, то выполняется первый оператор,
иначе второй оператор после директивы else, если он присутствует.
<лог_выражение>::= <лог_выражение> <оп_равно_неравно> <условие> | <условие>
<условие>::= <ар_выражение> | <условие> <оп_сравнения> <ар_выражение>
<оп_равно_неравно>::= != | ==
<оп_сравнения>::= > | < | >= | <=
Типы операндов сравнения могут int или float. Результат: тип int, где
значение (0) - ложь, (1) - истина
Оператор Цикла
<цикл>::= for ( <заголовок_цикла> ) <оператор>
<заголовок_цикла>::= <параметр_1> ; <параметр_2> ; <параметр_3>
| ; <параметр_2> ; <параметр_3> | <параметр_1> ; ; <параметр_3> |
| <параметр_1> ; <параметр_2> ; |
| ; ; <параметр_3> | ; <параметр_2> ; | <параметр_1> ; ; | ; ;
<параметр_1>::= <операция_присвоения>
<параметр_2>::= <лог_выражение>
<параметр_3>::= <операция_присвоения>
Первый параметр задает начальное значение переменной, управляющей циклом. Если логическое выражение (параметр_2) истинно, то выполняется оператор. На каждом шаге происходит изменение управляющей переменной, что задается 3-м выражением.
Арифметические выражения
<ар_выражение>::= <ар_выражение> <оп+-> <слагаемое> | <слагаемое>
<слагаемое>::= <множитель> | <слагаемое> <оп*/> <множитель>
<множитель>::= ( <ар_выражение> )
| <переменная>
| det ( <ар_выражение> )
| transpose ( <ар_выражение> )
| <числовая_константа>
<оп+->::= + | -
<оп*/>::= * | /
<числовая_константа>::= inum | fnum
Элементами арифметических выражений являются:
переменные и константы целого и вещественного типа
матрицы
определитель матрицы
Выражение задает порядок вычисления значения, основанный на обычном правиле вычисления слева направо и старшинстве операций.
Арифметические операции выполняются над целыми, вещественными или матричными операндами и порождают результат типа в соответствии с таблицами:
|
+ |
int |
float |
fmatr |
|
int |
int |
float |
- |
|
float |
float |
float |
- |
|
fmatr |
- |
- |
fmatr |
|
- |
int |
float |
fmatr |
|
int |
int |
float |
- |
|
float |
float |
float |
- |
|
fmatr |
- |
- |
fmatr |
|
* |
int |
float |
fmatr |
|
int |
int |
float |
- |
|
float |
float |
float |
- |
|
fmatr |
- |
- |
fmatr |
|
/ |
int |
float |
fmatr |
|
int |
int |
float |
- |
|
float |
float |
float |
- |
|
fmatr |
- |
- |
- |
Операнды арифметической операции должны быть одного типа. Язык допускает
только преобразование типа intк типуfloat.
Если операнды операции - матрицы, то размерности этих матриц должны
соответствовать данной операции.
