- •Транслирующая грамматика
- •C) Функии переходов преобразователя и пример его работы
- •Пример работы преобразователя
- •Лексический анализатор
- •A) Грамматика лексических единиц и структура лексем
- •B) Матрица переходов лексического анализатора
- •D) Структура программы лексического анализатора и пример его работы
- •C) Описание символов действия
- •D) Атрибутная грамматика в окончательном виде
- •E) Вывод в атрибутной грамматике
- •B) Построение инструкций а-преобразвателя
- •C) Фрагмент работы а-преобразователя
- •Заключение
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 #идентификатора в таблице идентификаторов