- •2006 Печатается по решению научно-методического совета Иркутского Государственного университета
- •Оглавление
- •Введение
- •Содержание и задачи практикума
- •Лексический анализ
- •Регулярные грамматики
- •Конечный автомат
- •Технология и средства решения учебных задач
- •Компонент fsmUnit
- •Класс Lexemes
- •Учебные транслирующие программы
- •Пример диалоговой настройки и испытаний компонента fsmUnit
- •Пример программы лексического анализатора входной строки
- •Заключение
- •Использованные источники
- •664000, Иркутск, б. Гагарина, 36.
Лексический анализ
Назначение рассматриваемых ниже моделей – лексический анализ входной строки. Лексику языков программирования принято описывать регулярными грамматиками. Далее построенные грамматики преобразуется к виду, обеспечивающему построение конечных автоматов. Затем на основе этих автоматов строится лексический анализатор. Лексический анализатор представляет собой первую фазу компилятора. Его основная задача состоит в чтении новых символов и выдачи последовательности лексем, используемых синтаксическим анализатором в своей работе. Ниже в пункте 2.1 приведено описание регулярных грамматик, а в п.2.2 - распознающего конечного автомата и его связи с регулярной грамматикой.
Регулярные грамматики
Определение. Регулярной (праволинейной) грамматикой называется грамматика G = <N, T, P, S>, где N, T – множества нетерминальных и терминальных символов соответственно, P – множество правил, S - аксиома грамматики, причем:
N T = , S N, |S| = 1.
P – состоит из правил вида A->aB, A->a и A->ε где A, B N, a T, ε – символ пустой строки.
Нет пар правил вида A->aB и A->aC, где A, B, C N, a T.
Если pi=A->b P, то pj=A->bC P, b T, A, C N .
Для всякого правила вида A->aB либо существует правило A->a (A, B N, a T, A=S ), либо существует правило вида C->bA (A, С N, b T).
Пример 1.Грамматика десятичных дробей.
N = {A,B,C}, T = {ц,.}, S={A}
P ={ 1. A->ц
2. А->цA
3. A->.B
4. B->цC
5. C->цC
6. C->ц }
где: ц – обобщенный терминальный символ для обозначения цифр1 (Без этого символа вместо правила A->ц пришлось бы записать десять правил A ->0, A->1, A->2, A->3, A->4, A->5, A->6, A->7, A->8, A->9).
Пример 2.Грамматика знака операции «+».
N ={ A, € }, T = { + }, S={ A }
P={ 1. A->+
2. A->+€ }
Конечный автомат
Определение. Конечным автоматом K, распознающим лексемы, заданные регулярной грамматикой G, назовем пятерку K=< V, Q, q0, , F >, где
V = T
Q=N
q0=S
:QV->Q: q = (r,a), если p P: p=r->aq, p, q Q, a V. Функция (r,a) не определена во всех остальных случаях
F = {f: f Q, p1, p2 P: p1=q->a & p2=f->aqP, qQ}
Автомат начинает функционирование в состоянии q0. Его считывающая головка позиционирована на первую позицию анализируемой строки. На каждом такте работы конечного автомата считывается текущий входной символ, этот символ удаляется из входной строки, наконец, в соответствии с функцией переходов вычисляется новое состояние автомата. Входная строка считается распознанной, если он находится в одном из заключительных состояний (F) и ему на вход подана пустая строка. Если в процессе работы автомата имеет место случай, когда функция переходов не определена или пустая строка подана в не заключительном состоянии автомата, то автомат завершает работу и входная строка считается не распознанной.
Пример 3.Конечный автомат для распознавания дробных десятичных чисел:
Kd = <V, Q, q0, F, >, где
V ={ц, .}
Q = {A, B, C}
q0 = A
F={A, C}
= {(A,ц)->A, (A,.)->B, (B,ц)->C, (C,ц)->C }
Распознавание цепочки 123.456автоматомKdприведено в табл. 1.
Таблица 1.Команды, исполняемые автоматом
Такт |
Состояние |
Входной символ |
Входная строка |
0 |
A |
|
123.456 |
1 |
A |
1 |
23.456 |
2 |
A |
2 |
3.456 |
3 |
A |
3 |
.456 |
4 |
B |
. |
456 |
5 |
C |
4 |
56 |
6 |
C |
5 |
6 |
7 |
C |
6 |
|
Входная строка принята, так как автомат завершил работу в состоянии С F. |