EnglishРусский  

   ..

   alias.c

   alias.h

   bcodes.c

   bcodes.h

   body.c

   compile.c

   compile.h

   define.c

   define.h

   desc.c

   expr.c

   extern.c

   for.c

   foreach.c

   func.c

   func.h

   global.c

   global.h

   goto.c

   if.c

   ifdef.c

   ifdef.h

   import.c

   import.h

   include.c

   include.h

   jump.c

   lexem.c

   lexem.h

   macro.c

   macro.h

   operlist.txt

   out.c

   out.h

   subfunc.c

   switch.c

   type.c

   type.h

   vars.c

   while.c

   with.c

Реклама

Инсталлятор CreateInstall
Бесплатные и коммерческие инсталляторы

  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: func 02.11.06 0.0.A.
 11 *
 12 * Author: Alexander Krivonogov ( algen )
 13 *
 14 * Summary: Описания функций, структур, констант необходимых для компиляции
 15 *
 16 ******************************************************************************/
 17 
 18 #ifndef _FUNC_
 19 #define _FUNC_
 20 
 21    #ifdef __cplusplus
 22       extern "C" {
 23    #endif // __cplusplus
 24 
 25 #include "../os/user/defines.h"
 26 #include "../lex/lex.h"
 27 #include "../lex/lexgentee.h"
 28 #include "../common/arrdata.h"
 29 #include "../common/msglist.h"
 30 #include "../genteeapi/gentee.h"
 31 #include "../vm/vmload.h"
 32 #include "../bytecode/cmdlist.h"
 33 #include "lexem.h"
 34 #include "operlist.h"
 35 #include "type.h"
 36 #include "out.h"
 37 
 38 /*-----------------------------------------------------------------------------
 39 *
 40 * ID: funcdata 02.11.06 0.0.A.
 41 *
 42 * Summary: funcdata structure.
 43 *
 44 -----------------------------------------------------------------------------*/
 45 
 46 typedef struct
 47 {
 48    //Не менять порядок расположения buf, в случае необходимости добавлять в конец
 49    buf  bhead;    //Заголовок функции
 50    buf  bvardef;  //Блок для описания локальных переменных
 51    buf  bfuncout; //Байт-код
 52    buf  bsubout;  //Байт-код для подфункций
 53    buf  bblinit;  //Текущий стэк для команд инициализации блоков
 54    buf  bvars;    //Стэк локальных переменных, заполнен fvar
 55    buf  blabels;  //Стэк меток, заполнен flabel
 56    buf  bwith;    //Стэк сокращений with, заполнен fwith
 57    buf  bvarsas;  //Стэк переменных, заполнен fvaras
 58 
 59    pbuf bout;     //Текущий буфер вывода байткода
 60 
 61    hash nvars;    //Хэш таблица локальных переменных
 62    hash nlabels;  //Хэш таблица меток
 63 
 64    uint blcount;      //Общее количество блоков
 65    uint varcount;     //Общее количество локальных переменных
 66    uint curcount;     //Текущее количество локальных переменных
 67    uint lastcurcount; //Количество локальных переменных в верхнем блоке
 68 
 69    uint oldoffbvar;   //Размер таблицы локальных переменных на начало текущего блока
 70    uint functype;     //Тип функции
 71    uint funcoftype;   //Подтип функции
 72    uint bllevel;      //Уровень вложенности текущего блока
 73    uint offlcbreak;   //Смещение в таблице меток указывающие на break для цикла
 74    uint offlccontinue;//Смещение в таблице меток указывающие на continue для цикла
 75    uint blcycle;      //Вложенность циклов
 76    uint flgfunc;      //Флаг функции
 77    uint idresult;     //Идентификатор параметра result
 78    uint offsubgoto;   //Смещение перехода через подфунции
 79 } s_funcdata, * ps_funcdata;
 80 
 81 //Структура для хранения исходных типов переменных as
 82 typedef struct
 83 {
 84    uint offbvar;  //Значение смещения в таблице bvars
 85    uint type;     //Исходный тип
 86    uint oftype;   //Тип элемента
 87    uint flg;
 88 } fvaras, *pfvaras;
 89 
 90 //Структура для хранения with
 91 typedef struct
 92 {
 93    uint num;      //Номер локальной переменной
 94    uint type;     //Тип объекта
 95    uint oftype;   //Тип элемента объекта   
 96 } fwith, *pfwith;
 97 
 98 //Структура для хранения значения в хэше
 99 typedef struct
100 {
101    hashitem item;
102    uint     val;
103 } hashiuint, *phashiuint;
104 
105 
106 #define FVAR_SUBFUNC 0x01
107 #define FVAR_UINTAS  0x02
108 //Структура локальной переменной
109 typedef struct
110 {
111    phashiuint hidn; //Идентификатор в таблице имён
112    uint flg;        //Если 1 значит идентификатор тип
113    uint type;       //Тип переменной
114    uint num;        //Номер переменной в таблице локальных переменных
115    uint msr;        //Размерность для массива
116    uint oftype;     //Тип элемента массива
117    uint oldoffbvar; //Значение старого смещение переменной в bvars + 1, для переопределения переменных
118 
119    uint addr;       //Адрес для подфункции
120    uint pars;       //Количество параметров у подфункции
121    uint offbvardef; //Смещение в буфере описания переменных функции
122 
123 } fvar, *pfvar;
124 
125 // Структура для таблицы меток
126 typedef struct
127 {
128    uint type; //Тип LABT_*
129 union {
130    uint link; //Связь, идентификатор в хэш таблице меток, идентификатор в таблице
131    phashiuint hitem;
132 };
133    uint offbout;//Смещение в байткоде
134    plexem lex;  //Указатель на лексему с меткой для LABT_LABEL
135 } flabel, *pflabel;
136 
137 
138 //Структура описания типа
139 typedef struct
140 {
141    uint idtype;//Идентификатор типа
142    uint oftype;//Тип элемента
143    byte msr;   //Размерность
144 } s_desctype, *ps_desctype;
145 
146 
147 //--------------------------------------------------------------------------
148 //body.c
149 plexem STDCALL f_body( plexem plex );
150 
151 //----------------------------------------------------------------------------
152 //desc.c
153 plexem STDCALL desc_nextidvar( plexem curlex, ps_descid pdescid );
154 plexem STDCALL desc_idtype( plexem curlex, ps_desctype pdesctype );
155 
156 //----------------------------------------------------------------------------
157 //expr.c
158 extern uint artypes[];
159 #define EXPR_ORD    0x01   //Значение flg, при обработке обычного выражения
160 #define EXPR_MACROS 0x02   //Выражение для макросов
161 #define EXPR_VAR    0x04   //Обработка в определении локальных переменных
162 #define EXPR_COMMA  0x08   //Выражение обрабатывать до запятой
163 #define EXPR_BOOL   0x10   //Выражение истины
164 #define EXPR_NONULL 0x20   //Тип выражения должен быть не ноль
165 #define EXPR_ARR    0x40   //Размерность массива
166 //Флаги состояния функции для проверки ошибок синтаксиса в выражении
167 #define L_OPERAND    0x01  //Операнд
168 #define L_POST_CLOSE 0x02  //Унарный пост оператор, закрывающая скобка
169 #define L_BINARY     0x04  //Бинарный оператор
170 #define L_UNARY_OPEN 0x08  //Унарный пре оператор, открывающая скобка
171 #define L_FUNC       0x10  //Последнее было имя функции ожидается (
172 
173 plexem STDCALL f_expr( plexem curlex, uint flg, puint rettype, puint retoftype );
174 
175 //----------------------------------------------------------------------------
176 //extern.c
177 plexem STDCALL m_extern( plexem curlex );
178 
179 //----------------------------------------------------------------------------
180 //for.c
181 plexem STDCALL c_for( plexem curlex );
182 plexem STDCALL c_fornum( plexem curlex );
183 
184 //----------------------------------------------------------------------------
185 //foreach.c
186 plexem STDCALL c_foreach( plexem curlex );
187 
188 //----------------------------------------------------------------------------
189 //func.c
190 extern s_funcdata fd;
191 
192 plexem STDCALL m_func( plexem curlex, uint flgextern );
193 
194 //----------------------------------------------------------------------------
195 //if.c
196 plexem STDCALL c_if( plexem curlex );
197 
198 //----------------------------------------------------------------------------
199 //goto.c
200 plexem STDCALL c_goto( plexem curlex );
201 plexem STDCALL c_label( plexem curlex );
202 
203 //----------------------------------------------------------------------------
204 //jump.c
205 #define LABT_VIRT       0x0100
206 #define LABT_GT         0x0200
207 #define LABT_GTUNDEF    ( LABT_GT | 0x0001 )  //Неразрешенный переход, в link идентификатор в хэш таблице
208 #define LABT_GTDEF      ( LABT_GT | 0x0002 )  //Разрешенная переход или переход на виртуальную метку, в link идентификатор в таблице меток
209 #define LABT_LABEL      0x0004  //Метка, в link идентификатор в хэш таблице
210 #define LABT_LABELUNDEF 0x0008  //Отработавшая метка
211 #define LABT_GTVIRT     ( LABT_VIRT | LABT_GT )
212 #define LABT_LABELVIRT  ( LABT_VIRT ) //Виртуальная метка
213 #define LABT_SUBFUNC    0x1000   //Метка находится внутри подфункции
214 #define LABT_RETURN     0x2000 //На данную метку был переход
215 #define LABT_LABELWORK  0x4000
216 
217 void STDCALL j_correct( uint curoff, uint link );
218 uint STDCALL j_jump( uint cmd, uint flag, uint link );
219 uint STDCALL j_label( uint flag, uint link );
220 
221 //----------------------------------------------------------------------------
222 //subfunc.c
223 plexem STDCALL f_subfunc( plexem curlex );
224 
225 //----------------------------------------------------------------------------
226 //switch.c
227 plexem STDCALL c_switch( plexem curlex );
228 
229 //----------------------------------------------------------------------------
230 //vars.c
231 #define DESCID_GLOBTYPE   0x010 //Описание глобальная переменная, описание структуры - arr a[10,20] of str
232 #define DESCID_GLOBAL     0x010
233 #define DESCID_TYPE	     0x011
234 #define DESCID_SUBFUNC    0x021//Описание подфункции
235 #define DESCID_PAR        0x040 //Описание параметра функции - arr a of str
236 #define DESCID_PARFUNC    0x040
237 #define DESCID_PARSUBFUNC 0x041
238 #define DESCID_VAR        0x080 //Описание локальной переменной - arr a[x+10,y+20] of str
239 
240 plexem STDCALL var_def( plexem curlex, uint flgdesc );
241 uint STDCALL var_checkadd( ps_descid descvar );
242 STDCALL create_varmode( pbuf out, ps_desctype desctype, ps_descid descid );
243 plexem STDCALL var_def( plexem curlex, uint flgdesc );
244 uint STDCALL var_add( phashiuint hidn, ps_descid descvar );
245 uint STDCALL var_addtmp( uint type, uint oftype );
246 
247 //----------------------------------------------------------------------------
248 //while.c
249 plexem STDCALL c_while( plexem curlex );
250 plexem STDCALL c_dowhile( plexem curlex );
251 
252 //----------------------------------------------------------------------------
253 //with.c
254 plexem STDCALL c_with( plexem curlex );
255 
256 #ifdef DOUT
257 #define D printf
258 #else
259 #define D /**////##/
260 #endif
261    #ifdef __cplusplus
262       }
263    #endif // __cplusplus
264 
265 #endif // _FUNC_
266 
Редактировать