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