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

Subversion Repositories c16

[/] [c16/] [trunk/] [compiler/] [Node.hh] - Rev 26

Compare with Previous | Blame | View Log

// Node.hh
#ifndef __NODE_HH_DEFINED__
#define __NODE_HH_DEFINED__

#include <assert.h>
#include "List.hh"

//-----------------------------------------------------------------------------

class TypeSpecifier;
class DeclItem;
class Initializer;
class TypeName;
class Expression;

const char * GetDeclaredName(Declarator * decl);
ParameterDeclarationList * GetParameters(Declarator * decl);
bool         IsFunPtr(Declarator * decl);
bool         IsPointer(Declarator * decl);
Expression * ArrayLength(Declarator * decl);
void         SetArrayLength(Declarator * decl, int len);
bool         IsFunction(Declarator * decl);
bool         IsArray(Declarator * decl);

enum SUW { SB, UB, WO };

//-----------------------------------------------------------------------------
class Constant : public Node
{
public:
   Constant(const char * name)
   : Node(name)
   {};

   virtual void EmitValue_RR(FILE * out) = 0;
   virtual void EmitValue_LL(FILE * out) = 0;
};
//-----------------------------------------------------------------------------
class NumericConstant : public Constant
{
public:
   NumericConstant(const char * txt);
   NumericConstant(int val, int siz = 0)
   : Constant("NumericConstant"),
     value(val),
     size(siz)
     {};

   virtual void EmitValue_RR(FILE * out);
   virtual void EmitValue_LL(FILE * out);
   int GetValue() const   { return value; };
   int GetSize()  const   { return size;  };

   void Negate()       { value = -value; };
   void Complement()   { value = ~value; };
   void LogNot()       { if (value)   value = 0;   else value = -1; };

private:
   int value;
   int size;
};
//-----------------------------------------------------------------------------
class StringConstant : public Constant
{
public:
   StringConstant();
   ~StringConstant();

   virtual void EmitValue_RR(FILE * out);
   virtual void EmitValue_LL(FILE * out);
   void operator += (char txt);
   StringConstant * operator & (StringConstant * other);
   void operator += (const char * txt)
      { while (*txt)   *this += *txt++; };

   int GetStringNumber() const   { return string_number; };
   int GetLength()       const   { return value_len;     };
   char * Kill()
      { char * ret = buffer;   buffer = 0;   delete this;   return ret; };

   void  EmitAndRemove(FILE * out, int length);

   static void  EmitAll(FILE * out);

private:
   char       * buffer;
   int          buffer_len;
   int          value_len;
   int          string_number;

   static int str_count;
   enum { MAX_STRINGS = 5000 };
   static StringConstant * all_strings[MAX_STRINGS];
};
//-----------------------------------------------------------------------------
// how an expression is created...
// //
enum BinExprType
{
   // binary
   ET_LIST,             // expr  ,  expr
   ET_ARGLIST,          // expr  ,  expr in function argument
   ET_ASSIGN,           // expr  =  expr
   ET_MULT_ASSIGN,      // expr *=  expr
   ET_DIV_ASSIGN,       // expr /=  expr
   ET_MOD_ASSIGN,       // expr %=  expr
   ET_ADD_ASSIGN,       // expr +=  expr
   ET_SUB_ASSIGN,       // expr -=  expr
   ET_LEFT_ASSIGN,      // expr <<= expr
   ET_RIGHT_ASSIGN,     // expr >>= expr
   ET_AND_ASSIGN,       // expr &=  expr
   ET_XOR_ASSIGN,       // expr ^=  expr
   ET_OR_ASSIGN,        // expr |=  expr
   ET_BIT_OR,           // expr |   expr
   ET_BIT_AND,          // expr &   expr
   ET_BIT_XOR,          // expr ^   expr
   ET_LOG_OR,           // expr ||  expr
   ET_LOG_AND,          // expr &&  expr
   ET_EQUAL,            // expr ==  expr
   ET_NOT_EQUAL,        // expr !=  expr
   ET_LESS_EQUAL,       // expr <=  expr
   ET_LESS,             // expr <   expr
   ET_GREATER_EQUAL,    // expr >=  expr
   ET_GREATER,          // expr >   expr
   ET_LEFT,             // expr <<  expr
   ET_RIGHT,            // expr >>  expr
   ET_ADD,              // expr +   expr
   ET_SUB,              // expr -   expr
   ET_MULT,             // expr *   expr
   ET_DIV,              // expr /   expr
   ET_MOD,              // expr %   expr
   ET_ELEMENT,          // expr [   expr ]
   ET_FUNCALL           // expr (   ... )
};

