- •0. Формулировка задания
- •1. Описание входного языка Формулы Бэкуса-Наура
- •2. Описание семантики входного языка Правила реализации конструкций языка
- •3. Описание этапа лексического анализа.
- •3. 1. Определение типов лексем.
- •3. 2. Определение синтаксиса лексем.
- •3. 3. Построение диаграммы лексического анализатора.
- •3. 4. Таблицы лексем.
- •3. 5. Тестирование лексического анализатора.
- •4. Описание этапа синтаксического анализа
- •4.1. Разбиение кс–грамматики входного языка на подграмматики
- •4.2. Описание промежуточного языка
- •4.3. Неформальное описание перевода
0. Формулировка задания
Вариант 1.
В процессе выполнения курсовой работы необходимо разработать язык программирования, являющийся подмножеством языка Паскальи транслятор с этого языка в последовательностьтетрад. Метод синтаксического анализа –грамматики простого предшествования.
Язык должен обеспечивать операции над переменными и константами заданных базовых типов (целый, вещественный, комплексный, ограниченный), а также над переменными и компонентами производного типа (вектор с комплексными компонентами). Перечень операций должен включать как предусмотренные базовым языком, так иоперации над векторами: определение длины вектора, сумма и разность векторов, скалярное произведение векторов, умножение вектора на число;операции над комплексными числами: доступ к вещественной и мнимой частям, определение модуля числа. В языке должна быть определена операция преобразования типов приименной эквивалентности типов. В языке должна быть предусмотрена возможность создания пользовательских типов.
Язык должен допускать использование арифметических выражений, в состав которых могут входить константы и простые переменные базовых типов, компоненты структурированного типа, круглые скобки и знаки операций: сложения, вычитания, умножения, деления.
Язык должен допускать использование логических выражений, в состав которых могут входить отношения, круглые скобки и знаки логических операций: И, ИЛИ, НЕ, константы и переменные логического типа.
Приоритет операций – обычный.
Состав операторов языка:
оператор присваивания
оператор ввода
оператор вывода
составной оператор
оператор безусловного перехода
условный оператор, условие в котором задается логическим выражением
оператор цикла – с параметром
Перегрузка операций – разрешается.
Краткая формулировка:
Базовый язык – Паскаль.
Базовые типы: целый, вещественный, комплексный, ограниченный.
Структурированный тип – вектор с комплексными компонентами.
Операции над векторами: определение длины вектора, сумма и разность векторов, скалярное произведение векторов, умножение вектора на число.
Операции над комплексными числами: доступ к вещественной и мнимой частям, определение модуля числа.
Оператор цикла – с предусловием.
Перегрузка операций – разрешается.
Эквивалентность типов – именная.
Класс грамматик – грамматики простого предшествования.
Промежуточный язык – тетрады.
1. Описание входного языка Формулы Бэкуса-Наура
<программа> ::= program <идент> ; <блок_описаний> <блок_опер> .
<блок_описаний> ::= <блок1> | <объявл_меток> <блок1>
<блок1> ::= <блок2> | <объявл_констант> <блок2>
<блок2> ::= <блок3> | <объявл_типа> <блок3>
<блок3> ::= <объявл_пер> | ε
<блок_опер> ::= <составной_оператор>
<объявл_меток> ::= label <метки> ;
<метки> ::= <целое_без_знака> | <целое_без_знака>, <метки>
<объявл_констант> ::= const <список_констант> ;
<список_констант> ::= <идент> = <константа> |
<идент> = <константа>; <список_констант>
<константа> ::= <конст_идент> | <компл_число>
<объявл_пер> ::= var <переменные> ;
<переменные> ::= <список_пер> : <тип> |
<список_пер> : <тип>; <переменные>
<список_пер> ::= <идент> | <идент>, <список_пер>
<объявл_типа> ::= type <типы> ;
<типы> ::= <идент> = <тип> | <идент> = <тип>; <типы>
<тип> ::= <простой_тип> | <структурный_тип> |
<ограниченныый_тип> | <перечисляемый_тип>
<ограниченный_тип> ::= <конст_идент> .. <конст_идент>
<перечисляемый_тип> ::= ( <список_пер> )
<простой_тип>::= integer | real | <идент> | complex
<структурный_тип> ::= vector[<конст_идент>]
<оператор> ::= <метка> : <непомеч_оператор> | <непомеч_оператор> | ε
<непомеч_оператор> :: = <простой_оператор> | <составной_оператор>
<составной_оператор> ::= begin <послед_операторов> end
<послед_операторов> ::= <оператор> |
<оператор> ; <послед_операторов>
<простой_оператор> ::= <оператор_ввода> | <оператор_вывода> |
<оператор_присваивания> | <оператор_безусловного_перехода> |
<условный_оператор> | <оператор_цикла_с_предусловием>
<оператор_ввода> ::= readln (<послед_ввода>)
<послед_ввода> ::= <единица_ввода> | <единица_ввода>, <послед_ввода>
<единица_ввода> ::= <идент> | <операция_доступа>
<оператор_вывода> ::= writeln (<послед_вывода>)
<послед_вывода> ::= <простое_выражение> |
<простое_выражение>, <послед_вывода>
<оператор_присваивания> ::= <левая_часть> := <простое_выражение> |
<идент> := <вектор>
<левая_часть> ::= <единица_ввода> | <компонента_вектора>
<оператор_безусловного_перехода> ::= goto <целое_без_знака>
<условный_оператор> ::= if <выражение> then <оператор> |
if <выражение> then <оператор> else <оператор>
<оператор_цикла_с_предусловием> ::= while <выражение> do <оператор>
<операция_над_компл> ::= abs(<компл>) | <операция_доступа>
<операция_доступа> ::= re(<компл>) | im(<компл>)
<компл> ::= <идент> | <компл_число> | <компонента_вектора>
<компонента_вектора> ::= <вектор> [<простое_выражение>]
<вектор> ::= <идент> | multconst(<вектор>,<конст_идент>) | sum(<вектор>,<вектор>) | dif(<вектор>,<вектор>)
<числ_опер_над_вект> ::= length(<вектор>) |
multscal(<вектор>,<вектор>)
<выражение> ::= <простое_выражение> |
<простое_выражение> <знак_отношения> <простое_выражение>
<простое_выражение> ::= <терм> |
<простое_выражение> <знак_сложения> <терм>
<терм> ::= <множитель> |
<терм> <знак_умножения> <множитель>
<множитель> ::= <унарный_знак> <множитель> | (<выражение>) |
<конст_идент> | <компл> | <операция_над_компл> |
<числ_опер_над_вект> | <приведени_типа>
<приведени_типа> ::= <простой_тип> ( <простое_выражение> )
<знак_отношения> ::= <= | >= | <> | < | > | =
<знак_сложения> ::=+ | - | OR
<знак_умножения> ::= * | / | AND
<унарный_знак> ::=+ | - | NOT
<конст_идент> ::= <идент> | <число>
<компл_число> ::= # <конст_идент> , <конст_идент> #
<целое> ::= <целое_без_знака> | <знак> <целое_без_знака>
<число> ::= <число_без_знака> | <знак> <число_без_знака>
<знак> ::= + | -
<целое_без_знака> ::= <цифра> | <цифра> <целое_без_знака>
<число_без_знака> ::= <целое_без_знака> | <целое_без_знака>.<целое_без_знака> |
<целое_без_знака> e <целое>
<идент> ::= <буква> | <буква><идент2>
<идент2> ::= <буква><идент2> | <цифра><идент2> | <буква> | <цифра>
<буква> ::= a...z | A...Z | _
<цифра> ::= 0...9