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