Лабораторная работа №3

Разработка генератора кода.

ФИО

Фам Тхи Тхань Хуен

Группа

ИВТ – 260

Преподаватель

Срок сдачи

Оценка

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

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

Генератор кода необходимо написать и отладить на языке программирования Ruby. На вход генератору подается таблица лексем, полученная после работы лексического анализатора, выходом является программный код на языке Си, либо сообщения об ошибке.

Грамматика языка Милан

G = (T, N, S, R), где

T = {…} (см. таблицу лексем).

N = {<программа>, <объявление переменных>, <список переменных>, <блок переменных>, <список имен>, <тип>, <тело программы>, <оператор>, <условие>, <последовательность операторов>, <сравнение>, <логический оператор>, <выражение>, <численное выражение>, <строковое выражение>, <терм>, <множитель>, <строковый терм>}.

S = <программа>.

R:

1)  <программа> ::= <объявление переменных> <тело программы>

2)  <объявление переменных> ::= var <список переменных>

3)  <список переменных> ::= <блок переменных>;<список переменных> | <блок переменных>;

4)  <блок переменных> ::= <список имен> :<тип>

5)  <список имен> ::= ид. | ид., <список имен>

НЕ нашли? Не то? Что вы ищете?

6)  <тип> ::= integer | string

7)  <тело программы> ::= begin <последовательность операторов> end.

8)  <посл. операторов> ::= <оператор> ; | <оператор> ; <посл. операторов>

9)  <оператор> ::= ид. := <выражение> | if <условие> then <оператор> | if <условие> then <оператор> else <оператор> | while <условие> do <оператор> | for ид. := <выражение> to <выражение> do <оператор> | write ( <выражение> ) | read ( ид. ) | begin <последовательность операторов> end

10)  <условие> ::= <сравнение> | <сравнение> <логический оператор> <условие>

11)  <сравнение> ::= <выражение> отн.<выражение>

12)  <лог. оператор> ::= and | or

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

14)  <числ. выражение> ::= <терм> | <терм> ± <числ. выражение>

15)  <терм> ::= <множитель> | <множитель> */ <терм>

16)  <множитель> ::= ид. | ( <числ. выражение> ) | цел. конст

17)  <стр. выражение> ::= <стр. терм> | <стр. терм> + <стр. выражение>

18)  <стр. терм> ::= ид. | с. конст

Описание программы

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

На выходе имеем, занесенный в базу программный код на языке Си, либо сообщение об ошибке. Вывод осуществляется на странице сайта, созданного с помощью фреймворка Ruby on Rails.

Блок-схема блока генератора кода

Тестовые примеры

Пример №1

Пример №1

Вычисление периметра

var

a, b,c, p:integer;

begin

write ('vvedite a, b,c');

read (a);

read (b);

read (c);

p:=a+b+c;

write (p);

end.

Пример №2

Передать привет маме

var

str: string;

begin

write('Komy peredat privet?');

read(str);

end.

Пример №3

ezy katka

var

a, b:integer;

begin

a:=5;

b:=4;

if a>b then write('ezy katka');

end.

Пример №4

Необъявленная переменная

var

a:integer;

Begin

asd

end.

Пример №5

Недопустимый символ "?"

var

begin

?

end