enum UnaExprType
{
   ET_CAST,             // (type)   expr
   ET_ADDRESS,          //      &   expr
   ET_CONTENT,          //      *   expr
   ET_CONJUGATE,        //      +   expr
   ET_NEGATE,           //      -   expr
   ET_COMPLEMENT,       //      ~   expr
   ET_LOG_NOT,          //      !   expr
   ET_POSTINC,          //      ++  expr
   ET_POSTDEC,          //      --  expr
   ET_PREINC,           //      ++  expr
   ET_PREDEC            //      --  expr
};

class Expression : public Node
{
public:
   Expression(const char * nodename)
   : Node(nodename),
     type_name(0)
   {};

   virtual void Emit(FILE * out) = 0;
   virtual void Emit_to_ll(FILE * out)   { assert(0); };
           void EmitCall(FILE * out, Expression * right);
   virtual void EmitInitialization(FILE * out, int size);
   virtual void EmitAddress(FILE * out);
   virtual void AddAddress(FILE * out);
   virtual int  EmitPush(FILE * out, ParameterDeclarationList * params);
   virtual void EmitAssign(FILE * out)   { assert(0); };
   virtual int  GetParaLength() const    { return 1; };

   virtual bool IsConstant() const          { return false; };
   virtual bool IsNumericConstant() const   { return false; };
   virtual bool IsStringConstant() const    { return false; };
   virtual bool IsVariable() const          { return false; };
   virtual const char * GetVarname() const  { return 0;     };
   virtual int  GetConstantNumericValue() const;
   virtual StringConstant * GetStringConstant() const;
   virtual      TypeName * FunReturnType();
   virtual      TypeName * SetType() = 0;
   virtual SUW  GetSUW();
   void SetType(TypeName * t);

   bool       IsPointer();
   bool       IsArray();
   int        PointeeSize();
   int        GetSize();
   TypeName * GetType();
   bool       IsUnsigned();
   int        FunReturnSize();

   static const char * GetPrettyName(const char * pretty);

   virtual Expression * OptNegate()        { assert(0); };
   virtual Expression * OptComplement()    { assert(0); };
   virtual Expression * OptLogNot()        { assert(0); };

private:
   TypeName *  type_name;
};
//-----------------------------------------------------------------------------
class IdentifierExpression : public Expression
{
public:
   static Expression * New(const char * s);

   virtual void  Emit(FILE * out);
   virtual void  EmitAssign(FILE * out);
   virtual void  Emit_to_ll(FILE * out);
   virtual       TypeName * SetType();

   virtual bool             IsVariable() const   { return true;    };
   virtual const char *     GetVarname() const   { return varname; };
   virtual void             EmitAddress(FILE * out);
   virtual void             EmitInitialization(FILE * out, int size);
   virtual void             AddAddress(FILE * out);
   virtual TypeName *       FunReturnType();

private:
   IdentifierExpression(const char * s)
   : Expression("Expression (variable name)"),
     varname(s)
   {};

   const char * varname;
};
//-----------------------------------------------------------------------------
class MemberExpression : public Expression
{
public:
   MemberExpression(bool is_pointer, Expression * r, const char * s);

