EnglishРусский  

   ..

   lex.c

   lex.h

   lextbl.c

   lextbl.h

Ads

Perfect Automation tool
All-In-One: Script editor, Launcher, Scheduler, Keyboard & Mouse Recorder. Try now!

CreateInstall
Freeware and commercial installers.

Cell Phone Batteries
Batteries Plus offers batteries for laptop, camcorder, cell phone, camera.

Gentee needs your help!
How to advertise with us
 
laptop battery

source\src\lex\lex.h
  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 
Edit