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.g

   operlist.txt

   out.c

   out.h

   subfunc.c

   switch.c

   type.c

   type.h

   vars.c

   while.c

   with.c

Реклама

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

source\src\compiler\operlist.g
  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 
Редактировать