   virtual void  Emit(FILE * out);
   virtual void EmitAddress(FILE * out);
   void EmitAddress(FILE * out, bool content);
   virtual       TypeName * SetType();

private:
   Expression * left;
   const char * membername;
};
//-----------------------------------------------------------------------------
class StringExpression : public Expression
{
public:
   StringExpression(StringConstant * s);

   virtual void  Emit(FILE * out);
   virtual void EmitAddress(FILE * out);
   virtual void  Emit_to_ll(FILE * out);
   virtual       TypeName * SetType();
   virtual void  EmitInitialization(FILE * out, int size);

   virtual bool  IsConstant()       const   { return true; };
   virtual bool  IsStringConstant() const   { return true; };
   virtual StringConstant * GetStringConstant() const
      { return string_constant; }

private:
   StringConstant * string_constant;
};
//-----------------------------------------------------------------------------
class NumericExpression : public Expression
{
public:
   NumericExpression(NumericConstant * n);
   NumericExpression(TypeName * t);
   NumericExpression(Expression * r);
   NumericExpression(int value);

   virtual void Emit(FILE * out);
   virtual void Emit_to_ll(FILE * out);
   virtual bool IsConstant()        const   { return true; };
   virtual bool IsNumericConstant() const   { return true; };
   virtual int  GetConstantNumericValue() const;
   virtual       TypeName * SetType();
   virtual void EmitInitialization(FILE * out, int size);
   static const char * GetPretty(int value);

   virtual Expression * OptNegate();
   virtual Expression * OptComplement();
   virtual Expression * OptLogNot();

private:
   NumericConstant * int_value;
};
//-----------------------------------------------------------------------------
class CondExpression : public Expression
{
public:
   CondExpression(Expression * l, Expression * m, Expression * r)
   : Expression("Expression (l ? m : r)"),
     left(l),
     middle(m),
     right(r)
   {};

   virtual void Emit(FILE * out);
   virtual       TypeName * SetType();

private:
   Expression      * left;
   Expression      * middle;
   Expression      * right;
};
//-----------------------------------------------------------------------------
class BinaryExpression : public Expression
{
public:
   static Expression * New(BinExprType et, Expression * l, Expression * r);

   virtual void Emit(FILE * out);
   virtual       TypeName * SetType();
   virtual void EmitAddress(FILE * out);

   TypeName * MaxType(Expression * l, Expression * r);

   static const char * GetPretty(BinExprType expr_type);
   static BinExprType  MapAssign(BinExprType et);

protected:
   BinaryExpression(BinExprType et, Expression * l, Expression * r);
   BinExprType       expr_type;
   Expression      * left;
   Expression      * right;
};
//-----------------------------------------------------------------------------
class ArgListExpression : public BinaryExpression
{
public:
   ArgListExpression(Expression * l, Expression * r)
   : BinaryExpression(ET_ARGLIST, l, r)
   {};

   virtual void Emit(FILE * out)  {};   // done vy EmitPush()
   virtual int  EmitPush(FILE * out, ParameterDeclarationList * params);
   virtual int  GetParaLength() const;
   virtual       TypeName * SetType();
};
//-----------------------------------------------------------------------------
class AdditionExpression : public BinaryExpression
{
public:
   static Expression * New(Expression * l, Expression * r);

   virtual void Emit(FILE * out);
   virtual       TypeName * SetType();

private:
   AdditionExpression(Expression * l, Expression * r)
   : BinaryExpression(ET_ADD, l, r)
   {};
};
//-----------------------------------------------------------------------------
class SubtractionExpression : public BinaryExpression
{
public:
   static Expression * New(Expression * l, Expression * r);

   virtual void Emit(FILE * out);
   virtual       TypeName * SetType();

private:
   SubtractionExpression(Expression * l, Expression * r)
   : BinaryExpression(ET_SUB, l, r)
   {};
};
//-----------------------------------------------------------------------------
class UnaryExpression : public Expression
{
public:
   UnaryExpression(TypeName * t, Expression * r);

