1 /******************************************************************************
2 *
3 * Copyright (C) 2006, The Gentee Group. All rights reserved.
4 * This file is part of the Gentee open source project - http://www.gentee.com.
5 *
6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT").
7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS
8 * ACCEPTANCE OF THE AGREEMENT.
9 *
10 * ID: lex 18.10.06 0.0.A.
11 *
12 * Author: Alexey Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15
16 #ifndef _LEX_
17 #define _LEX_
18
19 #ifdef __cplusplus
20 extern "C" {
21 #endif // __cplusplus
22
23 #include "../common/hash.h"
24
25 // Результирующий элемент лексического анализа
26 typedef struct
27 {
28 uint type; // Тип лексемы
29 uint pos; // Смещение начала лексемы
30 uint len; // Размер лексемы
31 uint value; // Дополнительное значение
32 } lexitem, * plexitem;
33
34 typedef struct
35 {
36 uint chars; // Последоватлеьность символов.
37 uint value; // результирующая команда
38 ubyte len; // количество символов
39 } lexmulti, * plexmulti;
40
41 typedef struct
42 {
43 ubyte left; // Open character ({
44 ubyte right; // Close caharacter )}
45 int count; // Counter - stop when -1
46 uint state; // Return state
47 } lexexp, * plexexp;
48
49 // Структура с таблицей переходов и прочей информацией
50 // лексического анализатора
51 typedef struct
52 {
53 buf tbl; // Таблица переходов. Каждая строка должна иметь
54 // 256 элементов
55 arr state; // Стэк состояний в котором хранится история состояний.
56 arr litems; // Хранятся номера lexitem при занесение в стэк state.
57 arr mitems; // Массив multi определений
58 // Резервируется 64 блока на всю таблицу по 8 элементов в
59 // каждом блоке. Каждый элемент lexmulti.
60 uint imulti; // Текущий свободный номер в массиве multi
61 hash keywords; // Keywords
62 arr expr; // Стэк из lexexp
63 ubyte alloced; // Под lex отведена память
64 } lex, *plex;
65
66 typedef struct
67 {
68 uint pos; // Первая позиция LEX_TRY
69 // uint state; // Состояние возврата
70 uint ret; // Состояние при LEX_RET
71 } lextry, *plextry;
72
73 // Дополнительные команды
74 // с 128 идут зарезервированные команды для LEXF_MULTI
75 #define LEX_MULTI 0x80000000 // Начало блоков multi всего 64
76 #define LEX_EXPR 0xFA000000 // Выражение в \( )
77 #define LEX_STRNAME 0xFB000000 // Проверка на имя в строке \[]
78 #define LEX_GTNAME 0xFC000000 // Проверка на GT/XML имя
79 #define LEX_SKIP 0xFD000000 // Пропускаем символ
80 #define LEX_OK 0xFE000000 // Накапливаем символы
81 #define LEX_STOP 0xFF000000 // Команда остановки разбора
82
83 // Флаги для элементов таблицы переходов
84 #define LEXF_ITSTATE 0x0001 // Формируем элемент от последней запомненной позиции
85 #define LEXF_ITCMD 0x0002 // Формируем элемент от последней запомненной позиции
86 #define LEXF_POS 0x0004 // Запоминаем позицию
87 #define LEXF_STAY 0x0008 // Оставаться на месте
88 #define LEXF_TRY 0x0010 // Проба возможного варианта
89 #define LEXF_RET 0x0020 // Возврат на последнее состояние при LEXF_TRY
90 #define LEXF_VALUE 0x0040 // value = строковое значение лексемы
91 #define LEXF_PUSH 0x0080 // Запомнить текущее состояние
92 #define LEXF_POP 0x0100 // Возвратиться в последнее запомненное состояние
93 #define LEXF_PUSHLI 0x0200 // Занести данные lexitem в стэк.
94 #define LEXF_POPLI 0x0400 // Убрать данные lexitem из стэка.
95 #define LEXF_MULTI 0x0800 // Смотреть на комбинацию символов (до 4).
96 #define LEXF_KEYWORD 0x1000 // Может быть ключевым словом
97 #define LEXF_NEW 0x2000 // Создать новый элемент
98 #define LEXF_PAIR 0x4000 // Учитывать парные скобки
99
100 /*
101 Описание таблицы переходов
102
103 Таблица переходов состоит из строк по 256 элементов uint.
104
105 Элемент таблицы переходов (uint с 0-255)
106 1 - 2 bytes
107 Flags
108 3 byte Если флаг LEXF_MULTI то указывает количество - 1
109 New state
110 4 byte Если флаг LEXF_MULTI то номер строки в mitems
111 Command Если флаг LEXF_TRY то номер состояния в случае LEX_RET
112 */
113
114 #ifndef RUNTIME
115
116 //--------------------------------------------------------------------------
117 // output - результирующий массив элементов lexitem
118 uint STDCALL gentee_lexptr( pubyte input, plex pl, parr output );
119 uint STDCALL gentee_lex( pbuf input, plex pl, parr output );
120 plex STDCALL lex_init( plex pl, puint ptbl );
121 void STDCALL lex_delete( plex pl );
122
123 //--------------------------------------------------------------------------
124
125 #endif
126
127 #ifdef __cplusplus
128 }
129 #endif // __cplusplus
130
131 #endif // _COMPILE_
132
133
Редактировать