- •Задание
- •Символьный преобразователь
- •Входная грамматика
- •Функции переходов преобразователя
- •Лексический анализатор
- •Грамматика лексических единиц
- •Диаграмма состояний
- •Структуры данных и таблицы
- •Семантика анализа и символы действия.
- •3.5 Спецификация функций
- •3.6 Структура программы
- •Синтаксический анализатор
- •4.1 Неформальное описание семантики
- •4.2 Атрибутная грамматика
- •4.3 Описание символов действия
- •5. Атрибутный преобразователь
-
Лексический анализатор
-
Грамматика лексических единиц
1. Грамматика идентификатора
IcR
RcR
RdR
RrI
c-буква
d-цифра
r-разделитель (‘,’,’ ‘,’<’)
2. Грамматика числа
IdQ
QdQ
QrI
d-цифра
r-разделитель (‘,’,’ ‘,’<’)
3. Грамматика служебного слова
I<P
PcS
ScS
S>H
HI
c-буква
4. Грамматика констант
I’K
KcF
FcF
F’J
JI
-
Диаграмма состояний
-
Структуры данных и таблицы
При работе лексический анализатор формирует таблицы идентификаторов, чисел и лексем. Однако он также использует и готовые (зарание известные таблицы). К заранее из-вестным можно отнести такие таблицы как таблица служебных слов, таблица разделителей. Все заранее известные таблицы представим в памяти ЭВМ в виде двумерных массивов, а не-известные таблицы будем формировать в процессе работы лексического анализатора в виде линейных односвязных списков структур. Последовательность лексемм тоже представим в виде линейного односвязного списка.
Структуры данных
Структура Лекскемма.
typedef struct lexemma
{
int type; //тип(1-идентификатор,2-число,3-служ.слово,4-разделит.,5-константа Bool
// 6-константа Char)
int length; //длина
void *ptt; //указатель на таблицу(ТИ,ТЧ и т.д.)
struct lexemma *next; //указатель на следующий элемент списка
}lex;
Структура Идентификатор
typedef struct identificator
{
char *name; //имя
char type; //тип (1-bool,0-char)
int clas; //класс (1-массив,0-переменная)
int dim; //размерность массива (dim-мерный)
int dimc[3]; //количество элементов в n-ом уровне
struct identificator *next; //указатель на следующий элемент списка
}id;
Структура Число
typedef struct number
{
int value; //значение
struct number *next; //указатель на следующий элемент списка
}num;
Структура Ячейка памяти
typedef struct mem
{
int type; //тип (1-bool,0-char)
char *value; //значение
}
Таблицы
Количество таблиц определим по количеству типов лексем. Внашем случае их будет 6 щтук. 4 заранее известных и 2 формируемых в процессе работы лексического анализатора.
Зарание известные таблицы: 1) таблица служебных слов
2) таблица разделителей
3) таблица констант Bool
4) таблица констант Char
Формируемые таблицы: 1) таблица идентификаторов
2) таблица чисел
Пример.
Пример работы лексического анализатора.
Подадим на вход лексического анализатора цепочку:
{<bool>a7</bool>;<char><arr>a 2 2</arr>,dtr6</char>;
<bool><ass>hgf ‘true’</ass></boo>;<ass><marr>a 0 0</marr> <not>’A’</not></ass>;}
В результате работы лексического анализатора получим таблицы:
Таблица служ. Слов
-
bool
-
/bool
-
char
-
/char
-
arr
-
/arr
-
marr
-
/marr
-
iarr
-
/iarr
-
ass
-
/ass
-
and
-
/and
-
or
-
/or
-
not
-
/not
Таблица разделителей
-
‘ ‘
-
‘,’
-
‘;’
-
‘{‘
-
‘}’
-
‘’’
Таблица констант Char
-
‘a’
-
‘b’
-
‘c’
…..
-
‘x’
-
‘y’
-
‘z’
-
‘A’
-
‘B’
-
‘C’
…..
-
‘X’
-
‘Y’
-
‘Z’
Таблица коностант Bool
-
‘true’
-
‘false’
Таблица идентификаторов
78 a7
79 a
80 dtr6
-
hgf
Таблица чисел
82 2
83 0
Список лексемм.
Тип 4 Длина 1 Разделитель: { Указатель: 22
Тип 3 Длина 4 Служ.слово: bool Указатель: 1
Тип 1 Длина 2 Идентиф.: a7 Указатель: 78
Тип 3 Длина 5 Служ.слово: /bool Указатель: 2
Тип 4 Длина 1 Разделитель: ; Указатель: 21
Тип 3 Длина 4 Служ.слово: char Указатель: 3
Тип 3 Длина 3 Служ.слово: arr Указатель: 5
Тип 1 Длина 1 Идентиф.: a Указатель: 79
Тип 4 Длина 1 Разделитель: Указатель: 19
Тип 2 Длина 1 Число: 2 Указатель: 82
Тип 4 Длина 1 Разделитель: Указатель: 19
Тип 2 Длина 1 Число: 2 Указатель: 82
Тип 3 Длина 4 Служ.слово: /arr Указатель: 6
Тип 4 Длина 1 Разделитель: , Указатель: 20
Тип 1 Длина 4 Идентиф.: dtr6 Указатель: 80
Тип 3 Длина 5 Служ.слово: /char Указатель: 4
Тип 4 Длина 1 Разделитель: ; Указатель: 21
Тип 3 Длина 4 Служ.слово: bool Указатель: 1
Тип 3 Длина 3 Служ.слово: ass Указатель: 11
Тип 1 Длина 3 Идентиф.: hgf Указатель: 81
Тип 4 Длина 1 Разделитель: ' Указатель: 24
Тип 5 Длина 4 Константа Bool: true Указатель: 76
Тип 4 Длина 1 Разделитель: ' Указатель: 24
Тип 3 Длина 4 Служ.слово: /ass Указатель: 12
Тип 3 Длина 5 Служ.слово: /bool Указатель: 2
Тип 4 Длина 1 Разделитель: ; Указатель: 21
Тип 3 Длина 3 Служ.слово: ass Указатель: 11
Тип 3 Длина 4 Служ.слово: marr Указатель: 7
Тип 1 Длина 1 Идентиф.: a Указатель: 79
Тип 4 Длина 1 Разделитель: Указатель: 19
Тип 2 Длина 1 Число: 0 Указатель: 83
Тип 4 Длина 1 Разделитель: Указатель: 19
Тип 2 Длина 1 Число: 0 Указатель: 83
Тип 3 Длина 5 Служ.слово: /marr Указатель: 8
Тип 4 Длина 1 Разделитель: Указатель: 19
Тип 3 Длина 3 Служ.слово: not Указатель: 17
Тип 4 Длина 1 Разделитель: ' Указатель: 24
Тип 6 Длина 1 Константа Char: A Указатель: 51
Тип 4 Длина 1 Разделитель: ' Указатель: 24
Тип 3 Длина 4 Служ.слово: /not Указатель: 18
Тип 3 Длина 4 Служ.слово: /ass Указатель: 12
Тип 4 Длина 1 Разделитель: ; Указатель: 21
Тип 4 Длина 1 Разделитель: } Указатель: 23