Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая по ТЯП. Вариант 18.doc
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
583.17 Кб
Скачать

Министерство общего и профессионального образования РФ

Санкт-Петербургский государственный

электротехнический университет

<ЛЭТИ>

Кафедра МО ЭВМ

Пояснительная записка к курсовой работе

по дисциплине «Теория языков программирования»

Вариант №18

Преподаватель: Опалева Э.А.

Выполнили студенты группы 3305: Крупицкий М.В.

Мещеряков А.А.

Санкт-Петербург

2006 Оглавление:

1. Постановка задачи 2

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

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

2.2. Описание семантики входного языка 9

Объявления и области действия 11

Преобразование типов 11

Операторы 11

Классы 12

Зарезервированные функции 13

3. Описание этапа лексического анализа 14

3.1. Определение типов лексем 15

3.2. Определение синтаксиса лексем 16

3.3. Структуры данных 18

3.5. Результаты работы лексического анализатора 22

4. Описание этапа синтаксического анализа: 24

4.1. Построение КС-грамматики входного языка 24

4.1.1. Определение программы 25

4.1.2 Подграмматика описания классов 25

4.1.3 Подграмматика описания необходимой атрибутики классов 25

4.1.4 Подграмматика описания членов класса 25

4.1.5. Подграмматика операторов 26

4.1.6. Подграмматика арифметических операций 27

4.1.7. Подграмматика операндов арифметических операций 27

4.1.8. Подграмматика знаков арифметических операций 28

4.1.9. Подграмматика логических выражений 28

4.1.10. Подграмматика операндов логических выражений 28

4.1.11. Подграмматика строковых операций 29

4.1.12. Подграмматика строковых операндов 29

4.1.13. Подграмматика литералов 29

4.1.14. Подграмматика атомов 30

4.1.15. Дополнительная подграмматика 30

4.2. Описание промежуточного языка (триады) 31

1. Постановка задачи

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

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

Язык должен допускать использование арифметических выражений, в состав которых могут входить константы и простые переменные базовых типов, компоненты структурного типа, круглые скобки и знаки операций: сложение, вычитание, умножение, деление. Язык должен допускать использование логических операций: И, ИЛИ, НЕ и в случае наличия в языке логического типа, константы переменные этого типа.

Состав операторов языка: - оператор присваивания; - оператор ввода; - оператор вывода; - составной оператор; - оператор безусловного перехода; - условный оператор, условие в котором задается логическим выражением; - оператор цикла, условие в котором задается логическим выражением.

Исходные данные:

Базовый язык–Java

Базовые типы: целый, вещественный, символьный.

Структурированный тип: символьная строка.

Операции над строками: определение длины строки, конкатенация строк, замена подстроки в строке, поиск подстроки в строке, доступ к подстроке.

Дополнительные требования: функции, операторnew, операции++,--, условный оператор присваивания.

Оператор цикла– с предусловием.

Перегрузка операций– разрешается.

Эквивалентность типов– структурная.

Класс грамматик– грамматики операторного предшествования.

Промежуточный язык– триады.

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

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

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

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

Жирным шрифтом выделяются терминалы

[ В квадратные скобки ] берутся элементы синтаксической конструкции, которые могут отсутствовать.

{ В фигурные скобки } берутся элементы, которые могут повторяться 0 или более раз.

| - знак или – либо одна, либо другие правые части цепочек БНФ.

2.1.1. Определение программы (наивысший уровень):

<программа>::=<главный класс>{<класс>}

2.1.2. Определение класса:

<класс>::=<объявление пакета>;{<подключение класса>;} <объявление класса>

{

{<метод>|<объявление переменной>}

}

<главный класс> ::=<объявление пакета>;{<подключение класса>;} <объявление класса>

{

{<метод>|<объявление переменной>}

<метод main>

{<метод>|<объявление переменной>}

}

2.1.3. Необходимая атрибутика класса:

<объявление пакета>::=package<путь>

<подключение класса>::=import<путь>.<идентификатор>

<объявление класса>::=class<идентификатор>

<путь>::=<часть пути>|

<путь>.<часть пути>

<часть пути>::=<латинская буква>{<латинская буква>|<цифра>}

2.1.4. Состав класса:

<метод>::=<тип><идентификатор>

( [<тип><идентификатор>{,<тип><идентификатор>}])

<блок кода>

<метод main> ::= void main(String <идентификатор>)

<блок кода>

<объявление переменной>::=<тип><простая переменная>|

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

2.1.5. Операторы:

<оператор> ::= [<метка>:]<непомеченный оператор>

<непомеченный оператор> ::= <оператор присваивания>|

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

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

<вызов метода>|

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

<цикл с предусловием> |

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

<оператор goto>

<составной оператор> ::=<оператор> |

<блок кода>

<оператор присваивания>::=<простая переменная>=<значение>| <простая переменная>=<оператор> |

<простая переменная>=<оператор new>

<оператор ввода>::=read()

<оператор вывода>::=write(<значение> { , <значение> } )

<вызов метода>::=<простая переменная>.<идентификатор>([<значение>{,<значение>}])|<идентификатор>([<значение>{,<значение>} ])

<условный оператор>::=

if(<логическое выражение>)[<составной оператор>[;else<составной оператор>] ]

<цикл с предусловием>::=while(<логическое выражение>)[ <составной оператор> ]

<оператор условного присваивания>::=

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

