OpenCores
URL https://opencores.org/ocsvn/c16/c16/trunk

Subversion Repositories c16

[/] [c16/] [trunk/] [compiler/] [Node.hh] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jsauermann
// Node.hh
2
#ifndef __NODE_HH_DEFINED__
3
#define __NODE_HH_DEFINED__
4
 
5
#include 
6
#include "List.hh"
7
 
8
//-----------------------------------------------------------------------------
9
 
10
class TypeSpecifier;
11
class DeclItem;
12
class Initializer;
13
class TypeName;
14
class Expression;
15
 
16
const char * GetDeclaredName(Declarator * decl);
17
ParameterDeclarationList * GetParameters(Declarator * decl);
18
bool         IsFunPtr(Declarator * decl);
19
bool         IsPointer(Declarator * decl);
20
Expression * ArrayLength(Declarator * decl);
21
void         SetArrayLength(Declarator * decl, int len);
22
bool         IsFunction(Declarator * decl);
23
bool         IsArray(Declarator * decl);
24
 
25
enum SUW { SB, UB, WO };
26
 
27
//-----------------------------------------------------------------------------
28
class Constant : public Node
29
{
30
public:
31
   Constant(const char * name)
32
   : Node(name)
33
   {};
34
 
35
   virtual void EmitValue_RR(FILE * out) = 0;
36
   virtual void EmitValue_LL(FILE * out) = 0;
37
};
38
//-----------------------------------------------------------------------------
39
class NumericConstant : public Constant
40
{
41
public:
42
   NumericConstant(const char * txt);
43
   NumericConstant(int val, int siz = 0)
44
   : Constant("NumericConstant"),
45
     value(val),
46
     size(siz)
47
     {};
48
 
49
   virtual void EmitValue_RR(FILE * out);
50
   virtual void EmitValue_LL(FILE * out);
51
   int GetValue() const   { return value; };
52
   int GetSize()  const   { return size;  };
53
 
54
   void Negate()       { value = -value; };
55
   void Complement()   { value = ~value; };
56
   void LogNot()       { if (value)   value = 0;   else value = -1; };
57
 
58
private:
59
   int value;
60
   int size;
61
};
62
//-----------------------------------------------------------------------------
63
class StringConstant : public Constant
64
{
65
public:
66
   StringConstant();
67
   ~StringConstant();
68
 
69
   virtual void EmitValue_RR(FILE * out);
70
   virtual void EmitValue_LL(FILE * out);
71
   void operator += (char txt);
72
   StringConstant * operator & (StringConstant * other);
73
   void operator += (const char * txt)
74
      { while (*txt)   *this += *txt++; };
75
 
76
   int GetStringNumber() const   { return string_number; };
77
   int GetLength()       const   { return value_len;     };
78
   char * Kill()
79
      { char * ret = buffer;   buffer = 0;   delete this;   return ret; };
80
 
81
   void  EmitAndRemove(FILE * out, int length);
82
 
83
   static void  EmitAll(FILE * out);
84
 
85
private:
86
   char       * buffer;
87
   int          buffer_len;
88
   int          value_len;
89
   int          string_number;
90
 
91
   static int str_count;
92
   enum { MAX_STRINGS = 5000 };
93
   static StringConstant * all_strings[MAX_STRINGS];
94
};
95
//-----------------------------------------------------------------------------
96
// how an expression is created...
97
// //
98
enum BinExprType
99
{
100
   // binary
101
   ET_LIST,             // expr  ,  expr
102
   ET_ARGLIST,          // expr  ,  expr in function argument
103
   ET_ASSIGN,           // expr  =  expr
104
   ET_MULT_ASSIGN,      // expr *=  expr
105
   ET_DIV_ASSIGN,       // expr /=  expr
106
   ET_MOD_ASSIGN,       // expr %=  expr
107
   ET_ADD_ASSIGN,       // expr +=  expr
108
   ET_SUB_ASSIGN,       // expr -=  expr
109
   ET_LEFT_ASSIGN,      // expr <<= expr
110
   ET_RIGHT_ASSIGN,     // expr >>= expr
111
   ET_AND_ASSIGN,       // expr &=  expr
112
   ET_XOR_ASSIGN,       // expr ^=  expr
113
   ET_OR_ASSIGN,        // expr |=  expr
114
   ET_BIT_OR,           // expr |   expr
115
   ET_BIT_AND,          // expr &   expr
116
   ET_BIT_XOR,          // expr ^   expr
117
   ET_LOG_OR,           // expr ||  expr
118
   ET_LOG_AND,          // expr &&  expr
119
   ET_EQUAL,            // expr ==  expr
120
   ET_NOT_EQUAL,        // expr !=  expr
121
   ET_LESS_EQUAL,       // expr <=  expr
122
   ET_LESS,             // expr <   expr
123
   ET_GREATER_EQUAL,    // expr >=  expr
124
   ET_GREATER,          // expr >   expr
125
   ET_LEFT,             // expr <<  expr
126
   ET_RIGHT,            // expr >>  expr
127
   ET_ADD,              // expr +   expr
128
   ET_SUB,              // expr -   expr
129
   ET_MULT,             // expr *   expr
130
   ET_DIV,              // expr /   expr
131
   ET_MOD,              // expr %   expr
132
   ET_ELEMENT,          // expr [   expr ]
133
   ET_FUNCALL           // expr (   ... )
134
};
135
 
