EnglishРусский  

   ..

   lex.c

   lex.h

   lextbl.c

   lextbl.h

The project is closed! You can look at a new scripting language. It is available on GitHub.
Also, try our open source cross-platform automation software.

Ads

Installer and installation software
Commercial and Freeware installers.

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 
133