Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ParseUnit / MLADoc.doc
Скачиваний:
22
Добавлен:
31.05.2015
Размер:
388.61 Кб
Скачать
  1. Лексический анализ

Назначение рассматриваемых ниже моделей – лексический анализ входной строки. Лексику языков программирования принято описывать регулярными грамматиками. Далее построенные грамматики преобразуется к виду, обеспечивающему построение конечных автоматов. Затем на основе этих автоматов строится лексический анализатор. Лексический анализатор представляет собой первую фазу компилятора. Его основная задача состоит в чтении новых символов и выдачи последовательности лексем, используемых синтаксическим анализатором в своей работе. Ниже в пункте 2.1 приведено описание регулярных грамматик, а в п.2.2 - распознающего конечного автомата и его связи с регулярной грамматикой.

    1. Регулярные грамматики

Определение. Регулярной (праволинейной) грамматикой называется грамматика G = <N, T, P, S>, где N, T – множества нетерминальных и терминальных символов соответственно, P – множество правил, S - аксиома грамматики, причем:

  1. N T = , S N, |S| = 1.

  2. P – состоит из правил вида A->aB, A->a и A->ε где A, B N, a T, ε – символ пустой строки.

  3. Нет пар правил вида A->aB и A->aC, где A, B, C N, a T.

  4. Если  pi=A->b P, то  pj=A->bC P, b T, A, C N .

  5. Для всякого правила вида 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->+€ }

    1. Конечный автомат

Определение. Конечным автоматом K, распознающим лексемы, заданные регулярной грамматикой G, назовем пятерку K=< V, Q, q0, , F >, где

  1. V = T

  2. Q=N

  3. q0=S

  4. :QV->Q: q = (r,a), если p P: p=r->aq, p, q Q, a V. Функция (r,a) не определена во всех остальных случаях

  5. 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.

Соседние файлы в папке ParseUnit