Лабораторная работа № 1 Разработка лексического блока компилятора. | Студент | Хо Фук Фыонг |
Группа | ИВТ 260 | |
Дата | ||
Проверил |
I. Цель работы:
Написать программу для анализа программы, которая написана на языке Милан.
II. Постановка задачи:
Разработать лексический анализатор для выбранного языка (язык Милан)
На входе анализатора: файл с текстом, программы на выбранном языке, таблица
ключевых слов, таблица символов, ключевых слов, таблица символов, грамматика языка.
На выходе анализатора:
- Если нет ошибок: таблица лексем, таблица переменных, таблица строк, таблица чисел.
- Если обнаружена незакрытая строка или недопустимый символ – останов с выводом
сообщения.
II. Описание грамматики:
<программа> | ::= | <объявление переменных> <тело программы> |
<объявление переменных> | ::= | var <список переменных> |
<список переменных> | ::= | <блок переменных>;<список переменных> | <блок переменных> |
<блок переменных> | ::= | <список имен> :<тип> |
<список имен> | ::= | ид. | ид., <список имен> |
<тип> | ::= | integer | string |
<тело программы> | ::= | begin <последовательность операторов> end. |
<посл. операторов> | ::= | <оператор> | <оператор> ; | <оператор> ; <посл. операторов> |
<оператор> | ::= | ид. := <выражение> | if <условие> then <оператор> | if <условие> then <оператор> else <оператор> | while <условие> do <оператор> | for ид. := <выражение> to <выражение> do | write ( <выражение> ) | read ( ид. ) | begin <последовательность операторов> end |
<условие> | ::= | <сравнение> | <сравнение> <логический оператор> <условие> |
<сравнение> | ::= | <выражение> отн.<выражение> |
<лог. оператор> | ::= | and | or |
<выражение> | ::= | <численное выражение> | <строковое выражение> |
<числ. выражение> | ::= | <терм> | <терм> ± <числ. выражение> |
<терм> (so hang) | ::= | <множитель> | <множитель> */ <терм> |
<множитель> | ::= | ид. | ( <числ. выражение> ) |
<стр. выражение> | ::= | <стр. терм> | <стр. терм> + <стр. выражение> |
<стр. терм> | ::= | ид. | с. конст |
III. Граф состояний автомата, таблица переходов, входов и выходов
IV. Блок-схема блока лексического разбора:
- +
+
-
+
-
-
+
V. Тестовый пример:
*) Входный файл:
/= = = = = = = test. txt = = = = = = =/
var
a:=45, b:=1, c:=4567: integer;
Descriminant: integer;
x1:=0, x2:=32: integer;
Message, InfoString: string;
begin
Message := 'В ведите коэффициенты a, b,c: ';
write Message;
read a, b, c;
Descriminant := b*b - 2*a*c;
if (Descriminant < 0) then
InfoString := 'Дес криминант меньше нуля. Действительных корней уравнения не существует.';
end
1.Таблица лексем:
Таблица | Код | Лексем | Координаты
1 0 var 0,0;
2 0 a 1,17; 8,22; 9,41;
5 0 : 1,18; 1,25; 1,31; 1,37; 2,29; 3,19; 3,26;
3,30; 4,36; 6,25; 9,30; 11,30;
5 1 = 1,19; 1,26; 1,32; 3,20; 3,27; 6,26; 9,31; 11,31;;
3 0 45 1,20;
5 2 , 1,22; 1,28; 3,22; 4,24; 8,23; 8,26;
2 1 b 1,24; 8,25; 9,33; 9,35;
3 1 1 1,27;
2 2 c 1,30; 8,28; 9,43;
3 2 4567 1,33
1 1 integer 1,39; 2,31; 3,32;
5 3 ; 1,46; 2,38; 3,39; 4,44; 6,62; 7,30; 8,29; 9,44; 11,108;
2 3 Descriminant 2,17; 9,17; 10,21;
2 4 x1 3,17;
3 3 0 3,21; 10,36;
2 5 x2 3,24;
3 4 32 3,28
2 6 Message 4,17; 6,17; 7,23;
2 7 InfoString 4,26; 11,19;
1 2 string 4,38;
1 3 begin 5,1;
4 0 "В ведитекоэффициенты a, b,c: " 6,28;
1 4 write 7,17;
1 5 read 8,17;
5 4 * 9,34; 9,40; 9,42;
5 5 - 9,37;
3 5 2 9,39;
1 6 if 10,17;
5 6 ( 10,20;
5 7 < 10,34;
5 8 ) 10,37;
1 7 then 10,39;
4 1"Дес криминант меньше нуля. Действительных корней уравненияне существует." 11,32;
1 8 end 12,1;
2.Таблица служебных слов – 1
Индекс | Лексема | Координаты
0 var 0,0;
1 integer 1,39; 2,31; 3,32;
2 string 4,38;
3 begin 5,1;
4 write 7,17;
5 read 8,17;
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