136
enum UnaExprType
137
{
138
   ET_CAST,             // (type)   expr
139
   ET_ADDRESS,          //      &   expr
140
   ET_CONTENT,          //      *   expr
141
   ET_CONJUGATE,        //      +   expr
142
   ET_NEGATE,           //      -   expr
143
   ET_COMPLEMENT,       //      ~   expr
144
   ET_LOG_NOT,          //      !   expr
145
   ET_POSTINC,          //      ++  expr
146
   ET_POSTDEC,          //      --  expr
147
   ET_PREINC,           //      ++  expr
148
   ET_PREDEC            //      --  expr
149
};
150
 
151
class Expression : public Node
152
{
153
public:
154
   Expression(const char * nodename)
155
   : Node(nodename),
156
     type_name(0)
157
   {};
158
 
159
   virtual void Emit(FILE * out) = 0;
160
   virtual void Emit_to_ll(FILE * out)   { assert(0); };
161
           void EmitCall(FILE * out, Expression * right);
162
   virtual void EmitInitialization(FILE * out, int size);
163
   virtual void EmitAddress(FILE * out);
164
   virtual void AddAddress(FILE * out);
165
   virtual int  EmitPush(FILE * out, ParameterDeclarationList * params);
166
   virtual void EmitAssign(FILE * out)   { assert(0); };
167
   virtual int  GetParaLength() const    { return 1; };
168
 
169
   virtual bool IsConstant() const          { return false; };
170
   virtual bool IsNumericConstant() const   { return false; };
171
   virtual bool IsStringConstant() const    { return false; };
172
   virtual bool IsVariable() const          { return false; };
173
   virtual const char * GetVarname() const  { return 0;     };
174
   virtual int  GetConstantNumericValue() const;
175
   virtual StringConstant * GetStringConstant() const;
176
   virtual      TypeName * FunReturnType();
177
   virtual      TypeName * SetType() = 0;
178
   virtual SUW  GetSUW();
179
   void SetType(TypeName * t);
180
 
181
   bool       IsPointer();
182
   bool       IsArray();
183
   int        PointeeSize();
184
   int        GetSize();
185
   TypeName * GetType();
186
   bool       IsUnsigned();
187
   int        FunReturnSize();
188
 
189
   static const char * GetPrettyName(const char * pretty);
190
 
191
   virtual Expression * OptNegate()        { assert(0); };
192
   virtual Expression * OptComplement()    { assert(0); };
193
   virtual Expression * OptLogNot()        { assert(0); };
194
 
195
private:
196
   TypeName *  type_name;
197
};
198
//-----------------------------------------------------------------------------
199
class IdentifierExpression : public Expression
200
{
201
public:
202
   static Expression * New(const char * s);
203
 
204
   virtual void  Emit(FILE * out);
205
   virtual void  EmitAssign(FILE * out);
206
   virtual void  Emit_to_ll(FILE * out);
207
   virtual       TypeName * SetType();
208
 
209
   virtual bool             IsVariable() const   { return true;    };
210
   virtual const char *     GetVarname() const   { return varname; };
211
   virtual void             EmitAddress(FILE * out);
212
   virtual void             EmitInitialization(FILE * out, int size);
213
   virtual void             AddAddress(FILE * out);
214
   virtual TypeName *       FunReturnType();
215
 
216
private:
217
   IdentifierExpression(const char * s)
218
   : Expression("Expression (variable name)"),
219
     varname(s)
220
   {};
221
 
222
   const char * varname;
223
};
224
//-----------------------------------------------------------------------------
225
class MemberExpression : public Expression
226
{
227
public:
228
   MemberExpression(bool is_pointer, Expression * r, const char * s);
229
 
230
   virtual void  Emit(FILE * out);
231
   virtual void EmitAddress(FILE * out);
232
   void EmitAddress(FILE * out, bool content);
233
   virtual       TypeName * SetType();
234
 
235
private:
236
   Expression * left;
237
   const char * membername;
238
};
239
//-----------------------------------------------------------------------------
240
class StringExpression : public Expression
241
{
242
public:
243
   StringExpression(StringConstant * s);
244
 
245
   virtual void  Emit(FILE * out);
246
   virtual void EmitAddress(FILE * out);
247
   virtual void  Emit_to_ll(FILE * out);
248
   virtual       TypeName * SetType();
249
   virtual void  EmitInitialization(FILE * out, int size);
250
 
251
   virtual bool  IsConstant()       const   { return true; };
252
   virtual bool  IsStringConstant() const   { return true; };
253
   virtual StringConstant * GetStringConstant() const
254
      { return string_constant; }
255
 
256
private:
257
   StringConstant * string_constant;
258
};
259
//-----------------------------------------------------------------------------
260
class NumericExpression : public Expression
261
{
262
public:
263
   NumericExpression(NumericConstant * n);
264
   NumericExpression(TypeName * t);
265
   NumericExpression(Expression * r);
266
   NumericExpression(int value);
267
 
268
   virtual void Emit(FILE * out);
269
   virtual void Emit_to_ll(FILE * out);
270
   virtual bool IsConstant()        const   { return true; };
271
   virtual bool IsNumericConstant() const   { return true; };
272
   virtual int  GetConstantNumericValue() const;
273
   virtual       TypeName * SetType();
274
   virtual void EmitInitialization(FILE * out, int size);
275
   static const char * GetPretty(int value);
276
 
277
   virtual Expression * OptNegate();
278
   virtual Expression * OptComplement();
279
   virtual Expression * OptLogNot();
280
 
281
private:
282
   NumericConstant * int_value;
283
};
284
//-----------------------------------------------------------------------------
285
class CondExpression : public Expression
286
{
287
public:
288
   CondExpression(Expression * l, Expression * m, Expression * r)
289
   : Expression("Expression (l ? m : r)"),
290
     left(l),
291
     middle(m),
292
     right(r)
293
   {};
294
 
295
   virtual void Emit(FILE * out);
296
   virtual       TypeName * SetType();
297
 
298
private:
299
   Expression      * left;
300
   Expression      * middle;
301
   Expression      * right;
302
};
303
//-----------------------------------------------------------------------------
304
class BinaryExpression : public Expression
305
{
306
public:
307
   static Expression * New(BinExprType et, Expression * l, Expression * r);
308
 
309
   virtual void Emit(FILE * out);
310
   virtual       TypeName * SetType();
311
   virtual void EmitAddress(FILE * out);
312
 
313
   TypeName * MaxType(Expression * l, Expression * r);
314
 
315
   static const char * GetPretty(BinExprType expr_type);
316
   static BinExprType  MapAssign(BinExprType et);
317
 
318
protected:
319
   BinaryExpression(BinExprType et, Expression * l, Expression * r);
320
   BinExprType       expr_type;
321
   Expression      * left;
322
   Expression      * right;
323
};
324
//-----------------------------------------------------------------------------
325
class ArgListExpression : public BinaryExpression
326
{
327
public:
328
   ArgListExpression(Expression * l, Expression * r)
329
   : BinaryExpression(ET_ARGLIST, l, r)
330
   {};
331
 
332
   virtual void Emit(FILE * out)  {};   // done vy EmitPush()
333
   virtual int  EmitPush(FILE * out, ParameterDeclarationList * params);
334
   virtual int  GetParaLength() const;
335
   virtual       TypeName * SetType();
336
};
337
//-----------------------------------------------------------------------------
338
class AdditionExpression : public BinaryExpression
339
{
340
public:
341
   static Expression * New(Expression * l, Expression * r);
342
 
343
   virtual void Emit(FILE * out);
344
   virtual       TypeName * SetType();
345
 
346
private:
347
   AdditionExpression(Expression * l, Expression * r)
348
   : BinaryExpression(ET_ADD, l, r)
349
   {};
350
};
351
//-----------------------------------------------------------------------------
352
class SubtractionExpression : public BinaryExpression
353
{
354
public:
355
   static Expression * New(Expression * l, Expression * r);
356
 
357
   virtual void Emit(FILE * out);
358
   virtual       TypeName * SetType();
359
 
360
private:
361
   SubtractionExpression(Expression * l, Expression * r)
362
   : BinaryExpression(ET_SUB, l, r)
363
   {};
364
};
365
//-----------------------------------------------------------------------------
366
class UnaryExpression : public Expression
367
{
368
public:
369
   UnaryExpression(TypeName * t, Expression * r);
370
 
371
   virtual void Emit(FILE * out);
372
   virtual void EmitAddress(FILE * out);
373
   virtual void EmitInitialization(FILE * out, int size);
374
   virtual       TypeName * SetType();
375
 
376
   static const char * GetPretty(UnaExprType expr_type);
377
   static Expression * New(UnaExprType et, Expression * r);
378
 
379
private:
380
   UnaryExpression(UnaExprType et, Expression * r)
381
   : Expression(GetPrettyName(GetPretty(et))),
382
     expr_type(et),
383
     right(r)
384
   {};
385
 
386
   UnaExprType   expr_type;
387
   Expression  * right;
388
};
389
//-----------------------------------------------------------------------------
390
class AsmExpression : public Expression
391
{
392
public:
393
   AsmExpression(StringConstant * string);
394
 
395
   virtual void Emit(FILE * out);
396
   virtual       TypeName * SetType();
397
 
398
private:
399
     char * asm_string;
400
};
401
//-----------------------------------------------------------------------------
402
enum Specifier
403
{
404
   // storage class
405
   SC_TYPEDEF   = 0x00000001,
406
   SC_EXTERN    = 0x00000002,
407
   SC_STATIC    = 0x00000004,
408
   SC_AUTO      = 0x00000008,
409
   SC_REGISTER  = 0x00000010,
410
   SC_MASK      = SC_TYPEDEF | SC_EXTERN | SC_STATIC  | SC_AUTO  | SC_REGISTER,
411
 
412
   // type qualifiers
413
   TQ_CONST     = 0x00000100,
414
   TQ_VOLATILE  = 0x00000200,
415
   TQ_MASK      = TQ_CONST | TQ_VOLATILE,
416
 
417
   // type specifiers
418
   TS_SIGNED    = 0x00001000,
419
   TS_UNSIGNED  = 0x00002000,
420
   TS_SIGN_MASK = TS_SIGNED | TS_UNSIGNED,
421
 
422
   TS_VOID      = 0x00010000,
423
   TS_CHAR      = 0x00020000,
424
   TS_SHORT     = 0x00040000,
425
   TS_INT       = 0x00080000,
426
   TS_LONG      = 0x00100000,
427
   TS_FLOAT     = 0x00200000,
428
   TS_DOUBLE    = 0x00400000,
429
   TS_STRUCT    = 0x00800000,
430
   TS_UNION     = 0x01000000,
431
   TS_ENUM      = 0x02000000,
432
   TS_TYPE_NAME = 0x04000000,
433
   TS_MASK      = TS_VOID  | TS_CHAR   | TS_SHORT  | TS_INT | TS_LONG |
434
                  TS_FLOAT | TS_DOUBLE | TS_STRUCT |
435
                  TS_UNION | TS_ENUM   | TS_TYPE_NAME,
436
   TS_NUMERIC   = TS_CHAR  | TS_SHORT  | TS_INT    | TS_LONG |
437
                  TS_FLOAT | TS_DOUBLE | TS_ENUM,
438
};
439
//-----------------------------------------------------------------------------
440
class Ptr : public Node
441
{
442
public:
443
   Ptr(TypeSpecifier * ds)
444
   : Node("Ptr"),
445
     decl_specs(ds)
446
     {};
447
 
448
   virtual void Emit(FILE * out);
449
   int Print(FILE * out) const;
450
 
451
private:
452
   TypeSpecifier * decl_specs;
453
};
454
//-----------------------------------------------------------------------------
455
class Identifier : public Node
456
{
457
public:
458
   Identifier(const char * n)
459
   : Node("Identifier"),
460
     name(n)
461
     {};
462
 
463
private:
464
   const char * name;
465
};
466
//-----------------------------------------------------------------------------
467
class Initializer : public Node
468
{
469
public:
470
   Initializer(Expression * expr)
471
   : Node("Initializer (skalar)"),
472
     skalar_value(expr),
473
     array_value(0)
474
     {};
475
 
476
   Initializer(InitializerList * list)
477
   : Node("Initializer (vector)"),
478
     skalar_value(0),
479
     array_value(list)
480
     {};
481
 
482
   virtual void Emit(FILE * out);
483
   virtual void EmitValue(FILE * out, TypeName * tn);
484
 
485
   int  InitAutovar(FILE * out, SUW suw);
486
 
487
private:
488
   Expression      * skalar_value;
489
   InitializerList * array_value;
490
};
491
//-----------------------------------------------------------------------------
492
class ParameterDeclaration : public Node
493
{
494
public:
495
   ParameterDeclaration(TypeSpecifier * ds, Declarator * dec);
496
 
497
   virtual void Emit(FILE * out);
498
 
499
   int AllocateParameters(int position);
500
   const char * GetDeclaredName(int skip);
501
   TypeName * GetTypeName() const   { return type; };
502
   bool       IsEllipsis() const    { return isEllipsis; };
503
   ParameterDeclaration * SetEllipsis() { isEllipsis = true; return this; };
504
 
505
private:
506
   TypeName * type;
507
   bool       isEllipsis;
508
};
509
//-----------------------------------------------------------------------------
510
enum DECL_WHAT
511
{
512
   DECL_NAME    = 1,
513
   DECL_FUNPTR  = 2,
514
   DECL_ARRAY   = 3,
515
   DECL_FUN     = 4,
516
   DECL_POINTER = 5
517
};
518
 
