- •2006 Оглавление:
- •1. Постановка задачи
- •Исходные данные:
- •2. Описание входного языка:
- •2.1. Описание синтаксиса входного языка
- •2.2. Описание семантики входного языка
- •Объявления и области действия
- •Оператор вывода
- •Оператор ввода
- •Зарезервированные функции
- •3. Описание этапа лексического анализа
- •3.1. Определение типов лексем
- •3.2. Определение синтаксиса лексем
- •3.3. Структуры данных
- •50 Таблица констант
- •3.5. Результаты работы лексического анализатора
- •4. Описание этапа синтаксического анализа:
- •4.1. Построение кс-грамматики входного языка
- •4.1.1. Определение программы
- •4.1.6. Подграмматика арифметических операций
- •4.2. Описание промежуточного языка (триады)
50 Таблица констант
тип |
значение |
1 |
10 |
2 |
3.34 |
3 |
‘a’ |
элемент списка полей содержит в себе данные об имени поля, его типе и значение этого поля
3.4. Спецификации функций лексического анализатора - идентификатор(лексема) – ищет идентификатор его в таблице ключевых слов. Если нашла, то пишет в выходной поток токен соответствующий лексеме, если не нашла, то вставляет идентификатор в таблицу идентификаторов и пишет в выходной потокid - целая константа(лексема, тип) – добавляет значение константы в таблицу, заносит туда ее тип и выводит в выходной потокc. - вещественная константа(лексема, тип) аналогично целой константе
- логическая константа(лексема, тип) добавляет значение константы в таблицу, заносит туда ее тип и выводит в выходной потокl. - оператор(лексема, тип) – ищет оператор в таблице, пишет в выходной поток соответствующий типу оператора токен - разделитель (лексема) - пишет в выходной поток токен(соответствует лексеме)
3.5. Результаты работы лексического анализатора
Пример программы на входном языке:
package dirmain;
class Test
{
int i = 1;
void main(String args)
{
double d = 2.3;
char c = ‘a’;
String s = “Hello!\n”;
while (i < 2 && c = = 97)
if (d > i)
write (s);
else
{
goto labelA;
labelA: i++;
}
}
}
Рассмотрим полученные динамические таблицы:
Таблица идентификаторов (ID):
Токен |
id |
Идентификатор |
Тип |
ID |
0 |
dirmain |
4 |
ID |
1 |
Test |
4 |
ID |
2 |
i |
0 |
ID |
3 |
args |
3 |
ID |
4 |
d |
1 |
ID |
5 |
c |
2 |
ID |
6 |
s |
3 |
ID |
7 |
labelA |
4 |
Таблица констант (ТКС):
Токен |
id |
Константа |
CI |
0 |
1 |
CR |
1 |
2.3 |
CC |
2 |
‘a’ |
CS |
3 |
“Hello!\n” |
CI |
4 |
2 |
CI |
5 |
97 |
Приведём результат работы (разбиение на токены):
KWPG ID0 SRSM //package dirmain;
KWCL ID1 //class Test
SRLCB //{
KWI ID2 AO CI0 SRSM // int i = 1;
KWVD KWMN SRLP KWS ID3 SRRP // void main(String args)
SRLCB // {
KWD ID4 AO CR1 SRSM // double d = 2.3;
KWC ID5 AO CC2 SRSM // char c = ‘a’;
KWS ID6 AO CS3 SRSM // String s = “Hello!\n”;
// while (i < 2 && c = = 97)
KWWL SRLP ID2 RLOP1 CI4 ALOP EQLOP0 CI5 SRRP
KWIF SRLP ID4 RLOP0 ID2 SRRP // if (d > i)
KWWR SRLP ID6 SRRP SRSM // write (s);
KWEL // else
SRLCB // {
KWGT ID7 SRSM // goto labelA;
ID7 SRCN ID2 UAOP0 SRSM // labelA: i++;
SRRCB// }
SRRCB// }
SRRCB//}
После окончания работы лексического анализатора имеется сформированный выходной поток токенов и заполненные таблицы идентификаторов и констант.