ФИО Группа Преподаватель Срок сдачи Оценка Лабораторная работа №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