S = бK
K = бK|цК|%F |#F
Десятичная целая константа:
S = «ц» D
D = «ц» D | e2 F
Степень:S = «^» F
Деление:S = «\» F
Cложение:S = «+» 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 |
Отладка формальной грамматики