Смекни!
smekni.com

Разработка и отладка формального языка (стр. 2 из 3)


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

S = бK

K = бK|цК|%F |#F

Десятичная целая константа:


S = «ц» D

D = «ц» D | e2 F

Степень:

S = «^» F

Деление:

S = «\» F

Cложение:

S = «+» F

Знаки отношения:

S = «<» A | «>» B | «=» F
A = «=» D |«>«D| e3 F
B = «=» D | e4 F

D = e5 F


Скобка открывающая «(»:

S = «(«F

Скобка закрывающая»)»:

S = «)» F

Операция «=»:

S = «=» F

Точка «.»:

S = «.» F

Нижнее подчеркивание «_»:


S = «_» F

Функции, служебные слова, специальные константы, логические функции, элементы управления, события, свойства элементов управления, псевдоним функций резервируем, поэтому для них автоматной грамматики не строим.

Схема обобщенного конечного автомата

Сканер выполняет следующие действия:

1. Выделяет лексические единицы.

2. Классифицирует лексические единицы.

3. Определяет лексические ошибки;

4. Создает некоторые внутренние формы представления – таблицы стандартных символов (ТСС).

Построим обобщенный автомат для всего сканера (схема сканера). Для этого объединим начальные символы описания всех лексем в стартовую вершину. Схема сканера приведена нa Рис. 12.

В данном сканере использованы следующие сокращения:

A – входная цепочка;

NA – количество символов входной цепочки;

TL – текущая литера;

NTL – номер текущей литеры;

KTL – класс текущей литеры;

TLE – тип лексической единицы;

LE – лексическая единица;

MDLE – максимальная длина лексической единицы;

NLE – текущая длинна LE;

ALE – компонента записи ТСС, которая определяет адрес лексической единицы в соответствующей таблице.

На рис. 12 изображена схема сканера


Рис. 12. Схема сканера

Семантические подпрограммы сканера

Конечный автомат необходимо доопределить семантическими подпрограммами для того, чтобы он был преобразован в сканер.

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

1) выделение текущей литеры;

2) объединение строк;

3) выполнение арифметических операций.

В данном сканере задействованы следующие подпрограммы:

Подпрограмма PODGOT (подготовка):

NTL = 0;

NLE = 0;

TLE = A[NTL];

KTL = KLASS(TL); {определяем класс TL}

STRCOPY (LE, "»);

Подпрограмма TIP (определение типа):

IF KTL = 2 {цифра}

THEN {можно определить тип лексической единицы}

TLE = 2;

MDLE = 7;

ELSE ERROR («ошибка»);

Подпрограмма BKL (включение):

NLE++;

IF NLE>MDLE

THEN ERROR («ошибка»)

ELSE LE = LE || TL;

Подпрограмма SLL (следующая литера)

NTL++;

TL=A [NTL];

KTL = klass (TL);

Подпрограмма ZAPTAB (LE, TLE, ALE, REZ):

Осуществляет поиск лексической единицы в ТК. Для постоянных таблиц эта подпрограмма только определяет адрес LE, однако, во временные таблицы она еще и записывает лексическую единицу.

Запись элемента в ТСС можно осуществить с помощью процедуры OUT (TLE, ALE).

Таблицы сканера для тестовой цепочки

Private Sub D11 () Dim A As Integer, B% As Integer Const D As Single Dim M (2) As Integer A = (B/2 + 9)^10 If ((IsNumeric (A) <>0 and A>0) Then MsgBox («A is number», vbOkOnly) EndIf Text. Text = A End Sub

Таблица 6. Константы

Константа Атрибуты
Тип Запятая Точность представления Основание системы счисления
2 integer Нет 1 10
9 integer Нет 1 10
0 integer Нет 1 10
10 integer Нет 1 10

Таблица 7. Идентификаторы

Идентификатор Атрибуты Адрес идентификатора
Тип Запятая Основание системы счисления
A integer нет 10 1
B% integer нет 10 2
C integer нет 10 3
D Single нет 10 4

Таблица 8. Стандартные символы

Лексическая единица Тип лексической единицы Адрес лексической единицы
Private 10 10
Sub 10 10
D11 21 21
( 22 77
) 23 78
Dim 10 10
A 21 1
As 10 10
Integer 13 13
, 6 74
B% 21 2
As 10 10
Integer 13 13
Const 10 10
D 21 3
As 10 10
Single 13 13
A 21 1
= 1 65
( 22 77
B% 21 2
, 6 74
B% 21 2
/ 5 70
2 20 2
+ 2 69
9 20 4
) 23 78
^ 3 68
10 20 3
If 11 11
( 22 78
( 22 78
IsNumeric 19 2
( 22 77
A 21 1
) 23 78
<> 9 67
0 20 3
and 18 1
A 21 1
> 9 66
0 20 3
) 23 78
Then 11 11
A 21 1
= 1 65
B 21 2
EndIf 11 11
Text 14 14
. 6 74
Text 16 16
= 1 65
A 21 1
End 10 10
Sub 10 10

Отладка формальной грамматики