Changes in src/Parser/ParseNode.h [658fafe4:2f22cc4]
- File:
-
- 1 edited
-
src/Parser/ParseNode.h (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ParseNode.h
r658fafe4 r2f22cc4 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Jul 24 02:17:00201613 // Update Count : 26912 // Last Modified On : Wed Aug 10 13:08:46 2016 13 // Update Count : 436 14 14 // 15 15 … … 26 26 #include "SynTree/Type.h" 27 27 #include "SynTree/Expression.h" 28 #include "SynTree/Statement.h" 28 29 //#include "SynTree/Declaration.h" 29 30 #include "Common/UniqueName.h" 30 31 #include "SynTree/Label.h" 31 32 32 class ExpressionNode;33 class CompositeExprNode;34 class CommaExprNode;35 33 class StatementNode; 36 34 class CompoundStmtNode; 37 35 class DeclarationNode; 36 class ExpressionNode; 38 37 class InitializerNode; 39 38 … … 56 55 void set_name( const std::string &newValue ) { name = newValue; } 57 56 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 & );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 & ); 62 61 protected: 63 62 std::string name; … … 68 67 ParseNode *mkList( ParseNode & ); 69 68 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 70 101 class ExpressionNode : public ParseNode { 71 102 public: 72 ExpressionNode( );73 ExpressionNode( const std::string * );103 ExpressionNode( Expression * expr = nullptr ) : expr( expr ) {} 104 ExpressionNode( Expression * expr, const std::string *name ) : ParseNode( name ), expr( expr ) {} 74 105 ExpressionNode( const ExpressionNode &other ); 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 ); 106 virtual ~ExpressionNode() {} 107 108 virtual ExpressionNode *clone() const { return 0; } 109 84 110 bool get_extension() const { return extension; } 85 111 ExpressionNode *set_extension( bool exten ) { extension = exten; return this; } 86 112 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; 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: 95 118 bool extension = false; 119 Expression *expr; 96 120 }; 97 121 … … 109 133 }; 110 134 111 // NullExprNode is used in tuples as a place-holder where a tuple component is omitted e.g., [ 2, , 3 ] 112 class 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 124 class 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 143 ConstantNode *makeConstantInteger( std::string & ); 144 ConstantNode *makeConstantFloat( std::string & ); 145 ConstantNode *makeConstantChar( std::string & ); 146 ConstantNode *makeConstantStr( std::string & ); 147 148 class 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 164 class 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 178 class 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 195 class 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 227 class 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 254 class 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 }; 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 //############################################################################## 279 191 280 192 class LabelNode : public ExpressionNode { 281 193 public: 282 194 virtual Expression *build() const { return NULL; } 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;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; 287 199 288 200 const std::list< Label > &get_labels() const { return labels; }; 289 void append_label( std::string * label ) { labels.push_back( *label ); delete label; }201 void append_label( std::string * label ) { labels.push_back( *label ); delete label; } 290 202 private: 291 203 std::list< Label > labels; 292 204 }; 293 205 294 class 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 315 class 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 }; 206 //############################################################################## 207 208 Expression *build_valexpr( StatementNode *s ); 209 210 //############################################################################## 211 212 Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ); 213 214 //############################################################################## 332 215 333 216 class TypeData; … … 404 287 405 288 DeclarationNode *clone() const; 406 void print( std::ostream & , int indent = 0 ) const;407 void printList( std::ostream & , int indent = 0 ) const;289 void print( std::ostream &os, int indent = 0 ) const; 290 void printList( std::ostream &os, int indent = 0 ) const; 408 291 409 292 Declaration *build() const; … … 439 322 }; // DeclarationNode 440 323 324 Type *buildType( TypeData *type ); 325 326 //############################################################################## 327 441 328 class StatementNode : public ParseNode { 442 329 public: … … 458 345 static StatementNode *newCatchStmt( DeclarationNode *d = 0, StatementNode *s = 0, bool catchRestP = false ); 459 346 460 StatementNode *set_block( StatementNode *b ) { block = b; return this; }347 StatementNode *set_block( StatementNode *b ) { block = b; return this; } 461 348 StatementNode *get_block() const { return block; } 462 349 … … 466 353 StatementNode::Type get_type() const { return type; } 467 354 468 StatementNode *add_label( const std::string * );469 const std::list<std::string> &get_labels() const { return labels; }355 virtual StatementNode *add_label( const std::string * ); 356 virtual std::list<std::string> get_labels() const { return labels; } 470 357 471 358 void addDeclaration( DeclarationNode *newDecl ) { decl = newDecl; } … … 478 365 StatementNode *append_last_case( StatementNode * ); 479 366 480 void print( std::ostream & , int indent = 0) const;367 void print( std::ostream &os, int indent = 0) const; 481 368 virtual StatementNode *clone() const; 482 369 virtual Statement *build() const; … … 492 379 }; // StatementNode 493 380 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 494 420 class CompoundStmtNode : public StatementNode { 495 421 public: … … 501 427 void add_statement( StatementNode * ); 502 428 503 void print( std::ostream & , int indent = 0 ) const;429 void print( std::ostream &os, int indent = 0 ) const; 504 430 virtual Statement *build() const; 505 431 private: … … 507 433 }; 508 434 435 //############################################################################## 436 509 437 class AsmStmtNode : public StatementNode { 510 438 public: 511 AsmStmtNode( Type, bool voltile, Constant Node *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ConstantNode *clobber = 0, LabelNode *gotolabels = 0 );439 AsmStmtNode( Type, bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 ); 512 440 ~AsmStmtNode(); 513 441 514 void print( std::ostream & , int indent = 0 ) const;442 void print( std::ostream &os, int indent = 0 ) const; 515 443 Statement *build() const; 516 444 private: 517 445 bool voltile; 518 Constant Node*instruction;446 ConstantExpr *instruction; 519 447 ExpressionNode *output, *input; 520 ConstantNode *clobber;448 ExpressionNode *clobber; 521 449 std::list< Label > gotolabels; 522 450 }; 523 451 524 class 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 552 class 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 }; 452 //############################################################################## 574 453 575 454 template< typename SynTreeType, typename NodeType > 576 void buildList( const NodeType *firstNode, std::list< SynTreeType * > &outputList ) {455 void buildList( const NodeType *firstNode, std::list< SynTreeType * > &outputList ) { 577 456 SemanticError errors; 578 457 std::back_insert_iterator< std::list< SynTreeType *> > out( outputList ); … … 602 481 void buildTypeList( const DeclarationNode *firstNode, std::list< Type * > &outputList ); 603 482 604 // in ExpressionNode.cc605 ExpressionNode *flattenCommas( ExpressionNode *list );606 ExpressionNode *tupleContents( ExpressionNode *tuple );607 608 483 #endif // PARSENODE_H 609 484
Note:
See TracChangeset
for help on using the changeset viewer.