<блок кода>::={

{<унарная операция>;|

<объявление переменной>;|

<составной оператор>;|

<строковая операция> ;}

}

<операторnew>:: =new<тип>([<значение>{,<значение>}])

<операторgoto>::=goto<метка>

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

<операция>::=<операция скобки>|

<унарная операция>|

<мультипликативная операция>|

<аддитивная операция>

<операция скобки>::=(<значение>)

<унарная операция>::=<левая часть унарной операции> <знак унарной операции>

<мультипликативная операция>::=<левая часть мультипликативной операции>

<знак мультипликативной операции>

<левая часть унарной операции>

<аддитивная операция>::=<левая часть аддитивной операции>

<знак аддитивной операции>

<левая часть мультипликативной операции>

2.1.7. Операнды арифметических операций:

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

<левая часть унарной операции>::=<простая переменная>|

<литерал без знака>|

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

<унарная операция> |

<операция скобки>

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

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

2.1.8. Знаки:

<знак>::=<знак унарной операции>|

<знак мультипликативной операции> |

<знак аддитивной операции>

<знак унарной операции> ::=++ | --

<знак мультипликативной операции> ::=* | -

<знак аддитивной операции>::=+|-

2.1.9. Логические выражения:

<логическое выражение>::=<отрицание>|

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

<эквивалентность>|

<логическое И>|

<логическое исключающее ИЛИ>|

<логическое ИЛИ>|

true| false

<отрицание>::=!<логическое выражение>

<отношение>::=<левая часть отношения> > <значение>|<левая часть отношения> < <значение>|<левая часть отношения> >= <значение>|<левая часть отношения> <= <значение>

<эквивалентность>::=<левая часть эквивалентности>= =<левая часть отношения> |<левая часть эквивалентности>! =<левая часть отношения>

<логическое И>::=<левая часть логического И>&&<правая часть логического И>

<логическое исключающее ИЛИ>::=<левая часть логического исключающего ИЛИ>^<правая часть логического исключающего ИЛИ>

<логическое ИЛИ>::=<левая часть логического ИЛИ>||<правая часть логического ИЛИ>

2.1.10. Операнды логических выражений:

<левая часть отношения>::=<значение>|

<отношение>

<левая часть эквивалентности>::=<левая часть отношения>|

<эквивалентность>

<левая часть логического И>::=<левая часть эквивалентности>|

<логическое И>

<правая часть логического И>::=<эквивалентность>|

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

<отрицание>

<левая часть логического исключающего ИЛИ>::=<левая часть логического И>|<логическое исключающее ИЛИ>

<правая часть логического исключающего ИЛИ> ::= <правая часть логического И> | <логическое И>

<левая часть логического ИЛИ>::=<левая часть логического исключающего ИЛИ>|<логическое ИЛИ>

<правая часть логического ИЛИ>::= <правая часть логического исключающего ИЛИ> | <логическое исключающее ИЛИ>

2.1.11. Строковые операции:

<строковая операция>::=<длина строки>|

<конкатенация строк>|

<доступ к подстроке>|

<замена подстроки в строке>|

<поиск подстроки в строке>

<длина строки>:: =length(<строковое значение>)

<конкатенация строк>:: =concat(<строковое значение>, <строковое значение>)

<доступ к подстроке>:: =substring(<строковое значение>, <целое>[,<целое>])

<замена подстроки в строке>:: =

replace(<строковое значение>, <строковое значение>,<строковое значение>)

<поиск подстроки в строке>:: =find(<строковое значение>, <строковое значение>)

2.1.12. Строковые операнды:

<строковое значение>::=<простая переменная>|

<строка>|

<строковая операция>

2.1.13. Литералы:

<литерал>::=<число>|

<символьное значение>|

<строка>

<литерал без знака>::=<число без знака>|

<символьное значение>|

<строка>

<число>::=<целое>|

<вещественное>

<число без знака>::=<целое без знака>|

<вещественное без знака>

<символьное значение>:: =<символ>|‘ ” ’|‘ “ ’

<строка>::={<символ>||}

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

<целое без знака>:: =<цифра без нуля>{<цифра>}9 | 0

<целое >:: =[<знак аддитивной операции>]<целое без знака>

<вещественное без знака>:: =<целое>[.{<цифра>}]

<вещественное>:: =[<знак аддитивной операции>]<вещественное без знака>

2.1.14. Атомы:

<символ>:: =<UNICODE-символ> | \’ | \n | \” | \\ | \r | \t | \f | \b

<буква языка>:: =_|$|<латинская буква>

<латинская буква>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z

<цифра>:: =0|<цифра без нуля>

<цифра без нуля>:: =1|2|3|4|5|6|7|8|9

<UNICODE-символ>::=\u<hex digit> <hex digit> <hex digit> <hex digit>

<hex digit>::=<цифра>| a | b | c | d | e | f | A | B | C | D | E | F

2.1.15. Другое:

<тип>:: =<базовый тип>|

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

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

<базовый тип>:: =int|

double|

char

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

<метка>:: =<идентификатор>

<идентификатор>:: =<буква языка>{ <буква языка>|<цифра>}

<разделитель>::=;|(|)|{|}|[|]|,|.|?|:|{}1|{\n}1|{\t}1

<пустое значение>::=null

<ключевое слово>::=while|if|else|goto|read|write|

int | double | String | char | true | false |

package | import | class | void | null | new