Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ParseNode.h

    r2f22cc4 r658fafe4  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Aug 10 13:08:46 2016
    13 // Update Count     : 436
     12// Last Modified On : Sun Jul 24 02:17:00 2016
     13// Update Count     : 269
    1414//
    1515
     
    2626#include "SynTree/Type.h"
    2727#include "SynTree/Expression.h"
    28 #include "SynTree/Statement.h"
    2928//#include "SynTree/Declaration.h"
    3029#include "Common/UniqueName.h"
    3130#include "SynTree/Label.h"
    3231
     32class ExpressionNode;
     33class CompositeExprNode;
     34class CommaExprNode;
    3335class StatementNode;
    3436class CompoundStmtNode;
    3537class DeclarationNode;
    36 class ExpressionNode;
    3738class InitializerNode;
    3839
     
    5556        void set_name( const std::string &newValue ) { name = newValue; }
    5657
    57         virtual void print( std::ostream &os, int indent = 0 ) const;
    58         virtual void printList( std::ostream &os, int indent = 0 ) const;
    59 
    60         ParseNode &operator,( ParseNode & );
     58        virtual void print( std::ostream &, int indent = 0 ) const;
     59        virtual void printList( std::ostream &, int indent = 0 ) const;
     60
     61        ParseNode &operator,( ParseNode &);
    6162  protected:
    6263        std::string name;
     
    6768ParseNode *mkList( ParseNode & );
    6869
    69 //##############################################################################
    70 
    71 class InitializerNode : public ParseNode {
    72   public:
    73         InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode *des = 0 );
    74         InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode *des = 0 );
    75         ~InitializerNode();
    76 
    77         ExpressionNode *get_expression() const { return expr; }
    78 
    79         InitializerNode *set_designators( ExpressionNode *des ) { designator = des; return this; }
    80         ExpressionNode *get_designators() const { return designator; }
    81 
    82         InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
    83         bool get_maybeConstructed() const { return maybeConstructed; }
    84 
    85         InitializerNode *next_init() const { return kids; }
    86 
    87         void print( std::ostream &os, int indent = 0 ) const;
    88         void printOneLine( std::ostream & ) const;
    89 
    90         virtual Initializer *build() const;
    91   private:
    92         ExpressionNode *expr;
    93         bool aggregate;
    94         ExpressionNode *designator; // may be list
    95         InitializerNode *kids;
    96         bool maybeConstructed;
    97 };
    98 
    99 //##############################################################################
    100 
    10170class ExpressionNode : public ParseNode {
    10271  public:
    103         ExpressionNode( Expression * expr = nullptr ) : expr( expr ) {}
    104         ExpressionNode( Expression * expr, const std::string *name ) : ParseNode( name ), expr( expr ) {}
     72        ExpressionNode();
     73        ExpressionNode( const std::string * );
    10574        ExpressionNode( const ExpressionNode &other );
    106         virtual ~ExpressionNode() {}
    107 
    108         virtual ExpressionNode *clone() const { return 0; }
    109 
     75        virtual ~ExpressionNode() { delete argName; } // cannot delete argName because it might be referenced elsewhere
     76
     77        virtual ExpressionNode *clone() const = 0;
     78
     79        // virtual CommaExprNode *add_to_list( ExpressionNode * );
     80
     81        ExpressionNode *get_argName() const { return argName; }
     82        ExpressionNode *set_argName( const std::string *aName );
     83        ExpressionNode *set_argName( ExpressionNode *aDesignator );
    11084        bool get_extension() const { return extension; }
    11185        ExpressionNode *set_extension( bool exten ) { extension = exten; return this; }
    11286
    113         virtual void print( std::ostream &os, int indent = 0 ) const {}
    114         virtual void printOneLine( std::ostream &os, int indent = 0 ) const {}
    115 
    116         virtual Expression *build() const { return expr; }
    117   private:
     87        virtual void print( std::ostream &, int indent = 0) const = 0;
     88        virtual void printOneLine( std::ostream &, int indent = 0) const = 0;
     89
     90        virtual Expression *build() const = 0;
     91  protected:
     92        void printDesignation ( std::ostream &, int indent = 0) const;
     93  private:
     94        ExpressionNode *argName = 0;
    11895        bool extension = false;
    119         Expression *expr;
    12096};
    12197
     
    133109};
    134110
    135 //##############################################################################
    136 
    137 Expression *build_constantInteger( std::string &str );
    138 Expression *build_constantFloat( std::string &str );
    139 Expression *build_constantChar( std::string &str );
    140 ConstantExpr *build_constantStr( std::string &str );
    141 
    142 //##############################################################################
    143 
    144 NameExpr *build_varref( const std::string *name, bool labelp = false );
    145 
    146 //##############################################################################
    147 
    148 Expression *build_typevalue( DeclarationNode *decl );
    149 
    150 //##############################################################################
    151 
    152 enum class OperKinds {
    153         // diadic
    154         SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,
    155         BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
    156         Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
    157         Index, Range,
    158         // monadic
    159         UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress,
    160         Ctor, Dtor,
    161 };
    162 
    163 Expression *build_cast( DeclarationNode * decl_node, ExpressionNode *expr_node );
    164 Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member );
    165 Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member );
    166 Expression *build_addressOf( ExpressionNode *expr_node );
    167 Expression *build_sizeOfexpr( ExpressionNode *expr_node );
    168 Expression *build_sizeOftype( DeclarationNode *decl_node );
    169 Expression *build_alignOfexpr( ExpressionNode *expr_node );
    170 Expression *build_alignOftype( DeclarationNode *decl_node );
    171 Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member );
    172 Expression *build_and( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
    173 Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind );
    174 Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node );
    175 Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node );
    176 Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
    177 Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
    178 Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 );
    179 Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
    180 Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node );
    181 Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node );
    182 Expression *build_tuple( ExpressionNode * expr_node = 0 );
    183 Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node );
    184 Expression *build_range( ExpressionNode * low, ExpressionNode *high );
    185 
    186 //##############################################################################
    187 
    188 Expression *build_asm( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand );
    189 
    190 //##############################################################################
     111// NullExprNode is used in tuples as a place-holder where a tuple component is omitted e.g., [ 2, , 3 ]
     112class NullExprNode : public ExpressionNode {
     113  public:
     114        NullExprNode();
     115
     116        virtual NullExprNode *clone() const;
     117
     118        virtual void print( std::ostream &, int indent = 0) const;
     119        virtual void printOneLine( std::ostream &, int indent = 0) const;
     120
     121        virtual Expression *build() const;
     122};
     123
     124class ConstantNode : public ExpressionNode {
     125  public:
     126        enum Type { Integer, Float, Character, String };
     127
     128        ConstantNode( ConstantExpr * );
     129        ConstantNode( const ConstantNode &other ) : expr( other.expr->clone() ) {};
     130        ~ConstantNode() { delete expr; }
     131
     132        virtual ConstantNode *clone() const { return new ConstantNode( *this ); }
     133        virtual void print( std::ostream &, int indent = 0) const;
     134        virtual void printOneLine( std::ostream &, int indent = 0) const;
     135
     136        ConstantNode *appendstr( const std::string *newValue );
     137
     138        Expression *build() const;
     139  private:
     140        ConstantExpr *expr;
     141};
     142
     143ConstantNode *makeConstantInteger( std::string & );
     144ConstantNode *makeConstantFloat( std::string & );
     145ConstantNode *makeConstantChar( std::string & );
     146ConstantNode *makeConstantStr( std::string & );
     147
     148class VarRefNode : public ExpressionNode {
     149  public:
     150        VarRefNode();
     151        VarRefNode( const std::string *, bool isLabel = false );
     152        VarRefNode( const VarRefNode &other );
     153
     154        virtual Expression *build() const ;
     155
     156        virtual VarRefNode *clone() const { return new VarRefNode( *this ); }
     157
     158        virtual void print( std::ostream &, int indent = 0 ) const;
     159        virtual void printOneLine( std::ostream &, int indent = 0 ) const;
     160  private:
     161        bool isLabel;
     162};
     163
     164class DesignatorNode : public ExpressionNode {
     165  public:
     166        DesignatorNode( ExpressionNode *expr, bool isArrayIndex = false );
     167        DesignatorNode( const DesignatorNode &other );
     168
     169        virtual Expression *build() const ;
     170        virtual DesignatorNode *clone() const { return new DesignatorNode( *this ); }
     171
     172        virtual void print( std::ostream &, int indent = 0 ) const;
     173        virtual void printOneLine( std::ostream &, int indent = 0 ) const;
     174  private:
     175        bool isArrayIndex;
     176};
     177
     178class TypeValueNode : public ExpressionNode {
     179  public:
     180        TypeValueNode( DeclarationNode * );
     181        TypeValueNode( const TypeValueNode &other );
     182
     183        DeclarationNode *get_decl() const { return decl; }
     184
     185        virtual Expression *build() const ;
     186
     187        virtual TypeValueNode *clone() const { return new TypeValueNode( *this ); }
     188
     189        virtual void print( std::ostream &, int indent = 0) const;
     190        virtual void printOneLine( std::ostream &, int indent = 0) const;
     191  private:
     192        DeclarationNode *decl;
     193};
     194
     195class OperatorNode : public ExpressionNode {
     196  public:
     197        enum Type { TupleC, Comma, TupleFieldSel, // n-adic
     198                                // triadic
     199                                Cond, NCond,
     200                                // diadic
     201                                SizeOf, AlignOf, OffsetOf, Attr, Plus, Minus, Mul, Div, Mod, Or, And,
     202                                BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
     203                                Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
     204                                Index, FieldSel, PFieldSel, Range,
     205                                // monadic
     206                                UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress,
     207                                Ctor, Dtor,
     208        };
     209
     210        OperatorNode( Type t );
     211        OperatorNode( const OperatorNode &other );
     212        virtual ~OperatorNode();
     213
     214        virtual OperatorNode *clone() const { return new OperatorNode( *this ); }
     215
     216        Type get_type() const;
     217        const char *get_typename() const;
     218
     219        virtual void print( std::ostream &, int indent = 0) const;
     220        virtual void printOneLine( std::ostream &, int indent = 0) const;
     221
     222        virtual Expression *build() const { return 0; }
     223  private:
     224        Type type;
     225};
     226
     227class CompositeExprNode : public ExpressionNode {
     228  public:
     229        CompositeExprNode();
     230        CompositeExprNode( const std::string * );
     231        CompositeExprNode( ExpressionNode *f, ExpressionNode *args = 0 );
     232        CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2 );
     233        CompositeExprNode( const CompositeExprNode &other );
     234        virtual ~CompositeExprNode();
     235
     236        virtual CompositeExprNode *clone() const { return new CompositeExprNode( *this ); }
     237        virtual Expression *build() const;
     238
     239        virtual void print( std::ostream &, int indent = 0) const;
     240        virtual void printOneLine( std::ostream &, int indent = 0) const;
     241
     242        void set_function( ExpressionNode * );
     243        void set_args( ExpressionNode * );
     244
     245        void add_arg( ExpressionNode * );
     246
     247        ExpressionNode *get_function() const;
     248        ExpressionNode *get_args() const;
     249  private:
     250        ExpressionNode *function;
     251        ExpressionNode *arguments;
     252};
     253
     254class AsmExprNode : public ExpressionNode {
     255  public:
     256        AsmExprNode();
     257        AsmExprNode( ExpressionNode *inout, ConstantNode *constraint, ExpressionNode *operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
     258        virtual ~AsmExprNode() { delete inout; delete constraint; delete operand; }
     259
     260        virtual AsmExprNode *clone() const { return new AsmExprNode( *this ); }
     261        virtual Expression *build() const;
     262
     263        virtual void print( std::ostream &, int indent = 0) const;
     264        virtual void printOneLine( std::ostream &, int indent = 0) const;
     265
     266        ExpressionNode *get_inout() const { return inout; };
     267        void set_inout( ExpressionNode *newValue ) { inout = newValue; }
     268
     269        ConstantNode *get_constraint() const { return constraint; };
     270        void set_constraint( ConstantNode *newValue ) { constraint = newValue; }
     271
     272        ExpressionNode *get_operand() const { return operand; };
     273        void set_operand( ExpressionNode *newValue ) { operand = newValue; }
     274  private:
     275        ExpressionNode *inout;
     276        ConstantNode *constraint;
     277        ExpressionNode *operand;
     278};
    191279
    192280class LabelNode : public ExpressionNode {
    193281  public:
    194282        virtual Expression *build() const { return NULL; }
    195         virtual LabelNode *clone() const { assert( false ); return new LabelNode( *this ); }
    196 
    197         virtual void print( std::ostream &os, int indent = 0) const;
    198         virtual void printOneLine( std::ostream &os, int indent = 0) const;
     283        virtual LabelNode *clone() const { return new LabelNode( *this ); }
     284
     285        virtual void print( std::ostream &, int indent = 0) const;
     286        virtual void printOneLine( std::ostream &, int indent = 0) const;
    199287
    200288        const std::list< Label > &get_labels() const { return labels; };
    201         void append_label( std::string * label ) { labels.push_back( *label ); delete label; }
     289        void append_label( std::string *label ) { labels.push_back( *label ); delete label; }
    202290  private:
    203291        std::list< Label > labels;
    204292};
    205293
    206 //##############################################################################
    207 
    208 Expression *build_valexpr( StatementNode *s );
    209 
    210 //##############################################################################
    211 
    212 Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids );
    213 
    214 //##############################################################################
     294class ForCtlExprNode : public ExpressionNode {
     295  public:
     296        ForCtlExprNode( ParseNode *, ExpressionNode *, ExpressionNode * ) throw ( SemanticError );
     297        ForCtlExprNode( const ForCtlExprNode &other );
     298        ~ForCtlExprNode();
     299
     300        StatementNode *get_init() const { return init; }
     301        ExpressionNode *get_condition() const { return condition; }
     302        ExpressionNode *get_change() const { return change; }
     303
     304        virtual ForCtlExprNode *clone() const { return new ForCtlExprNode( *this ); }
     305        virtual Expression *build() const;
     306
     307        virtual void print( std::ostream &, int indent = 0 ) const;
     308        virtual void printOneLine( std::ostream &, int indent = 0 ) const;
     309  private:
     310        StatementNode *init;
     311        ExpressionNode *condition;
     312        ExpressionNode *change;
     313};
     314
     315class ValofExprNode : public ExpressionNode {
     316  public:
     317        ValofExprNode();
     318        ValofExprNode( StatementNode *s = 0 );
     319        ValofExprNode( const ValofExprNode &other );
     320        ~ValofExprNode();
     321
     322        virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); }
     323
     324        StatementNode *get_body() const { return body; }
     325        void print( std::ostream &, int indent = 0 ) const;
     326        void printOneLine( std::ostream &, int indent = 0 ) const;
     327        Expression *build() const;
     328
     329  private:
     330        StatementNode *body;
     331};
    215332
    216333class TypeData;
     
    287404
    288405        DeclarationNode *clone() const;
    289         void print( std::ostream &os, int indent = 0 ) const;
    290         void printList( std::ostream &os, int indent = 0 ) const;
     406        void print( std::ostream &, int indent = 0 ) const;
     407        void printList( std::ostream &, int indent = 0 ) const;
    291408
    292409        Declaration *build() const;
     
    322439}; // DeclarationNode
    323440
    324 Type *buildType( TypeData *type );
    325 
    326 //##############################################################################
    327 
    328441class StatementNode : public ParseNode {
    329442  public:
     
    345458        static StatementNode *newCatchStmt( DeclarationNode *d = 0, StatementNode *s = 0, bool catchRestP = false );
    346459
    347         StatementNode *set_block( StatementNode *b ) { block = b; return this; }
     460        StatementNode *set_block( StatementNode *b ) {  block = b; return this; }
    348461        StatementNode *get_block() const { return block; }
    349462
     
    353466        StatementNode::Type get_type() const { return type; }
    354467
    355         virtual StatementNode *add_label( const std::string * );
    356         virtual std::list<std::string> get_labels() const { return labels; }
     468        StatementNode *add_label( const std::string * );
     469        const std::list<std::string> &get_labels() const { return labels; }
    357470
    358471        void addDeclaration( DeclarationNode *newDecl ) { decl = newDecl; }
     
    365478        StatementNode *append_last_case( StatementNode * );
    366479
    367         void print( std::ostream &os, int indent = 0) const;
     480        void print( std::ostream &, int indent = 0) const;
    368481        virtual StatementNode *clone() const;
    369482        virtual Statement *build() const;
     
    379492}; // StatementNode
    380493
    381 class StatementNode2 : public StatementNode {
    382   public:
    383         StatementNode2() {}
    384         StatementNode2( Statement *stmt ) : stmt( stmt ) {}
    385         virtual ~StatementNode2() {}
    386 
    387         virtual StatementNode2 *clone() const { assert( false ); return nullptr; }
    388         virtual Statement *build() const { return stmt; }
    389 
    390         virtual StatementNode2 *add_label( const std::string * name ) {
    391                 stmt->get_labels().emplace_back( *name );
    392                 return this;
    393         }
    394         virtual std::list<std::string> get_labels() const { assert( false ); return StatementNode::get_labels(); }
    395 
    396         virtual void print( std::ostream &os, int indent = 0 ) {}
    397         virtual void printList( std::ostream &os, int indent = 0 ) {}
    398   private:
    399         Statement *stmt;
    400 }; // StatementNode
    401 
    402 struct ForCtl {
    403         ForCtl( ExpressionNode *expr, ExpressionNode *condition, ExpressionNode *change ) :
    404                 init( new StatementNode( StatementNode::Exp, expr ) ), condition( condition ), change( change ) {}
    405         ForCtl( DeclarationNode *decl, ExpressionNode *condition, ExpressionNode *change ) :
    406                 init( new StatementNode( decl ) ), condition( condition ), change( change ) {}
    407 
    408         StatementNode *init;
    409         ExpressionNode *condition;
    410         ExpressionNode *change;
    411 };
    412 
    413 Statement *build_if( ExpressionNode *ctl, StatementNode *then_stmt, StatementNode *else_stmt );
    414 Statement *build_switch( ExpressionNode *ctl, StatementNode *stmt );
    415 Statement *build_while( ExpressionNode *ctl, StatementNode *stmt, bool kind = false );
    416 Statement *build_for( ForCtl *forctl, StatementNode *stmt );
    417 
    418 //##############################################################################
    419 
    420494class CompoundStmtNode : public StatementNode {
    421495  public:
     
    427501        void add_statement( StatementNode * );
    428502
    429         void print( std::ostream &os, int indent = 0 ) const;
     503        void print( std::ostream &, int indent = 0 ) const;
    430504        virtual Statement *build() const;
    431505  private:
     
    433507};
    434508
    435 //##############################################################################
    436 
    437509class AsmStmtNode : public StatementNode {
    438510  public:
    439         AsmStmtNode( Type, bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 );
     511        AsmStmtNode( Type, bool voltile, ConstantNode *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ConstantNode *clobber = 0, LabelNode *gotolabels = 0 );
    440512        ~AsmStmtNode();
    441513
    442         void print( std::ostream &os, int indent = 0 ) const;
     514        void print( std::ostream &, int indent = 0 ) const;
    443515        Statement *build() const;
    444516  private:
    445517        bool voltile;
    446         ConstantExpr *instruction;
     518        ConstantNode *instruction;
    447519        ExpressionNode *output, *input;
    448         ExpressionNode *clobber;
     520        ConstantNode *clobber;
    449521        std::list< Label > gotolabels;
    450522};
    451523
    452 //##############################################################################
     524class InitializerNode : public ParseNode {
     525  public:
     526        InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode *des = 0 );
     527        InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode *des = 0 );
     528        ~InitializerNode();
     529
     530        ExpressionNode *get_expression() const { return expr; }
     531
     532        InitializerNode *set_designators( ExpressionNode *des ) { designator = des; return this; }
     533        ExpressionNode *get_designators() const { return designator; }
     534
     535        InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
     536        bool get_maybeConstructed() const { return maybeConstructed; }
     537
     538        InitializerNode *next_init() const { return kids; }
     539
     540        void print( std::ostream &, int indent = 0 ) const;
     541        void printOneLine( std::ostream & ) const;
     542
     543        virtual Initializer *build() const;
     544  private:
     545        ExpressionNode *expr;
     546        bool aggregate;
     547        ExpressionNode *designator; // may be list
     548        InitializerNode *kids;
     549        bool maybeConstructed;
     550};
     551
     552class CompoundLiteralNode : public ExpressionNode {
     553  public:
     554        CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids );
     555        CompoundLiteralNode( const CompoundLiteralNode &type );
     556        ~CompoundLiteralNode();
     557
     558        virtual CompoundLiteralNode *clone() const;
     559
     560        DeclarationNode *get_type() const { return type; }
     561        CompoundLiteralNode *set_type( DeclarationNode *t ) { type = t; return this; }
     562
     563        InitializerNode *get_initializer() const { return kids; }
     564        CompoundLiteralNode *set_initializer( InitializerNode *k ) { kids = k; return this; }
     565
     566        void print( std::ostream &, int indent = 0 ) const;
     567        void printOneLine( std::ostream &, int indent = 0 ) const;
     568
     569        virtual Expression *build() const;
     570  private:
     571        DeclarationNode *type;
     572        InitializerNode *kids;
     573};
    453574
    454575template< typename SynTreeType, typename NodeType >
    455 void buildList( const NodeType *firstNode, std::list< SynTreeType * > &outputList ) {
     576void buildList( const NodeType *firstNode, std::list< SynTreeType *> &outputList ) {
    456577        SemanticError errors;
    457578        std::back_insert_iterator< std::list< SynTreeType *> > out( outputList );
     
    481602void buildTypeList( const DeclarationNode *firstNode, std::list< Type * > &outputList );
    482603
     604// in ExpressionNode.cc
     605ExpressionNode *flattenCommas( ExpressionNode *list );
     606ExpressionNode *tupleContents( ExpressionNode *tuple );
     607
    483608#endif // PARSENODE_H
    484609
Note: See TracChangeset for help on using the changeset viewer.