- •Лекция № 3 теория языков и формальных грамматик
- •3.1 Способы определения языков
- •3.2 Формальные грамматики
- •3.3 Грамматики с ограничениями на правила
- •Лекция № 4 способы записи синтаксиса языка. Распознаватели
- •4.1 Метаязык Хомского
- •4.2 Метаязык Хомского-Щутценберже
- •4.3 Бэкуса-Наура формы (бнф)
- •4.4 Расширенные Бэкуса-Наура формы (рбнф)
- •4.5 Диаграммы Вирта
- •Диаграмм Вирта
- •4.6 Распознаватели
- •Лекция № 5 демонстрационный язык программирования dpl
- •5.1 Синтаксис и семантика dpl
- •5.1.1 Элементарные конструкции
- •5.1.2 Составные конструкции. Организация программы
- •5.1.3 Краткое описание семантики языка
- •5.3 Описание пользовательского синтаксиса с использованием диаграмм Вирта
- •6.2 Транслитератор
- •6.3 Грамматики и распознаватели для лексического анализа
- •6.3.1 Связь между диаграммой Вирта и конечным автоматом
- •В эквивалентный конечный автомат
- •Задающая идентификатор
- •6.3.2 Связь между диаграммами Вирта и праволинейными грамматиками. Преобразование правой рекурсии в итерацию
- •Грамматик в диаграммы Вирта
- •В итеративную диаграмму Вирта
- •Идентификатора в итеративную диаграмму Вирта
- •Идентификатора в итеративную диаграмму Вирта (окончание)
- •6.3.3 Связь между диаграммами Вирта и грамматиками с левой рекурсией. Преобразование левой рекурсии в итерацию
- •В итеративную диаграмму Вирта
- •6.4 Методы лексического анализа
- •6.4.1 Организация непрямого лексического анализатора
- •Лексического анализатора
- •6.4.2 Организация прямого лексического анализатора
- •Прямого лексического анализатора
- •Лекция № 7 лексический анализатор демонстрационного языка программирования
- •7.1 Транслитератор dpl
- •7.1.1 Общая организация транслитератора
- •7.1.2 Программная реализация транслитератора
- •7.2 Непрямой лексический анализатор dpl
- •7.2.1 Диаграммы Вирта для отдельных автоматов непрямого лексического анализатора
- •7.2.1 Программная реализация отдельных автоматов
- •7.2.3 Общая структура непрямого лексического анализатора
- •7.3 Прямой лексический анализатор dpl
- •Прямого лексического анализатора
- •Прямого лексического анализатора (продолжение)
- •Прямого лексического анализатора (окончание)
- •Лекция № 8 общие принципы организации синтаксического разбора
- •8.1 Назначение синтаксического разбора
- •8.2 Классификация методов синтаксического разбора
- •Синтаксического разбора
- •8.3 Методы разбора
- •С операции умножения
- •Распознавателя самых нижних ветвей дерева выступает лексический анализатор
- •8.4 Последовательность разбора
- •8.5 Использование просмотра вперед
- •8.6 Использование возвратов
- •8.7 Выводы
- •Лекция № 9 использование автоматов с магазинной памятью для нисходящего разбора слева направо
- •9.1 Организация автомата с магазинной памятью
- •9.1.1 Операции автомата
- •9.1.2 Распознаватель скобочных выражений
- •9.2 Общая связь между грамматиками и автоматами с магазинной памятью
- •9.3 Связь между s-грамматикой и автоматом с магазинной памятью
- •9.3.1 Обобщенный алгоритм построения нисходящего амп
- •9.4 Построение автомата с магазинной памятью по q-грамматике
- •9.4.1 Построение нисходящего автомата
- •Заменить (αr), Сдвиг
- •Вытолкнуть, Сдвиг.
- •Вытолкнуть.
- •9.4.2 Примеры построения амп по q-грамматике
- •Список использованных источников
- •Содержание
7.3 Прямой лексический анализатор dpl
При разработке прямого лексического анализатора поступают очень просто: все правила, используемые в этой фазе, сваливают в одну кучу, после чего начинается их систематизация по группам, начинающихся с одинаковых начальных символов. Эти символы образуют набор альтернатив, анализируемых на первом шаге или, что одно и тоже, из начального состояния единого и плоского конечного автомата. Далее, аналогичный анализ осуществляется в каждой из подгрупп. При этом достаточно длинные правила можно оформлять как отдельные автоматы, что, в конце концов, приведет к созданию соответствующих процедур. Сформированный общий автомат, обеспечивающий прямой лексический анализ (представленный диаграммой Вирта), приведен на Рисунке 7.4.
Рисунок 7.4 Диаграммы Вирта, используемые для построения
Прямого лексического анализатора
Рисунок 7.4 Диаграммы Вирта, используемые для построения
Прямого лексического анализатора (продолжение)
Рисунок 7.4 Диаграммы Вирта, используемые для построения
Прямого лексического анализатора (окончание)
Программная реализация выглядит следующим образом:
//----------------------------------------------------------------
// Функция, формирующая следующую лексему
// Вызывается синтаксическим анализатором
//----------------------------------------------------------------
void nxl(void) {
do {
i_lv = -1;
lv[0] = '\0';
if(si == EOF) {lc = lexEof;}
else if(isSkip(si)) {nxsi(); lc = lexSkip;}
else if(isLetter(si) || si == '_'){
lv[++i_lv]=si; nxsi(); id_etc();
}
else if(isDigit(si)) {number();}
else if(isIgnore(si)) {nxsi(); lc = lexIgnore;}
else if(si == '/') {nxsi(); divcom();}
else if(si == '\"') {nxsi(); string_const();}
else if(si == ';') {nxsi(); lc = lexSemicolon;}
else if(si == ',') {nxsi(); lc = lexComma;}
else if(si == ':') {
nxsi();
if(si == '=') {nxsi(); lc = lexAssign;}
else lc = lexColon;
}
else if(si == '(') {nxsi(); lc = lexLftRndBr;}
else if(si == ')') {nxsi(); lc = lexRghRndBr;}
else if(si == '[') {nxsi(); lc = lexLftSqBr;}
else if(si == ']') {nxsi(); lc = lexRghSqBr;}
else if(si == '*') {nxsi(); lc = lexStar;}
else if(si == '%') {nxsi(); lc = lexPercent;}
else if(si == '+') {nxsi(); lc = lexPlus;}
else if(si == '-') {
nxsi();
if(si == '>') {nxsi(); lc = lexArrow;}
else lc = lexMinus;
}
else if(si == '=') {nxsi(); lc = lexEQ;}
else if(si == '!') {
nxsi();
if(si == '=') {nxsi(); lc = lexNE;}
else {lc = lexError; er(1);}
}
else if(si == '>') {
nxsi();
if(si == '=') {nxsi(); lc = lexGE;}
lc = lexGT;
}
else if(si == '<') {
nxsi();
if(si == '=') {nxsi(); lc = lexLE;}
lc = lexLT;
}
else if(si == '{') {nxsi(); prenumber();}
else if(si == '.') {lv[++i_lv]=si; nxsi(); fltnumber2();}
else {lc = lexError; er(0); nxsi();}
} while (lc == lexComment || lc == lexSkip || lc == lexIgnore);
}
При взятии для анализа и транслитерации следующего символа, не надо учитывать позицию в файле.
Диаграммы Вирта, описывающие отдельные подавтоматы прямого лексического анализатора, представлены на Рисунке 7.5. Их программную реализацию проще всего изучить на прилагаемых исходных текстах.
Рисунок 7.5 Диаграммы Вирта, описывающие отдельные крупные фрагменты правил прямого лексического анализатора
Примечание 1. Под остальными понимаются символы, не рассматриваемые непосредственно в текущей точке. В точке 1 – это не «*» и не конец файла; в точке 2 – это не «*», не конец файла и не «/».
Рисунок 7.5 Диаграммы Вирта, описывающие отдельные крупные фрагменты правил прямого лексического анализатора (продолжение)
Рисунок 7.5 Диаграммы Вирта, описывающие отдельные крупные фрагменты правил прямого лексического анализатора (окончание)