519
class DeclItem : public Node
520
{
521
public:
522
   DeclItem(DECL_WHAT w)
523
   : Node("DeclItem"),
524
     what(w),
525
     name(0),
526
     funptr(0),
527
     array_size(0),
528
     fun_params(0),
529
     fun_identifiers(0),
530
     pointer(0)
531
     {};
532
 
533
   DeclItem(const char * n)
534
   : Node("DeclItem"),
535
     what(DECL_NAME),
536
     name(n),
537
     funptr(0),
538
     array_size(0),
539
     fun_params(0),
540
     fun_identifiers(0),
541
     pointer(0)
542
     {};
543
 
544
   DeclItem(Declarator * fp)
545
   : Node("DeclItem"),
546
     what(DECL_FUNPTR),
547
     name(0),
548
     funptr(fp),
549
     array_size(0),
550
     fun_params(0),
551
     fun_identifiers(0),
552
     pointer(0)
553
     {};
554
 
555
   DeclItem(Expression * ep)
556
   : Node("DeclItem"),
557
     what(DECL_ARRAY),
558
     name(0),
559
     funptr(0),
560
     array_size(ep),
561
     fun_params(0),
562
     fun_identifiers(0),
563
     pointer(0)
564
     {};
565
 
566
   DeclItem(ParameterDeclarationList * pl)
567
   : Node("DeclItem"),
568
     what(DECL_FUN),
569
     name(0),
570
     funptr(0),
571
     array_size(0),
572
     fun_params(pl),
573
     fun_identifiers(0),
574
     pointer(0)
575
     {};
576
 
577
   DeclItem(IdentifierList * il)
578
   : Node("DeclItem"),
579
     what(DECL_FUN),
580
     name(0),
581
     funptr(0),
582
     array_size(0),
583
     fun_params(0),
584
     fun_identifiers(il),
585
     pointer(0)
586
     {};
587
 
588
   DeclItem(Pointer * p)
589
   : Node("DeclItem"),
590
     what(DECL_POINTER),
591
     name(0),
592
     funptr(0),
593
     array_size(0),
594
     fun_params(0),
595
     fun_identifiers(0),
596
     pointer(p)
597
     {};
598
 
599
   virtual void Emit(FILE * out);
600
   int Print(FILE * out) const;
601
 
602
   const char * GetName()      const   { return name;       };
603
   DECL_WHAT    GetWhat()      const   { return what;       };
604
   Declarator * GetFunptr()    const   { return funptr;     };
605
   Pointer    * GetPointer()   const   { return pointer;    };
606
   Expression * GetArraySize() const   { return array_size; };
607
   void         SetArraySize(int n);
608
   ParameterDeclarationList * GetParameters() const   { return fun_params; };
609
 
610
private:
611
   const DECL_WHAT            what;
612
   const char               * name;
613
   Declarator               * funptr;
614
   Expression               * array_size;
615
   ParameterDeclarationList * fun_params;
616
   IdentifierList           * fun_identifiers;
617
   Pointer                  * pointer;
618
};
619
//-----------------------------------------------------------------------------
620
class Enumerator : public Node
621
{
622
public:
623
   Enumerator(const char * n, Expression * v)
624
   : Node("Enumerator"),
625
     name(n),
626
     value(v)
627
   {};
628
 
629
   virtual void Emit(FILE * out);
630
   static int current;
631
 
632
private:
633
   const char * name;
634
   Expression * value;
635
};
636
//-----------------------------------------------------------------------------
637
class StructDeclarator : public Node
638
{
639
public:
640
   StructDeclarator(Declarator * dcl, Expression * exp)
641
   : Node("StructDeclarator"),
642
     declarator(dcl),
643
     expression(exp),
644
     position(-1)
645
     {};
646
 
647
   virtual void Emit(FILE * out);
648
   int EmitMember(FILE * out, const char * struct_name,
649
        TypeSpecifier * tspec, int pos, bool is_union);
650
   TypeName * GetMemberType(TypeSpecifier * tspec, const char * member);
651
   int GetMemberPosition(const char * member) const;
652
   Declarator * GetDeclarator() const   { return declarator; };
653
   TypeName * FirstUnionMember(TypeSpecifier * tspec, int union_size) const;
654
   const char * GetMemberName() const;
655
 
656
private:
657
   Declarator * declarator;
658
   Expression * expression;   // : bitfield
659
   int          position;
660
};
661
//-----------------------------------------------------------------------------
662
class StructDeclaration : public Node
663
{
664
public:
665
   StructDeclaration(TypeSpecifier * ds, StructDeclaratorList * sdl)
666
   : Node("StructDeclaration"),
667
     decl_specifiers(ds),
668
     struct_decl_list(sdl),
669
     size(-1)
670
     { };
671
 
672
   int Emit(FILE * out, const char * struct_name, int pos, bool is_union);
673
   TypeName * GetMemberType(const char * struct_name, const char * member);
674
   int GetMemberPosition(const char * struct_name,
675
                         const char * member, bool is_union) const;
676
   int GetSize() const   { assert(size != -1);   return size; };
677
 
678
   TypeSpecifier        * GetSpecifier()   const { return decl_specifiers; };
679
   StructDeclaratorList * GetDeclarators() const { return struct_decl_list; };
680
   TypeName * FirstUnionMember(int size) const;
681
 
682
private:
683
   TypeSpecifier        * decl_specifiers;
684
   StructDeclaratorList * struct_decl_list;
685
   int size;
686
};
687
//-----------------------------------------------------------------------------
688
class TypeSpecifier : public Node
689
{
690
public:
691
   // all types
692
   TypeSpecifier(Specifier sp)
693
   : Node("TypeSpecifier (all)"),
694
     spec(sp),
695
     name(0),
696
     struct_decl_list(0),
697
     enum_list(0)
698
     {};
699
 
700
   // structs, unions, typedef(name)
701
   TypeSpecifier(Specifier sp, const char * n, StructDeclarationList * sdl);
702
 
703
   // enums
704
   TypeSpecifier(const char * n, EnumeratorList * el)
705
   : Node("TypeSpecifier (enum)"),
706
     spec(TS_ENUM),
707
     name(n),
708
     struct_decl_list(0),
709
     enum_list(el)
710
     {};
711
 
712
   virtual void Emit(FILE * out);
713
   int Print(FILE * out) const;
714
 
715
   TypeSpecifier * operator +(TypeSpecifier & other);
716
   TypeSpecifier * self()   { return this; };
717
 
718
   Specifier    GetType()    const   { return spec; };
719
   const char * GetName()    const   { return name; };
720
   StructDeclarationList * GetStructDecl() const
721
                                     { return struct_decl_list; };
722
   bool         IsUnsigned() const   { return spec & TS_UNSIGNED; };
723
 
724
   int          GetFunReturnSize(Declarator * decl) const;
725
   int          GetSize(Declarator * decl) const;
726
   int          GetBaseSize()              const;
727
   TypeName *   GetMemberType(const char * member);
728
   bool         IsNumericType() const;  // char, short, or int
729
   bool         IsUnion() const
730
      { if (spec & TS_UNION)    return true; return false; };
731
   bool             IsStruct() const
732
      { if (spec & TS_STRUCT)   return true; return false; };
733
 
734
private:
735
   Specifier               spec;                // all types
736
   const char            * name;                // enums, structs and unions
737
   StructDeclarationList * struct_decl_list;    // structs and unions
738
   EnumeratorList        * enum_list;           // enums
739
 
740
   static int anonymous_number;
741
};
742
//-----------------------------------------------------------------------------
743
class InitDeclarator : public Node
744
{
745
public:
746
   InitDeclarator(Declarator * decl, Initializer * init)
747
   : Node("InitDeclarator"),
748
     declarator(decl),
749
     initializer(init)
750
     {};
751
 
752
   virtual void Emit(FILE * out);
753
 
754
   Declarator * GetDeclarator() const   { return declarator; };
755
 
756
   const char * GetDeclaredName(int skip);
757
   void Allocate(FILE * out, TypeSpecifier * spec);
758
   int  EmitAutovars(FILE * out, TypeSpecifier * spec);
759
 
760
private:
761
   Declarator  * declarator;
762
   Initializer * initializer;
763
};
764
//-----------------------------------------------------------------------------
765
class Declaration : public Node
766
{
767
public:
768
   Declaration(TypeSpecifier * ds, InitDeclaratorList * il);
769
 
770
   virtual void Emit(FILE * out);
771
 
772
   void Allocate(FILE * out);
773
   int  EmitAutovars(FILE * out);
774
 
775
private:
776
   TypeSpecifier      * base_type;
777
   InitDeclaratorList * init_list;
778
};
779
//-----------------------------------------------------------------------------
780
class TypeName : public Node
781
{
782
public:
783
   TypeName(TypeSpecifier * ds, Declarator * ad);
784
   TypeName(Specifier sp);
785
 
786
   virtual void Emit(FILE * out);
787
   int Print(FILE * out) const;
788
 
789
   Declarator     * GetDeclarator()    const   { return abs_declarator; };
790
   TypeSpecifier  * GetTypeSpecifier() const   { return decl_spec;  };
791
   const char     * GetDeclaredName();
792
   TypeName       * GetFunReturnType();
793
 
794
   TypeName *       AddressOf() const;
795
   TypeName *       ContentOf() const;
796
   TypeName *       GetElementType() const;
797
   bool             IsNumericType() const;  // char, short, or int
798
   bool             IsPointer() const;
799
   Expression *     ArrayLength() const;
800
   void             SetArrayLength(int len);
801
   bool             IsStruct()    const;
802
   bool             IsUnion()     const;
803
   bool             IsArray()     const;
804
   int              GetPointeeSize() const;
805
   TypeName *       GetMemberType(const char * member);
806
   TypeName *       FirstUnionMember(int size) const;
807
 
808
   int GetFunReturnSize()
809
       { return decl_spec->GetFunReturnSize(abs_declarator); };
810
   int GetSize() const
811
       { return decl_spec->GetSize(abs_declarator); };
812
   SUW GetSUW();
813
   bool IsUnsigned() const;
814
   bool IsFunPtr() const
815
       { return ::IsFunPtr(abs_declarator); };
816
   ParameterDeclarationList * GetParameters() const
817
       { return ::GetParameters(abs_declarator); };
818
 
819
private:
820
   TypeSpecifier * decl_spec;
821
   Declarator    * abs_declarator;
822
};
823
//-----------------------------------------------------------------------------
824
class Statement : public Node
825
{
826
public:
827
   Statement(const char * ntype)
828
   : Node(ntype)
829
   {};
830
 
831
   virtual void Emit(FILE * out) = 0;
832
   virtual bool NotEmpty() const   { return true; };
833
   virtual bool EmitCaseJump(FILE * out, bool def, int loop, int size)
834
      { return false; };
835
};
836
//-----------------------------------------------------------------------------
837
class LabelStatement : public Statement
838
{
839
public:
840
   LabelStatement(const char * n, Statement * stat)
841
   : Statement("Label Statement"),
842
     label_name(n),
843
     statement(stat)
844
     {};
845
 
846
   virtual void Emit(FILE * out);
847
 
848
private:
849
   const char * label_name;
850
   Statement  * statement;
851
};
852
//-----------------------------------------------------------------------------
853
class CaseStatement : public Statement
854
{
855
public:
856
   CaseStatement(Expression * exp, Statement * stat)
857
   : Statement("case Statement"),
858
     case_value(exp),
859
     statement(stat)
860
     {};
861
 
862
   virtual void Emit(FILE * out);
863
   virtual bool EmitCaseJump(FILE * out, bool def, int loop, int size);
864
 
865
private:
866
   Expression * case_value;             // case, or 0 for default
867
   Statement  * statement;
868
};
869
//-----------------------------------------------------------------------------
870
class CompoundStatement : public Statement
871
{
872
public:
873
   CompoundStatement(DeclarationList * dl, StatementList * sl)
874
   : Statement("CompoundStatement"),
875
     decl_list(dl),
876
     stat_list(sl)
877
     {};
878
 
879
   virtual void Emit(FILE * out);
880
   virtual bool NotEmpty() const   { return decl_list || stat_list; };
881
   void EmitCaseJumps(FILE * out, int size);
882
 
883
   int  EmitAutovars(FILE * out);
884
 
885
private:
886
   DeclarationList * decl_list;
887
   StatementList   * stat_list;
888
};
889
//-----------------------------------------------------------------------------
890
class ExpressionStatement : public Statement
891
{
892
public:
893
   ExpressionStatement(Expression * expr)
894
   : Statement("ExpressionStatement"),
895
     expression(expr)
896
   {};
897
 
898
   virtual void Emit(FILE * out);
899
   virtual bool NotEmpty() const   { return expression; };
900
 
901
   Expression * GetExpression() const   { return expression; };
902
 
903
private:
904
   Expression * expression;
905
};
906
//-----------------------------------------------------------------------------
907
class SwitchStatement : public Statement
908
{
909
public:
910
   SwitchStatement(Expression * cond, CompoundStatement * cas)
911
   : Statement("SwitchStatement"),
912
     condition(cond),
913
     case_stat(cas)
914
   {};
915
 
916
   virtual void Emit(FILE * out);
917
 
918
private:
919
   Expression         * condition;
920
   CompoundStatement  * case_stat;
921
};
922
//-----------------------------------------------------------------------------
923
class IfElseStatement : public Statement
924
{
925
public:
926
   IfElseStatement(Expression * cond, Statement * ifs, Statement * els)
927
   : Statement("IfElseStatement"),
928
     condition(cond),
929
     if_stat(ifs),
930
     else_stat(els)
931
   {};
932
 
933
   virtual void Emit(FILE * out);
934
 
935
private:
936
   Expression * condition;
937
   Statement  * if_stat;
938
   Statement  * else_stat;
939
};
940
//-----------------------------------------------------------------------------
941
class DoWhileStatement : public Statement
942
{
943
public:
944
   DoWhileStatement(Statement * bdy, Expression * cond)
945
   : Statement("do while Statement"),
946
     condition(cond),
947
     body(bdy)
948
     {};
949
 
950
   virtual void Emit(FILE * out);
951
 
952
private:
953
   Expression           * condition;
954
   Statement            * body;
955
};
956
//-----------------------------------------------------------------------------
957
class WhileStatement : public Statement
958
{
959
public:
960
   WhileStatement(Expression * cond, Statement * bdy)
961
   : Statement("while Statement"),
962
     condition(cond),
963
     body(bdy)
964
     {};
965
 
966
   virtual void Emit(FILE * out);
967
 
968
private:
969
   Expression           * condition;
970
   Statement            * body;
971
};
972
//-----------------------------------------------------------------------------
973
class ForStatement : public Statement
974
{
975
public:
976
 
977
   ForStatement(ExpressionStatement * f1, ExpressionStatement * f2,
978
                      Expression * f3, Statement * bdy)
979
   : Statement("for Statement"),
980
     for_1(f1),
981
     for_2(f2),
982
     for_3(f3),
983
     body(bdy)
984
     {};
985
 
986
   virtual void Emit(FILE * out);
987
 
988
private:
989
   ExpressionStatement  * for_1;
990
   ExpressionStatement  * for_2;
991
   Expression           * for_3;
992
   Statement            * body;
993
};
994
//-----------------------------------------------------------------------------
995
class GotoStatement : public Statement
996
{
997
public:
998
   GotoStatement(const char * lab)
999
   : Statement("goto Statement"),
1000
     label_name(lab)
1001
     {};
1002
 
1003
   virtual void Emit(FILE * out);
1004
 
1005
private:
1006
   const char * label_name;
1007
};
1008
//-----------------------------------------------------------------------------
1009
class ReturnStatement : public Statement
1010
{
1011
public:
1012
   ReturnStatement(Expression * expr)
1013
   : Statement("return Statement"),
1014
     retval(expr)
1015
     {};
1016
 
1017
   virtual void Emit(FILE * out);
1018
 
1019
private:
1020
   Expression * retval;
1021
};
1022
//-----------------------------------------------------------------------------
1023
class ContStatement : public Statement
1024
{
1025
public:
1026
   ContStatement(bool do_brk)
1027
   : Statement("break/continue Statement"),
1028
     do_break(do_brk)
1029
     {};
1030
 
1031
   virtual void Emit(FILE * out);
1032
 
1033
private:
1034
   bool do_break;   // true for break, false for continue
1035
};
1036
//-----------------------------------------------------------------------------
1037
class FunctionDefinition : public Node
1038
{
1039
public:
1040
   FunctionDefinition(TypeSpecifier * ds, Declarator * decl,
1041
                      DeclarationList * dl);
1042
 
1043
   virtual void Emit(FILE * out);
1044
 
1045
   FunctionDefinition * SetBody(CompoundStatement * bdy)
1046
      { body = bdy;  return this; };
1047
 
1048
private:
1049
   TypeName          * ret_type;
1050
   Declarator        * fun_declarator;
1051
   DeclarationList   * decl_list;
1052
   CompoundStatement * body;
1053
};
1054
//-----------------------------------------------------------------------------
1055
 
1056
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.