
- •2. Описание этапа лексического анализа.
- •2.1. Определение типов лексем.
- •2.2. Определение синтаксиса лексем
- •2.3. Построение диаграммы лексического анализатора
- •2.4. Структуры данных лексического анализатора
- •2.5. Спецификация процедур (функций) лексического анализатора
- •2.6. Моделирование работы лексического анализатора
2. Описание этапа лексического анализа.
2.1. Определение типов лексем.
Типы лексем, выделяемых лексическим анализатором из программы на входном языке, определяются входным языком. Лексический анализатор исключает из текста исходной программы комментарии, незначащие пробелы, символы табуляции и перевода строки и выделяет лексемы следующих типов:
Идентификаторы – пользовательские имена объектов программы.
Константы – числовые, логические или строковые значения, указанные явно.
Ключевые слова – зарезервированные идентификаторы, имеющие строго определённый смысл.
Знаки операций – символы, обозначающие унарные и бинарные операции.
Специальные символы – квадратные и круглые скобки, точки и запятые и т.д.
Разделители – пробелы и символы новой строки. Если в тексте программы, в каком-либо месте, может стоять хотя бы один разделитель, то в этом месте может стоять сколько угодно разделителей.
Соотношение между токенами и лексемами.
Токен |
Лексемы |
Языковая конструкция |
_ID |
str, count |
Идентификатор |
_NUM |
10, 1023 |
Целое без знака |
_STR |
‘Введите i:’ |
Строка |
Ключевые слова | ||
_PROG |
program |
Соответствующие ключевые слова |
_CONST |
const | |
_TYPE |
type | |
_VAR |
var | |
_LABEL |
label | |
_BEGIN |
begin | |
_END |
end | |
_IF |
if | |
_THEN |
then | |
_ELSE |
else | |
_GOTO |
goto | |
_REPEAT |
repeat | |
_UNTIL |
until | |
_READ |
read | |
_WRITE |
write | |
_WRITES |
writes | |
_WRITEM |
writem | |
_BOOL |
boolean | |
_INT |
integer | |
_ARRAY |
array | |
_OF |
of | |
_TRUE |
true | |
_FALSE |
false | |
Знаки операции | ||
- |
- |
Арифметические |
+ |
- | |
_MID |
*, div, mod | |
and |
Логические | |
_OR |
or | |
_NOT |
not | |
_INV |
inv |
Над матрицами |
_MOP |
con, alt | |
_SIZE |
size | |
_REL |
<, <=, >=, >, <>, = |
Отношения |
_EQ |
:= |
Присваивания |
Специальные символы | ||
_DDOT |
.. |
Соответствующие символы |
= |
= | |
( |
( | |
) |
) | |
[ |
[ | |
] |
] | |
; |
; | |
: |
: | |
, |
, | |
. |
. |
2.2. Определение синтаксиса лексем
Классы литер, которые используются для написания лексем
буква: прописные и строчные буквы латинского алфавита
цифра: десятичные цифры
подчеркивание: символ «_»
не_идентификатор: все литеры за исключением латинских букв, цифр и символа «_»
не_знак_отношения: все литеры за исключением символов >, <, =
Автоматные грамматики, описывающие синтаксис лексем, и графы конечных автоматов
Символ S – начальный символ, а F – символ, соответствующий концу разбора лексемы.
Идентификатор S → буква C C → буква С C → цифра C C → подчеркивание C С → не_идетификатор
|
|
Целое число без знака S → цифра N N → цифра N N → не_идетификатор
|
|
Операция отношения S → > A S → < B S → = A → = A → не_знак_отношения B → = B → > B → не_знак_отношения
|
|
Операция присваивания S → : E E → =
|
|
Операция двойная точка S → . E E →. |
|
Кроме того, используется ряд тривиальных грамматик, отвечающих за разбор специальных символов, а именно:
+, -, *, (, ), [, ], ;, :, ,, .