Лабораторная работа №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



