lab1_hyog_ivt260x

advertisement
ФИО
Группа
Преподаватель
Срок сдачи
Оценка
Лабораторная работа №1
Разработка лексического анализатора.
Нгуен Тхи Тху Хыонг
ИВТ – 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) стр. терм ::= ид. | с.конст
19)
1
Таблица лексем для языка Милан
Запись в языке
begin
end
integer
string
read
write
var
if
then
else
while
do
for
to
and
or
;
=, <>, <, >, <=, >=
Обозначение
begin
end
integer
string
read
write
var
if
then
else
while
do
for
to
and
or
;
отн.
1-й индекс
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
20
21
+, –

22
*,/
*/
23
:=
(
)
:
.
,
length, a3, _45x
:=
(
)
:
.
,
ид.
24
25
26
27
28
29
30
132, 45
ц.конст.
40
’Hello’, ’Привет’
с.конст.
41
2
2-й индекс
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
k(=) = 0
k(<>) = 1
k(<) = 2
k(>) = 3
k() = 4
k() = 5
k(+) = 0
k(–) = 1
k(*) = 0
k(/) = 1
0
0
0
0
0
0
индекс в таблице
идентификаторов
индекс в таблице целых
констант
индекс в таблице
строковых констант
Описание программы
На вход программы-сканера, подается текст программы на языке Милан и таблица
лексем. Ввод осуществляется на странице сайта, созданного с помощью фреймворка Ruby
on Rails.
На выходе имеем, занесенный в базу данных текст программы, а также, относящиеся
к ней лексемы, идентификаторы, числовые и строковые константы, которые
отображаются на странице в виде таблиц – соответственно “Таблица лексем”, “Таблица
переменных”, “Таблица чисел” и “Таблица строк”. Также сканером отслеживаются и
ошибки (неверное имя переменной, незакрытая строка, недопустимый символ).
Блок-схема блока лексического разбора
3
4
5
6
7
Тестовые примеры
Пример №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.
8
9
Пример №2
Передать привет маме
var
str: string;
begin
write('Komy peredat privet?');
read(str);
end.
10
Пример №3
ezy katka
var
a,b:integer;
begin
a:=5;
b:=4;
if a>b then write('ezy katka');
end.
11
Пример №4
Необъявленная переменная
var
a:integer;
Begin
asd
end.
12
Пример №5
Недопустимый символ "?"
var
begin
?
end
13
Download