   virtual void Emit(FILE * out);
   virtual void EmitAddress(FILE * out);
   virtual void EmitInitialization(FILE * out, int size);
   virtual       TypeName * SetType();

   static const char * GetPretty(UnaExprType expr_type);
   static Expression * New(UnaExprType et, Expression * r);

private:
   UnaryExpression(UnaExprType et, Expression * r)
   : Expression(GetPrettyName(GetPretty(et))),
     expr_type(et),
     right(r)
   {};

   UnaExprType   expr_type;
   Expression  * right;
};
//-----------------------------------------------------------------------------
class AsmExpression : public Expression
{
public:
   AsmExpression(StringConstant * string);

   virtual void Emit(FILE * out);
   virtual       TypeName * SetType();

private:
     char * asm_string;
};
//-----------------------------------------------------------------------------
enum Specifier
{
   // storage class
   SC_TYPEDEF   = 0x00000001,
   SC_EXTERN    = 0x00000002,
   SC_STATIC    = 0x00000004,
   SC_AUTO      = 0x00000008,
   SC_REGISTER  = 0x00000010,
   SC_MASK      = SC_TYPEDEF | SC_EXTERN | SC_STATIC  | SC_AUTO  | SC_REGISTER,

   // type qualifiers
   TQ_CONST     = 0x00000100,
   TQ_VOLATILE  = 0x00000200,
   TQ_MASK      = TQ_CONST | TQ_VOLATILE,

   // type specifiers
   TS_SIGNED    = 0x00001000,
   TS_UNSIGNED  = 0x00002000,
   TS_SIGN_MASK = TS_SIGNED | TS_UNSIGNED,

   TS_VOID      = 0x00010000,
   TS_CHAR      = 0x00020000,
   TS_SHORT     = 0x00040000,
   TS_INT       = 0x00080000,
   TS_LONG      = 0x00100000,
   TS_FLOAT     = 0x00200000,
   TS_DOUBLE    = 0x00400000,
   TS_STRUCT    = 0x00800000,
   TS_UNION     = 0x01000000,
   TS_ENUM      = 0x02000000,
   TS_TYPE_NAME = 0x04000000,
   TS_MASK      = TS_VOID  | TS_CHAR   | TS_SHORT  | TS_INT | TS_LONG |
                  TS_FLOAT | TS_DOUBLE | TS_STRUCT |
                  TS_UNION | TS_ENUM   | TS_TYPE_NAME,
   TS_NUMERIC   = TS_CHAR  | TS_SHORT  | TS_INT    | TS_LONG |
                  TS_FLOAT | TS_DOUBLE | TS_ENUM,
};
//-----------------------------------------------------------------------------
class Ptr : public Node
{
public:
   Ptr(TypeSpecifier * ds)
   : Node("Ptr"),
     decl_specs(ds)
     {};

   virtual void Emit(FILE * out);
   int Print(FILE * out) const;
      
private:
   TypeSpecifier * decl_specs;
};
//-----------------------------------------------------------------------------
class Identifier : public Node
{
public:
   Identifier(const char * n)
   : Node("Identifier"),
     name(n)
     {};

private:
   const char * name;
};
//-----------------------------------------------------------------------------
class Initializer : public Node
{
public:
   Initializer(Expression * expr)
   : Node("Initializer (skalar)"),
     skalar_value(expr),
     array_value(0)
     {};

   Initializer(InitializerList * list)
   : Node("Initializer (vector)"),
     skalar_value(0),
     array_value(list)
     {};

   virtual void Emit(FILE * out);
   virtual void EmitValue(FILE * out, TypeName * tn);

