5. 1. Лексический анализатор

Лексический анализатор распознает сочетания символов, поступающих из входного потока, и вырабатывает поток лексем. Каждая лексема представляет одну из строк символов. Множество лексем, сгенерированных лексическим анализатором, образует внутреннее представление входного потока (рис. 5. 1).

Процедура "читатьпредлож"

Описываемый здесь лексический анализатор "читатьпредлож" разработан на основе программы, приведенной в книге [22, с. 104] (программа использована с разрешения авторов). Анализатор "читатьпредпож" распознает слова и знаки препинания, поступающие во входном потоке. Лексический анализатор выбирает из входного потока предложение и возвращает список слов, содержащихся в нем. Слово определяется как множество букв, на границах которого стоят пробелы или иные недопустимые символы. Знаки препинания, скажем, запятая и точка, трактуются как самостоятельные слова. Предложение определяется как последовательность слов, границу которой задают точка, вопросительный или восклицательный знак. Символ перехода к новой строке рассматривается как пробел, поэтому предложение может занимать более одной строки.

В программе "читатьпредлож" используются два встроенных предиката — "getO", считывающий по одному коду символа из текущего входного потока, и "name", который преобразует список кодов символов в атом. Ниже располагается текст программы "читатьпредлож".

% имена переменных:

% Lw = список слов

% W, W1 = одно слово

% Lc = список символов

% С, С1 = одиночные символы

%

читатьпредлож ([W | Lw]): — % считать предложение

getO (С),

читатьслово (С, W, C1),

ocтaтoкпpeдлoж (W, C1, Lw),!.

% предыдущее слово и следующий символ введены; считать

% оставшуюся часть предложения.

% + + -

ocтaтoкпpeдлoж (W, -, []): -

границапредл (W),!. % конец, если предыдущим словом

% была граница предложения.

остатокпреддож (W. С, [W1| Lw]): -

читатьслово (С, W1, С 1),

ocтaтoкпpeдлoж (Wl, С 1, Lw).

% взять начальный символ, прочитать слово, возвратить

% следующий символ.

% + - -

читатьслово (С, W, C1): -

пунктуация (С),

!,

name (W, [С]), % построить слово из символов С

getO (Cl).

читатьслово (С, W, С 1): -

допустимый_символ (С),

!,

getO (C2),

остатокслова (С2, Lc, C1), % считать следующие

% символы.

name (W, [С| Lc]). % построить слово.

читатьслово (С, W, С 1). -

getO (C2), % символ С недопустим, ввести новый

% символ.

читатьслово (С2, W, C1). % и попытаться повторить.

% расширять слово до тех пор, пока не встретится недопустимый

% символ.

% + - -

остаток слова (С, [С| Lc], C1): - % объединить символы

% в список

допустимый_символ (С),

!,

getO (C2),

остатокслова (С2, Lc, C1).

остатокслова (С, [], С). % конец слова если С - недо-

% пустимый символ.

% символы, считающиеся самостоятельными словами:

пунктуация (44), %,

пунктуация (59). %;

пунктуация (58). %:

пунктуация (63). %?

пунктуация (33). % !

пунктуация (46). %.

% диапазоны кодов допустимых символов:

допустимый_символ (I): — I > 96, 1 < 123. % a—z

допустимый_символ (I): — I > 64, 1 < 91. % A—Z

допустимый_символ (I): - I > 47, 1 < 58. % 0-9

% знаки пунктуации, заканчивающие предложение

границапредл ('. ').

границапредл (‘!’).

границапредл ('? ').

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие