Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники / KONSPEKT_СРС_OSA.doc
Скачиваний:
33
Добавлен:
12.05.2015
Размер:
715.26 Кб
Скачать

Программирование сканера

  1. Определяем алфавит.

Включаем символы: /, +, -, *, (, ), //

Служебные слова: Begin,Abs,End

  1. Определяем базовые лексемы:

<идентификатор>::=<буква>{<буква>/<цифра>}7

<число>::=<цифры>{<цифры>}

  1. Комментарии

/* … */

В результате работы сканера мы должны построить таблицу лексем, следовательно, необходимо ввести кодировку лексем.

Кодировка лексем

Внутреннее представление

Символ

Мнемоническое имя

0

Не определен

$UND

1

Идентификатор

$ID

2

Целое

$INT

3

Begin

$BEGIN

4

ABS

$ABS

5

End

$END

6

/

$SLASH

7

+

$PLUS

8

-

$MINUS

9

*

$STAR

10

(

$LPAR

11

)

$APAR

12

//

$SLSL

Исходный текст:

Begin A+/BC///*Comment++*/End11

Получаем:

3,

‘Begin’

1,

‘A’

7,

‘+’

6,

‘/’

1,

‘BC’

12,

‘//’

5,

‘End’

2,

‘11’

Программа, формирующая таблицу лексем:

Var Ch:Char; /* Сканируемая литера, будем считать коды: D=1, L=2, /=3, Delim=4 */

Class:Integer;/* Тип литеры */

A:String; /* Cтрока сканируемых символов */

GetChar; /* Читает из строки символов текущий символ и определяет его тип */

/* (буква, цифра, косая или однолитерный разделитель) */

GetNonBlank /* Проверяет Ch, и если Ch – это пробел, то снова вызывает */

/* процедуру GetChar */

Begin

GetNonBlank; /* Прогоняем все предшествующие пробелы до значимого символа */

A:=’ ‘;

Case Class of

1: Begin

While Class=1 do

Begin

A:=A+Ch;

GetChar;

End;

Syn:=$INT;

End;

2: Begin

While Class<=2 do

Begin

A:=A+Ch;

GetChar;

End;

Syn:=$ID;

Look U(A); /* относится ли этот идентификатор к резервируемым словам */

End;

3:Begin

A:=Ch;

GetChar;

If Ch=’*’ then

Begin

GetChar;

Repeat While Ch<>’*’ do

GetChar;

Until Ch=’/’;

GetChar;

End;

Else

If Ch=’/’ then

Begin

A:=A+Ch;

GetChar;

Syn:=$SLSL;

End;

End.

Теперь наступает очередь построения программы синтаксического анализа. Если лексемы описываются регулярной грамматикой и распознаются этим распознавателем, то это контекстно-свободная грамматика. Способ описания этой грамматики – синтаксический граф.

Например, есть грамматика:

A::=x/(B)

B::=AC

C::={+A}

x, (), + - терминальные символы языка

А, В, С – нетерминальные термины языка (состояния)

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