   int  InitAutovar(FILE * out, TypeName * type);
   int  ElementCount() const;
      
private:
   Expression      * skalar_value;
   InitializerList * array_value;
};
//-----------------------------------------------------------------------------
class ParameterDeclaration : public Node
{
public:
   ParameterDeclaration(TypeSpecifier * ds, Declarator * dec);

   virtual void Emit(FILE * out);

   int AllocateParameters(int position);
   const char * GetDeclaredName(int skip);
   TypeName * GetTypeName() const   { return type; };
   bool       IsEllipsis() const    { return isEllipsis; };
   ParameterDeclaration * SetEllipsis() { isEllipsis = true; return this; };
      
private:
   TypeName * type;
   bool       isEllipsis;
};
//-----------------------------------------------------------------------------
enum DECL_WHAT
{
   DECL_NAME    = 1,
   DECL_FUNPTR  = 2,
   DECL_ARRAY   = 3,
   DECL_FUN     = 4,
   DECL_POINTER = 5
};

class DeclItem : public Node
{
public:
   DeclItem(DECL_WHAT w)
   : Node("DeclItem"),
     what(w),
     name(0),
     funptr(0),
     array_size(0),
     fun_params(0),
     fun_identifiers(0),
     pointer(0)
     {};

   DeclItem(const char * n)
   : Node("DeclItem"),
     what(DECL_NAME),
     name(n),
     funptr(0),
     array_size(0),
     fun_params(0),
     fun_identifiers(0),
     pointer(0)
     {};

   DeclItem(Declarator * fp)
   : Node("DeclItem"),
     what(DECL_FUNPTR),
     name(0),
     funptr(fp),
     array_size(0),
     fun_params(0),
     fun_identifiers(0),
     pointer(0)
     {};

   DeclItem(Expression * ep)
   : Node("DeclItem"),
     what(DECL_ARRAY),
     name(0),
     funptr(0),
     array_size(ep),
     fun_params(0),
     fun_identifiers(0),
     pointer(0)
     {};

   DeclItem(ParameterDeclarationList * pl)
   : Node("DeclItem"),
     what(DECL_FUN),
     name(0),
     funptr(0),
     array_size(0),
     fun_params(pl),
     fun_identifiers(0),
     pointer(0)
     {};

   DeclItem(IdentifierList * il)
   : Node("DeclItem"),
     what(DECL_FUN),
     name(0),
     funptr(0),
     array_size(0),
     fun_params(0),
     fun_identifiers(il),
     pointer(0)
     {};

   DeclItem(Pointer * p)
   : Node("DeclItem"),
     what(DECL_POINTER),
     name(0),
     funptr(0),
     array_size(0),
     fun_params(0),
     fun_identifiers(0),
     pointer(p)
     {};

   virtual void Emit(FILE * out);
   int Print(FILE * out) const;
      
   const char * GetName()      const   { return name;       };
   DECL_WHAT    GetWhat()      const   { return what;       };
   Declarator * GetFunptr()    const   { return funptr;     };
   Pointer    * GetPointer()   const   { return pointer;    };
   Expression * GetArraySize() const   { return array_size; };
   void         SetArraySize(int n);
   ParameterDeclarationList * GetParameters() const   { return fun_params; };

private:
   const DECL_WHAT            what;
   const char               * name;
   Declarator               * funptr;
   Expression               * array_size;
   ParameterDeclarationList * fun_params;
   IdentifierList           * fun_identifiers;
   Pointer                  * pointer;
};
//-----------------------------------------------------------------------------
class Enumerator : public Node
{
public:
   Enumerator(const char * n, Expression * v)
   : Node("Enumerator"),
     name(n),
     value(v)
   {};

   virtual void Emit(FILE * out);
   static int current;

private:
   const char * name;
   Expression * value;
};
//-----------------------------------------------------------------------------
class StructDeclarator : public Node
{
public:
   StructDeclarator(Declarator * dcl, Expression * exp)
   : Node("StructDeclarator"),
     declarator(dcl),
     expression(exp),
     position(-1)
     {};

