Алгоритм работы лексического анализатора "читатьпредлож"

Алгоритм работы программы "читатьпредлож" основан на схеме с просмотром на один символ вперед. Программа "читатьпредлож" начинает работу со считывания одного символа (С) из входного потока. Затем она передает этот символ процедуре "читатьслово". Процедура "читатьслово" проверяет, не является ли введенный символ (С) знаком пунктуации. Если является, то процедура "читатьслово" обращается к встроенному предикату "name", чтобы преобразовать этот символ в слово (W), а затем считывает из входного потока следующий символ (С 1). Процедура "читатьслово" возвращает слово (W) через второй аргумент и новый символ (С1) - через третий аргумент. Если первоначально считанный символ (С) не является знаком пунктуации, то следующая фраза процедуры "читатьслово" проверяет, допустим ли этот символ (т. е. он должен быть символом a-z, A-Z или 0-9) Если символ окажется допустимым, то процедура "читатьслово" вызовет процедуру "остатокслова" для получения списка оставшихся символов этого слова (Lc), а затем обратится к встроенному предикату "name" для превращения списка ([С | Lc]) в слово (W). Но если исходный символ (С) окажется недопустимым, то управление будет передано третьей фразе процедуры "читатьслово" Эта фраза игнорирует недопустимый символ (С), вводит новый символ (С2) и повторно вызывает процедуру "читатьслово" с новым символом в качестве ее первого аргумента.

Остальные процедуры - "остатокслова" и "остатокпредлож" - аналогичны процедуре "читатьслово". Первая фраза процедуры "остатокпредлож" проверяет, не является ли последнее обнаруженное слово признаком границы предложения Если является, то процедура "остатокпредлож" проходит через предикат "сократить" и оказывается успешной, что при водит и к успеху процедуры "читатьпредлож".

Использование программы "читатьпредлож"

Программу "читатьпредлож" можно использовать в запросе, например:

|? - write ('введите предложение'). n1, читатьпредпож (Х).

введите предложение

The cow jumped over the moon. X = [ 'The, cow. jumped, over, the moon, '.']

В приведенной версии программы прочие символы ($ и т. д.) просто игнорируются*). Это видно из следующего примера:

|? - write ('введите номер по соцстраху и точку. '), читатьпредлож (Х).

введите номер по соцстраху и точку. 123_45_678.

Х= ['123','45','678','.']

Как можно было бы изменить программу "читатьпредлож", чтобы эти символы либо стали допустимыми в составе слов, либо считались бы знаками пунктуации?

5. 2. Система нисходящего грамматического разбора Программа "объект"

Система грамматического разбора — это программа, которая распознает синтаксические объекты в потоке лексем. Здесь описана программа нисходящего грамматического разбора, названная "объект". На вход программы поступают список слов и название определенного синтаксического объекта более высокого уровня. Программа разбора добьется успеха, если в начале списка обнаружит слова, из которых формируется требуемый синтаксический объект В противном случае программа потерпит неудачу. Грамматика для программы "объект" - это несложное подмножество английского языка. Распознаваемые программой синтаксические объекты - это все части предложений английского языка, такие как "предложение", "глагольная группа" или "артикль"

Программа "объект" одновременно представляет собой и словарь, и грамматику

Согласно терминологии грамматического разбора терминальный символ (или терминал) - это входная лексема, а нетерминальный символ (или нетерминал) — это синтаксический объект, образованный комбинацией терминальных или нетерминальных символов. Множество терминалов. известное системе разбора, называется ее словарем. Компоненты каждого нетерминала специфицируются при помощи грамматического правила, а множество грамматических, правил, известных системе разбора, образует ее грамматику.

В описываемой системе используется простая грамматика, которую можно в схематической форме представить так:

предложение -> группа_существительного глагольная_группа

группа_cуществительного -> артикль существительное

глагольная_группа -> глагол группа_существительного

Стрелка здесь читается как "состоит из". В программе каждый терминал, входящий в состав словаря, представляется фактом "объект", а каждый нетерминал, входящий в грамматику, представляется правилом "объект".

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

% I = входной список лексем

%, О, R = выходной список лексем

% нетерминалы:

% Вход Выход Название

объект (I, О, предложение): -

объект (I, R, группа_существительного),

объект (R, О, глагольная_группа).

объект (I, О, группа_существительного): -

объект (I, R, артикль),

объект (R, О, существительное).

объект (I, О, глагольная_группа): -

объект (I, R, глагол),

объект (R, О, группа_существительного),

% терминалы:

% Вход Выход Название

объект ([the | R], R, артикль).

объект ([cow | R], R, существительное).

объект ([tail | R], R, существительное).

объект ([shakes | R], R, глагол).

объект ([walks | R], R, глагол).

Заметьте, что форма нетерминальных правил "объект" в точности соответствует форме грамматических правил.

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