Лабораторная работа №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-й индекс | 2-й индекс |
begin | begin | 1 | 0 |
end | end | 2 | 0 |
integer | integer | 3 | 0 |
string | string | 4 | 0 |
read | read | 5 | 0 |
write | write | 6 | 0 |
var | var | 7 | 0 |
if | if | 8 | 0 |
then | then | 9 | 0 |
else | else | 10 | 0 |
while | while | 11 | 0 |
do | do | 12 | 0 |
for | for | 13 | 0 |
to | to | 14 | 0 |
and | and | 15 | 0 |
or | or | 16 | 0 |
; | ; | 20 | 0 |
=, <>, <, >, <=, >= | отн. | 21 | k(=) = 0 k(<>) = 1 k(<) = 2 k(>) = 3 k(£) = 4 k(³) = 5 |
+, – | ± | 22 | k(+) = 0 k(–) = 1 |
*,/ | */ | 23 | k(*) = 0 k(/) = 1 |
:= | := | 24 | 0 |
( | ( | 25 | 0 |
) | ) | 26 | 0 |
: | : | 27 | 0 |
. | . | 28 | 0 |
, | , | 29 | 0 |
length, a3, _45x | ид. | 30 | индекс в таблице идентификаторов |
132, 45 | ц. конст. | 40 | индекс в таблице целых констант |
’Hello’, ’Привет’ | с. конст. | 41 | индекс в таблице строковых констант |
Описание программы
На вход программы-сканера, подается текст программы на языке Милан и таблица лексем. Ввод осуществляется на странице сайта, созданного с помощью фреймворка Ruby on Rails.
На выходе имеем, занесенный в базу данных текст программы, а также, относящиеся к ней лексемы, идентификаторы, числовые и строковые константы, которые отображаются на странице в виде таблиц – соответственно “Таблица лексем”, “Таблица переменных”, “Таблица чисел” и “Таблица строк”. Также сканером отслеживаются и ошибки (неверное имя переменной, незакрытая строка, недопустимый символ).
Блок-схема блока лексического разбора
![]() |
![]() |
![]() |
![]() |
Тестовые примеры
Пример №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