   virtual void Emit(FILE * out);
   int EmitMember(FILE * out, const char * struct_name,
        TypeSpecifier * tspec, int pos, bool is_union);
   TypeName * GetMemberType(TypeSpecifier * tspec, const char * member);
   int GetMemberPosition(const char * member) const;
   Declarator * GetDeclarator() const   { return declarator; };
   TypeName * FirstUnionMember(TypeSpecifier * tspec, int union_size) const;
   const char * GetMemberName() const;

private:
   Declarator * declarator;
   Expression * expression;   // : bitfield
   int          position;
};
//-----------------------------------------------------------------------------
class StructDeclaration : public Node
{
public:
   StructDeclaration(TypeSpecifier * ds, StructDeclaratorList * sdl)
   : Node("StructDeclaration"),
     decl_specifiers(ds),
     struct_decl_list(sdl),
     size(-1)
     { };

   int Emit(FILE * out, const char * struct_name, int pos, bool is_union);
   TypeName * GetMemberType(const char * struct_name, const char * member);
   TypeName * GetMemberType(int pos);
   int GetMemberPosition(const char * struct_name,
                         const char * member, bool is_union) const;
   int GetSize() const   { assert(size != -1);   return size; };

   TypeSpecifier        * GetSpecifier()   const { return decl_specifiers; };
   StructDeclaratorList * GetDeclarators() const { return struct_decl_list; };
   TypeName * FirstUnionMember(int size) const;
   int GetDeclaratorCount() const
      { return StructDeclaratorList::Length(struct_decl_list); };

private:
   TypeSpecifier        * decl_specifiers;
   StructDeclaratorList * struct_decl_list;
   int size;
};
TypeName * GetMemberType(StructDeclarationList * sdl, int pos);
//-----------------------------------------------------------------------------
class TypeSpecifier : public Node
{
public:
   // all types
   TypeSpecifier(Specifier sp)
   : Node("TypeSpecifier (all)"),
     spec(sp),
     name(0),
     struct_decl_list(0),
     enum_list(0)
     {};

   // structs, unions, typedef(name)
   TypeSpecifier(Specifier sp, const char * n, StructDeclarationList * sdl);

   // enums
   TypeSpecifier(const char * n, EnumeratorList * el)
   : Node("TypeSpecifier (enum)"),
     spec(TS_ENUM),
     name(n),
     struct_decl_list(0),
     enum_list(el)
     {};

   virtual void Emit(FILE * out);
   int Print(FILE * out) const;

   TypeSpecifier * operator +(TypeSpecifier & other);
   TypeSpecifier * self()   { return this; };

   Specifier    GetType()    const   { return spec; };
   const char * GetName()    const   { return name; };
   StructDeclarationList * GetStructDecl() const
                                     { return struct_decl_list; };
   bool         IsUnsigned() const   { return spec & TS_UNSIGNED; };

   int          GetFunReturnSize(Declarator * decl) const;
   int          GetSize(Declarator * decl) const;
   int          GetBaseSize()              const;
   TypeName *   GetMemberType(const char * member);
   bool         IsNumericType() const;  // char, short, or int
   bool         IsUnion() const
      { if (spec & TS_UNION)    return true; return false; };
   bool             IsStruct() const
      { if (spec & TS_STRUCT)   return true; return false; };

private:
   Specifier               spec;                // all types
   const char            * name;                // enums, structs and unions
   StructDeclarationList * struct_decl_list;    // structs and unions
   EnumeratorList        * enum_list;           // enums

   static int anonymous_number;
};
//-----------------------------------------------------------------------------
class InitDeclarator : public Node
{
public:
   InitDeclarator(Declarator * decl, Initializer * init)
   : Node("InitDeclarator"),
     declarator(decl),
     initializer(init)
     {};

   virtual void Emit(FILE * out);

