D) Структура программы лексического анализатора и пример его работы

Программа построена по алгоритму, описанному выше. Читается входной символ с входной ленты (входной файл) и в зависимости от него перехожу в одно из трех состояний. При обнаружении перехода из одного состояния в другое формируется лексема и заполняются ее поля (класс, размер, указатель ). После формирования таблицы лексем запускается процедура создания таблицы переменных. Просматривается вся таблица лексем и в таблицу переменных переносятся идентификаторы и числа.

Основной цикл программы:

do

{

if(fMove)

{

/* -- Взять входной символ -- */

ch=f.get();

if(ch==' '||ch=='\n'||ch=='\t')

{ do

ch1=f.get();

while(ch1==' '||ch1=='\n'||ch1=='\t');

if(ch==' ') f.putback(ch1);

else ch=ch1;

}

}

//если это действительно символ входного алфавита...

if((ch!=EOF)&&!fFail)

{

type=Lex::classify(ch); // определить класс этого символа

if(!fFail) Lex::Table[type][sost](); // применить соответствующее

// правило конечного автомата

}

}while((ch!=EOF)&&!fFail);//повторять пока не обработается вся вх. цепочка

// или не обнаружится недопустимость вх. цепочки

Пример работы лексического анализатора

Входная цепочка:

main()

{

int a , b , c=4;

float x , y , z=17.0;

for(c=4;c<10;c+1)

{

a= z * 4;

b= z + 5;

y= c * 15;

}

y = z + c ;

}

Результат работы анализатора

Служебное слово main()

Разделитель '{'

Служебное слово int

Идентификатор a

Разделитель ','

Идентификатор b

Разделитель ','

Идентификатор c

Операция =

Целочисленная константа 4

Разделитель ';'

Служебное слово float

Идентификатор x

Разделитель ','

Идентификатор y

Разделитель ','

Идентификатор z

Операция =

Дробная константа 17.000000

Разделитель ';'

Служебное слово for(

Идентификатор c

Операция =

Целочисленная константа 4

Разделитель ';'

Идентификатор c

Операция <

Целочисленная константа 10

Разделитель ';'

Идентификатор c

Операция +

Целочисленная константа 1

Разделитель ')'

Разделитель '{'

Идентификатор a

Операция =

Идентификатор z

Операция *

Целочисленная константа 4

Разделитель ';'

Идентификатор b

Операция =

Идентификатор z

Операция +

Целочисленная константа 5

Разделитель ';'

Идентификатор y

Операция =

Идентификатор c

Операция *

Целочисленная константа 15

Разделитель ';'

Разделитель '}'

Идентификатор y

Операция =

Идентификатор z

Операция +

Идентификатор c

Разделитель ';'

Разделитель '}'

ТАБЛИЦА ИДЕНТИФИКАТОРОВ

ИМЯ ТИП ИНИЦИАЛИЗИРОВАН ССЫЛКА НА ТП

#1 a UNKNOWN 0 -1

#2 b UNKNOWN 0 -1

#3 c UNKNOWN 0 -1

#4 x UNKNOWN 0 -1

#5 y UNKNOWN 0 -1

#6 z UNKNOWN 0 -1

#7 c UNKNOWN 0 -1

#8 c UNKNOWN 0 -1

#9 c UNKNOWN 0 -1

#10 a UNKNOWN 0 -1

#11 z UNKNOWN 0 -1

#12 b UNKNOWN 0 -1

#13 z UNKNOWN 0 -1

#14 y UNKNOWN 0 -1

#15 c UNKNOWN 0 -1

#16 y UNKNOWN 0 -1

#17 z UNKNOWN 0 -1

#18 c UNKNOWN 0 -1

ТАБЛИЦА ЦЕЛЫХ КОНСТАНТ

#1 4

#2 4

#3 10

#4 1

#5 4

#6 5

#7 15

ТАБЛИЦА ДРОБНЫХ КОНСТАНТ

#1 17.000000

ПОСТРОЕНИЕ АТРИБУТНОЙ ГРАММАТИКИ

a) Неформальное описание семантики

На входе атрибутного преобразователя должна быть последовательность лексем, в которой каждый идентификатор, служебное слово рассматривается как единое целое (не терминал). На выходе надо получить последовательность атомов (команд), которая описывала бы работу некоторой машины над входной программой .

b) Выбор атрибутов и их назначение

//Атрибуты нетерминальных символов и символов дейтвия

 first #первой свободной ячейки в ТП при входе в новое состояние

last #первой свободной ячейки в ТП при выходе из очередного

состояния

 lbl имя метки, сгенерированной {make_lbl}

 beg_lbl имя метки, стоящей перед началом цикла

 end_lbl имя метки, стоящей за телом цикла

 rslt любой числовой результат к-либо операций

//Атрибуты символов действия

cond адрес ячейки, содержащей результат вычисления

логической операции, используется при условных переходах

1op #ячейки в ТП с 1-ым операндом операции

2op #ячейки в ТП со 2-ым операндом операции

dest #ячейки для сохранения результата операции

 source #ячейки в ТП с операндом-источником

(для операции присваивания)

 cell #только что созданной ячейки в ТП

//Атрибуты терминальных символов

 #KEY #служебного слова в таблице служебных слов

 #RAZD #разделителя в таблице разделителей

 #OP #операции в таблице символьных обозначений

 #ID #переменной, связанной с идентификатором, в ТП

 #CONST #константы в таблице контант

 #NAME #идентификатора в таблице идентификаторов

Соседние файлы в папке ARVIN
  • #
    01.05.20141.09 Mб8KURS-ARV.DOC
  • #
    01.05.2014776.53 Кб5TRY.BMP
  • #
    01.05.20142.16 Кб4ZZZ.BAK
  • #
    01.05.20141.37 Кб4ZZZ.GRM
  • #
    01.05.201411.11 Кб5ZZZ.TFN
  • #
    01.05.20142.16 Кб4ZZZ.TGR