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