   Declarator * GetDeclarator() const   { return declarator; };

   const char * GetDeclaredName(int skip);
   void Allocate(FILE * out, TypeSpecifier * spec);
   int  EmitAutovars(FILE * out, TypeSpecifier * spec);
      
private:
   Declarator  * declarator;
   Initializer * initializer;
};
//-----------------------------------------------------------------------------
class Declaration : public Node
{
public:
   Declaration(TypeSpecifier * ds, InitDeclaratorList * il);

   virtual void Emit(FILE * out);

   void Allocate(FILE * out);
   int  EmitAutovars(FILE * out);

private:
   TypeSpecifier      * base_type;
   InitDeclaratorList * init_list;
};
//-----------------------------------------------------------------------------
class TypeName : public Node
{
public:
   TypeName(TypeSpecifier * ds, Declarator * ad);
   TypeName(Specifier sp);

   virtual void Emit(FILE * out);
   int Print(FILE * out) const;

   Declarator     * GetDeclarator()    const   { return abs_declarator; };
   TypeSpecifier  * GetTypeSpecifier() const   { return decl_spec;  };
   const char     * GetDeclaredName();
   TypeName       * GetFunReturnType();

   TypeName *       AddressOf() const;
   TypeName *       ContentOf() const;
   TypeName *       GetElementType() const;
   bool             IsNumericType() const;  // char, short, or int
   bool             IsPointer() const;
   Expression *     ArrayLength() const;
   void             SetArrayLength(int len);
   bool             IsStruct()    const;
   bool             IsUnion()     const;
   bool             IsArray()     const;
   int              GetPointeeSize() const;
   TypeName *       GetMemberType(const char * member);
   TypeName *       FirstUnionMember(int size) const;

   int GetFunReturnSize()
       { return decl_spec->GetFunReturnSize(abs_declarator); };
   int GetSize() const
       { return decl_spec->GetSize(abs_declarator); };
   SUW GetSUW();
   bool IsUnsigned() const;
   bool IsFunPtr() const
       { return ::IsFunPtr(abs_declarator); };
   ParameterDeclarationList * GetParameters() const
       { return ::GetParameters(abs_declarator); };

private:
   TypeSpecifier * decl_spec;
   Declarator    * abs_declarator;
};
//-----------------------------------------------------------------------------
class Statement : public Node
{
public:
   Statement(const char * ntype)
   : Node(ntype)
   {};

   virtual void Emit(FILE * out) = 0;
   virtual bool NotEmpty() const   { return true; };
   virtual bool EmitCaseJump(FILE * out, bool def, int loop, int size)
      { return false; };
};
//-----------------------------------------------------------------------------
class LabelStatement : public Statement
{
public:
   LabelStatement(const char * n, Statement * stat)
   : Statement("Label Statement"),
     label_name(n),
     statement(stat)
     {};

   virtual void Emit(FILE * out);

private:
   const char * label_name;
   Statement  * statement;
};
//-----------------------------------------------------------------------------
class CaseStatement : public Statement
{
public:
   CaseStatement(Expression * exp, Statement * stat)
   : Statement("case Statement"),
     case_value(exp),
     statement(stat)
     {};

   virtual void Emit(FILE * out);
   virtual bool EmitCaseJump(FILE * out, bool def, int loop, int size);

private:
   Expression * case_value;             // case, or 0 for default
   Statement  * statement;
};
//-----------------------------------------------------------------------------
class CompoundStatement : public Statement
{
public:
   CompoundStatement(DeclarationList * dl, StatementList * sl)
   : Statement("CompoundStatement"),
     decl_list(dl),
     stat_list(sl)
     {};

   virtual void Emit(FILE * out);
   virtual bool NotEmpty() const   { return decl_list || stat_list; };
   void EmitCaseJumps(FILE * out, int size);

