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: operlist 26.10.06 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( algen )
13 *
14 * Summary: The program generates syslex.h and syslex.с files
15 *
16 ******************************************************************************/
17
18 include : $"..\..\lib\gt\gt.g"
19 include : $"..\bytecode\cmdlist.g"
20
21 /*-----------------------------------------------------------------------------
22 *
23 * ID: operlist_h 26.10.06 0.0.A.
24 *
25 * Summary: The .h output function.
26 *
27 -----------------------------------------------------------------------------*/
28 text operlist_h( arr aopers of str, arr acom of str, arr amflgs of str, arr aflgscom of str )
29 \@headerout( "operlist_h", "Generated with 'operlist' program",
30 "This file contains a list of the compiler's or VM's messages.")
31 #ifndef _OPERLIST_
32 #define _OPERLIST_
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif // __cplusplus
37
38 #include "../common/types.h"
39
40 //Флаги операций для таблицы операций
41 \{
42 uint i
43
44 fornum i, *amflgs
45 {
46 @("#define "@amflgs[i]@"\t\t"@"0x".hexu( 1<<i )@"\t\t//"@aflgscom[i]@"\l")
47 //@(amflgs[i]@"xx")
48 }
49 }
50
51 #define OPERCOUNT \( *aopers ) //Количество операций
52
53 //Идентификаторы операций
54 enum {
55 \{
56
57 fornum i = 0, *aopers
58 {
59 @" \(aopers[ i ] ),\t\t // 0x\( hex2stru( i )) \"\( acom[ i ] )\"\l"
60 }
61 }
62 };
63
64 //Структура для описания операций
65 typedef struct {
66 ubyte before; // Приоритет на входе в стэк операций
67 ubyte after; // Приоритет после вставки в стэк операций
68 ushort flgs; // Тип операции OPER_
69 } soper, * psoper;
70
71 extern const soper opers[];
72 extern const ubyte operlexlist[];
73 #ifdef __cplusplus
74 }
75 #endif // __cplusplus
76
77 #endif // _OPERLIST_
78 \!
79
80
81 func str buf2const( str name, str res, buf b )
82 {
83 uint i
84 uint lnum
85 res = "const ubyte \(name)[] = { "
86 fornum i=0, *b
87 {
88 if b[i]
89 {
90 res += "'"
91 res.appendch( b[i])
92 res += "'"
93 }
94 else
95 {
96 res += "0"
97 }
98 res +=", "
99 if *res - lnum > 75
100 {
101 res += "\l"
102 lnum = *res
103 }
104 }
105 res += "};\l"
106 return res
107 }
108
109 /*-----------------------------------------------------------------------------
110 *
111 * ID: operlist_c 26.10.06 0.0.A.
112 *
113 * Summary: The .c output function.
114 *
115 -----------------------------------------------------------------------------*/
116
117 text operlist_c( buf blex, arr aprin of str, arr aprout of str, arr atblflgs of str, arr aopers of str, arr acom of str )
118 \@headerout( "operlist_c", "Generated with 'operlist' program", "")
119
120 #include "operlist.h"
121
122 //Таблица приоритетов и типов операций
123 const soper opers[] = {
124 \{
125 uint i
126
127 fornum i, *atblflgs
128 {
129 @" { \( aprin[i] ), \( aprout[i] ), \(atblflgs[i]) },// '\( acom[ i ] )' \(aopers[i]) \l"
130 }
131 }
132 };
133
134 //Список строк операций
135 \{ str slex
136 @buf2const( "operlexlist", slex, blex)
137 }
138
139 \!
140
141 /*-----------------------------------------------------------------------------
142 *
143 * ID: opermain 26.10.06 0.0.A.ABKL
144 *
145 * Summary: The main function.
146 *
147 -----------------------------------------------------------------------------*/
148
149 func opermain<main>
150 {
151 str hout
152 gt opergt
153 // gtitems gtis
154
155 uint i,j
156 uint gtflgs, gttbl
157 arr aflgs of str //Массив типов флагов
158 arr amflgs of str //Массив типов флагов с приведенными именами
159 arr aflgscom of str //Комментарии к типам флагов
160 arr atblflgs of str //Массив наборов флагов для таблицы операций
161 arr aopers of str //Массив идентификаторов операций
162 arr aoperscom of str //Массив комментариев к идентификаторам операций
163 arr aprin of str //Массив входных приоритетов для таблицы операций
164 arr aprout of str //Массив выходных приоритетов для таблицы операций
165 buf blex //Строковые представления операций
166 uint flgwasundef //Последняя операция была undef
167
168 opergt.read( "operlist.gt" )
169
170 gtflgs as opergt.find("flags")
171 aflgs.expand( *gtflgs )
172 amflgs.expand( *gtflgs )
173 aflgscom.expand( *gtflgs )
174 foreach curf, gtflgs//.items//( gtis )
175 {
176 // curf as gtitem
177 aflgs[i] = curf.name
178 amflgs[i] = "OPF_" + curf.name
179 amflgs[i].upper()
180 aflgscom[i++] = curf.get( "comment" )
181 }
182
183 gttbl as opergt.find("tbl")
184 atblflgs.expand( *gttbl )
185 fornum i= 0, *atblflgs
186 {
187 atblflgs[i].clear()
188 }
189 print( "\(atblflgs[j] )\n" )
190 aopers.expand( *gttbl )
191 aoperscom.expand( *gttbl )
192 aprin.expand( *gttbl )
193 aprout.expand( *gttbl )
194 foreach cur, gttbl//.items( gtis )
195 {
196 // cur as gtitem
197 if cur.find( "prin" )
198 {
199 cur.get("prin",aprin[j])
200 }
201 else : aprin[j]="0"
202 if cur.find( "prout" )
203 {
204 cur.get("prout",aprout[j])
205 }
206 else : aprout[j]="0"
207 aopers[j] = "Op" + cur.name
208 aopers[j].uppersub( 2, 1 )
209 aoperscom[j] = cur.value
210 if flgwasundef && !cur.find( "post" )
211 {
212 blex += ""
213 }
214 else : blex += cur.value
215 fornum i=0, *aflgs
216 {
217 if cur.find( aflgs[i] )
218 {
219 if *atblflgs[j] : atblflgs[j]@" | "
220 atblflgs[j]@amflgs[i]
221 }
222 }
223 if cur.find( "undef" ) : flgwasundef = 1
224 else : flgwasundef = 0
225 j++
226 }
227
228 hout@operlist_h( aopers, aoperscom, amflgs, aflgscom )
229 hout.write( "operlist.h" )
230 hout.clear()
231 hout@operlist_c( blex, aprin, aprout, atblflgs, aopers, aoperscom )
232 hout.write( "operlist.c" )
233 congetch("Press any key...")
234 }
235