   int  EmitAutovars(FILE * out);
      
private:
   DeclarationList * decl_list;
   StatementList   * stat_list;
};
//-----------------------------------------------------------------------------
class ExpressionStatement : public Statement
{
public:
   ExpressionStatement(Expression * expr)
   : Statement("ExpressionStatement"),
     expression(expr)
   {};
   
   virtual void Emit(FILE * out);
   virtual bool NotEmpty() const   { return expression; };

   Expression * GetExpression() const   { return expression; };
      
private:
   Expression * expression;
};
//-----------------------------------------------------------------------------
class SwitchStatement : public Statement
{
public:
   SwitchStatement(Expression * cond, CompoundStatement * cas)
   : Statement("SwitchStatement"),
     condition(cond),
     case_stat(cas)
   {};

   virtual void Emit(FILE * out);
      
private:
   Expression         * condition;
   CompoundStatement  * case_stat;
};
//-----------------------------------------------------------------------------
class IfElseStatement : public Statement
{
public:
   IfElseStatement(Expression * cond, Statement * ifs, Statement * els)
   : Statement("IfElseStatement"),
     condition(cond),
     if_stat(ifs),
     else_stat(els)
   {};

   virtual void Emit(FILE * out);
      
private:
   Expression * condition;
   Statement  * if_stat;
   Statement  * else_stat;
};
//-----------------------------------------------------------------------------
class DoWhileStatement : public Statement
{
public:
   DoWhileStatement(Statement * bdy, Expression * cond)
   : Statement("do while Statement"),
     condition(cond),
     body(bdy)
     {};

   virtual void Emit(FILE * out);
      
private:
   Expression           * condition;
   Statement            * body;
};
//-----------------------------------------------------------------------------
class WhileStatement : public Statement
{
public:
   WhileStatement(Expression * cond, Statement * bdy)
   : Statement("while Statement"),
     condition(cond),
     body(bdy)
     {};

   virtual void Emit(FILE * out);
      
private:
   Expression           * condition;
   Statement            * body;
};
//-----------------------------------------------------------------------------
class ForStatement : public Statement
{
public:

   ForStatement(ExpressionStatement * f1, ExpressionStatement * f2,
                      Expression * f3, Statement * bdy)
   : Statement("for Statement"),
     for_1(f1),
     for_2(f2),
     for_3(f3),
     body(bdy)
     {};

   virtual void Emit(FILE * out);
      
private:
   ExpressionStatement  * for_1;
   ExpressionStatement  * for_2;
   Expression           * for_3;
   Statement            * body;
};
//-----------------------------------------------------------------------------
class GotoStatement : public Statement
{
public:
   GotoStatement(const char * lab)
   : Statement("goto Statement"),
     label_name(lab)
     {};

   virtual void Emit(FILE * out);
      
private:
   const char * label_name;
};
//-----------------------------------------------------------------------------
class ReturnStatement : public Statement
{
public:
   ReturnStatement(Expression * expr)
   : Statement("return Statement"),
     retval(expr)
     {};

   virtual void Emit(FILE * out);
      
private:
   Expression * retval;
};
//-----------------------------------------------------------------------------
class ContStatement : public Statement
{
public:
   ContStatement(bool do_brk)
   : Statement("break/continue Statement"),
     do_break(do_brk)
     {};

   virtual void Emit(FILE * out);
      
private:
   bool do_break;   // true for break, false for continue
};
//-----------------------------------------------------------------------------
class FunctionDefinition : public Node
{
public:
   FunctionDefinition(TypeSpecifier * ds, Declarator * decl,
                      DeclarationList * dl);

   virtual void Emit(FILE * out);

   FunctionDefinition * SetBody(CompoundStatement * bdy)
      { body = bdy;  return this; };
      
private:
   TypeName          * ret_type;
   Declarator        * fun_declarator;
   DeclarationList   * decl_list;
   CompoundStatement * body;
};
//-----------------------------------------------------------------------------

#endif

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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