Changeset b110bcc for src/Parser/ParseNode.h
- Timestamp:
- Apr 21, 2023, 5:36:12 PM (2 years ago)
- Branches:
- ADT, master
- Children:
- 28f8f15, 6e4c44d
- Parents:
- 2ed94a9 (diff), 699a97d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ParseNode.h
r2ed94a9 rb110bcc 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Nov 2 21:27:07 202213 // Update Count : 9 3911 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Apr 3 17:55:00 2023 13 // Update Count : 942 14 14 // 15 15 … … 24 24 #include <string> // for string 25 25 26 #include "AST/Expr.hpp" // for Expr, NameExpr LogicalFlag 27 #include "AST/Fwd.hpp" // for ptr, Decl, DeclWithType, 28 #include "AST/Stmt.hpp" // for Stmt 26 29 #include "Common/CodeLocation.h" // for CodeLocation 27 30 #include "Common/SemanticError.h" // for SemanticError 28 31 #include "Common/UniqueName.h" // for UniqueName 29 #include "Common/utility.h" // for maybeClone, maybeBuild 30 #include "SynTree/LinkageSpec.h" // for Spec 31 #include "SynTree/Declaration.h" // for Aggregate 32 #include "SynTree/Expression.h" // for Expression, ConstantExpr (ptr only) 33 #include "SynTree/Label.h" // for Label 34 #include "SynTree/Statement.h" // for Statement, BranchStmt, BranchStmt:... 35 #include "SynTree/Type.h" // for Type, Type::FuncSpecifiers, Type::... 32 #include "Common/utility.h" // for maybeClone 33 #include "Parser/parserutility.h" // for maybeBuild, maybeCopy 36 34 37 35 class Attribute; … … 40 38 class DeclarationWithType; 41 39 class Initializer; 40 class InitializerNode; 42 41 class ExpressionNode; 43 42 struct StatementNode; … … 82 81 }; // ParseNode 83 82 84 //##############################################################################85 86 class InitializerNode : public ParseNode {87 public:88 InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = nullptr );89 InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr );90 InitializerNode( bool isDelete );91 ~InitializerNode();92 virtual InitializerNode * clone() const { assert( false ); return nullptr; }93 94 ExpressionNode * get_expression() const { return expr; }95 96 InitializerNode * set_designators( ExpressionNode * des ) { designator = des; return this; }97 ExpressionNode * get_designators() const { return designator; }98 99 InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }100 bool get_maybeConstructed() const { return maybeConstructed; }101 102 bool get_isDelete() const { return isDelete; }103 104 InitializerNode * next_init() const { return kids; }105 106 void print( std::ostream & os, int indent = 0 ) const;107 void printOneLine( std::ostream & ) const;108 109 virtual Initializer * build() const;110 private:111 ExpressionNode * expr;112 bool aggregate;113 ExpressionNode * designator; // may be list114 InitializerNode * kids;115 bool maybeConstructed;116 bool isDelete;117 }; // InitializerNode118 119 //##############################################################################120 121 class ExpressionNode final : public ParseNode {122 public:123 ExpressionNode( Expression * expr = nullptr ) : expr( expr ) {}124 virtual ~ExpressionNode() {}125 virtual ExpressionNode * clone() const override { return expr ? static_cast<ExpressionNode*>((new ExpressionNode( expr->clone() ))->set_next( maybeClone( get_next() ) )) : nullptr; }126 127 bool get_extension() const { return extension; }128 ExpressionNode * set_extension( bool exten ) { extension = exten; return this; }129 130 virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {131 os << expr.get();132 }133 void printOneLine( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}134 135 template<typename T>136 bool isExpressionType() const { return nullptr != dynamic_cast<T>(expr.get()); }137 138 Expression * build() const { return const_cast<ExpressionNode *>(this)->expr.release(); }139 140 std::unique_ptr<Expression> expr; // public because of lifetime implications141 private:142 bool extension = false;143 }; // ExpressionNode144 145 template< typename T >146 struct maybeBuild_t< Expression, T > {147 static inline Expression * doit( const T * orig ) {148 if ( orig ) {149 Expression * p = orig->build();150 p->set_extension( orig->get_extension() );151 p->location = orig->location;152 return p;153 } else {154 return nullptr;155 } // if156 }157 };158 159 83 // Must harmonize with OperName. 160 84 enum class OperKinds { … … 172 96 173 97 struct LabelNode { 174 std:: list< Label> labels;98 std::vector<ast::Label> labels; 175 99 }; 176 100 177 Expression * build_constantInteger( std::string & str ); // these 4 routines modify the string178 Expression * build_constantFloat( std::string & str );179 Expression * build_constantChar( std::string & str );180 Expression * build_constantStr( std::string & str );181 Expression * build_field_name_FLOATING_FRACTIONconstant( const std::string & str );182 Expression * build_field_name_FLOATING_DECIMALconstant( const std::string & str );183 Expression * build_field_name_FLOATINGconstant( const std::string & str );184 Expression * build_field_name_fraction_constants( Expression * fieldName, ExpressionNode * fracts );185 186 NameExpr * build_varref( const std::string * name );187 QualifiedNameExpr * build_qualified_expr( const DeclarationNode * decl_node, const NameExpr * name );188 QualifiedNameExpr * build_qualified_expr( const EnumDecl * decl, const NameExpr * name );189 DimensionExpr * build_dimensionref( const std::string * name );190 191 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );192 Expression * build_keyword_cast( AggregateDecl::Aggregate target, ExpressionNode * expr_node );193 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );194 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member );195 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member );196 Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member );197 Expression * build_and( ExpressionNode * expr_node1, ExpressionNode * expr_node2 );198 Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode * expr_node2, bool kind );199 Expression * build_unary_val( OperKinds op, ExpressionNode * expr_node );200 Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node );201 Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );202 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );203 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 );204 Expression * build_tuple( ExpressionNode * expr_node = nullptr );205 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node );206 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids );207 208 //##############################################################################209 210 struct TypeData;211 212 struct DeclarationNode : public ParseNode {213 // These enumerations must harmonize with their names in DeclarationNode.cc.214 enum BasicType { Void, Bool, Char, Int, Int128,215 Float, Double, LongDouble, uuFloat80, uuFloat128,216 uFloat16, uFloat32, uFloat32x, uFloat64, uFloat64x, uFloat128, uFloat128x, NoBasicType };217 static const char * basicTypeNames[];218 enum ComplexType { Complex, NoComplexType, Imaginary }; // Imaginary unsupported => parse, but make invisible and print error message219 static const char * complexTypeNames[];220 enum Signedness { Signed, Unsigned, NoSignedness };221 static const char * signednessNames[];222 enum Length { Short, Long, LongLong, NoLength };223 static const char * lengthNames[];224 enum BuiltinType { Valist, AutoType, Zero, One, NoBuiltinType };225 static const char * builtinTypeNames[];226 227 static DeclarationNode * newStorageClass( Type::StorageClasses );228 static DeclarationNode * newFuncSpecifier( Type::FuncSpecifiers );229 static DeclarationNode * newTypeQualifier( Type::Qualifiers );230 static DeclarationNode * newBasicType( BasicType );231 static DeclarationNode * newComplexType( ComplexType );232 static DeclarationNode * newSignedNess( Signedness );233 static DeclarationNode * newLength( Length );234 static DeclarationNode * newBuiltinType( BuiltinType );235 static DeclarationNode * newForall( DeclarationNode * );236 static DeclarationNode * newFromTypedef( const std::string * );237 static DeclarationNode * newFromGlobalScope();238 static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );239 static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );240 static DeclarationNode * newAggregate( AggregateDecl::Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );241 static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base = nullptr, EnumHiding hiding = EnumHiding::Visible );242 static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );243 static DeclarationNode * newEnumValueGeneric( const std::string * name, InitializerNode * init );244 static DeclarationNode * newEnumInLine( const std::string name );245 static DeclarationNode * newName( const std::string * );246 static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );247 static DeclarationNode * newTypeParam( TypeDecl::Kind, const std::string * );248 static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );249 static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );250 static DeclarationNode * newTypeDecl( const std::string * name, DeclarationNode * typeParams );251 static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind );252 static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic );253 static DeclarationNode * newVarArray( DeclarationNode * qualifiers );254 static DeclarationNode * newBitfield( ExpressionNode * size );255 static DeclarationNode * newTuple( DeclarationNode * members );256 static DeclarationNode * newTypeof( ExpressionNode * expr, bool basetypeof = false );257 static DeclarationNode * newVtableType( DeclarationNode * expr );258 static DeclarationNode * newAttribute( const std::string *, ExpressionNode * expr = nullptr ); // gcc attributes259 static DeclarationNode * newDirectiveStmt( StatementNode * stmt ); // gcc external directive statement260 static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement261 static DeclarationNode * newStaticAssert( ExpressionNode * condition, Expression * message );262 263 DeclarationNode();264 ~DeclarationNode();265 DeclarationNode * clone() const override;266 267 DeclarationNode * addQualifiers( DeclarationNode * );268 void checkQualifiers( const TypeData *, const TypeData * );269 void checkSpecifiers( DeclarationNode * );270 DeclarationNode * copySpecifiers( DeclarationNode * );271 DeclarationNode * addType( DeclarationNode * );272 DeclarationNode * addTypedef();273 DeclarationNode * addEnumBase( DeclarationNode * );274 DeclarationNode * addAssertions( DeclarationNode * );275 DeclarationNode * addName( std::string * );276 DeclarationNode * addAsmName( DeclarationNode * );277 DeclarationNode * addBitfield( ExpressionNode * size );278 DeclarationNode * addVarArgs();279 DeclarationNode * addFunctionBody( StatementNode * body, ExpressionNode * with = nullptr );280 DeclarationNode * addOldDeclList( DeclarationNode * list );281 DeclarationNode * setBase( TypeData * newType );282 DeclarationNode * copyAttribute( DeclarationNode * attr );283 DeclarationNode * addPointer( DeclarationNode * qualifiers );284 DeclarationNode * addArray( DeclarationNode * array );285 DeclarationNode * addNewPointer( DeclarationNode * pointer );286 DeclarationNode * addNewArray( DeclarationNode * array );287 DeclarationNode * addParamList( DeclarationNode * list );288 DeclarationNode * addIdList( DeclarationNode * list ); // old-style functions289 DeclarationNode * addInitializer( InitializerNode * init );290 DeclarationNode * addTypeInitializer( DeclarationNode * init );291 292 DeclarationNode * cloneType( std::string * newName );293 DeclarationNode * cloneBaseType( DeclarationNode * newdecl );294 295 DeclarationNode * appendList( DeclarationNode * node ) {296 return (DeclarationNode *)set_last( node );297 }298 299 virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;300 virtual void printList( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;301 302 Declaration * build() const;303 Type * buildType() const;304 305 LinkageSpec::Spec get_linkage() const { return linkage; }306 DeclarationNode * extractAggregate() const;307 bool has_enumeratorValue() const { return (bool)enumeratorValue; }308 ExpressionNode * consume_enumeratorValue() const { return const_cast<DeclarationNode *>(this)->enumeratorValue.release(); }309 310 bool get_extension() const { return extension; }311 DeclarationNode * set_extension( bool exten ) { extension = exten; return this; }312 313 bool get_inLine() const { return inLine; }314 DeclarationNode * set_inLine( bool inL ) { inLine = inL; return this; }315 316 DeclarationNode * get_last() { return (DeclarationNode *)ParseNode::get_last(); }317 318 struct Variable_t {319 // const std::string * name;320 TypeDecl::Kind tyClass;321 DeclarationNode * assertions;322 DeclarationNode * initializer;323 };324 Variable_t variable;325 326 struct Attr_t {327 // const std::string * name;328 ExpressionNode * expr;329 DeclarationNode * type;330 };331 Attr_t attr;332 333 struct StaticAssert_t {334 ExpressionNode * condition;335 Expression * message;336 };337 StaticAssert_t assert;338 339 BuiltinType builtin = NoBuiltinType;340 341 TypeData * type = nullptr;342 343 bool inLine = false;344 bool enumInLine = false;345 Type::FuncSpecifiers funcSpecs;346 Type::StorageClasses storageClasses;347 348 ExpressionNode * bitfieldWidth = nullptr;349 std::unique_ptr<ExpressionNode> enumeratorValue;350 bool hasEllipsis = false;351 LinkageSpec::Spec linkage;352 Expression * asmName = nullptr;353 std::list< Attribute * > attributes;354 InitializerNode * initializer = nullptr;355 bool extension = false;356 std::string error;357 StatementNode * asmStmt = nullptr;358 StatementNode * directiveStmt = nullptr;359 360 static UniqueName anonymous;361 }; // DeclarationNode362 363 Type * buildType( TypeData * type );364 365 static inline Type * maybeMoveBuildType( const DeclarationNode * orig ) {366 Type * ret = orig ? orig->buildType() : nullptr;367 delete orig;368 return ret;369 }370 371 //##############################################################################372 373 struct StatementNode final : public ParseNode {374 StatementNode() { stmt = nullptr; }375 StatementNode( Statement * stmt ) : stmt( stmt ) {}376 StatementNode( DeclarationNode * decl );377 virtual ~StatementNode() {}378 379 virtual StatementNode * clone() const final { assert( false ); return nullptr; }380 Statement * build() const { return const_cast<StatementNode *>(this)->stmt.release(); }381 382 virtual StatementNode * add_label( const std::string * name, DeclarationNode * attr = nullptr ) {383 stmt->get_labels().emplace_back( * name, nullptr, attr ? std::move( attr->attributes ) : std::list< Attribute * > {} );384 delete attr;385 delete name;386 return this;387 }388 389 virtual StatementNode * append_last_case( StatementNode * );390 391 virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {392 os << stmt.get() << std::endl;393 }394 395 std::unique_ptr<Statement> stmt;396 }; // StatementNode397 398 Statement * build_expr( ExpressionNode * ctl );399 400 struct CondCtl {401 CondCtl( DeclarationNode * decl, ExpressionNode * condition ) :402 init( decl ? new StatementNode( decl ) : nullptr ), condition( condition ) {}403 404 StatementNode * init;405 ExpressionNode * condition;406 };407 408 struct ForCtrl {409 ForCtrl( ExpressionNode * expr, ExpressionNode * condition, ExpressionNode * change ) :410 init( new StatementNode( build_expr( expr ) ) ), condition( condition ), change( change ) {}411 ForCtrl( DeclarationNode * decl, ExpressionNode * condition, ExpressionNode * change ) :412 init( new StatementNode( decl ) ), condition( condition ), change( change ) {}413 414 StatementNode * init;415 ExpressionNode * condition;416 ExpressionNode * change;417 };418 419 Expression * build_if_control( CondCtl * ctl, std::list< Statement * > & init );420 Statement * build_if( CondCtl * ctl, StatementNode * then, StatementNode * else_ );421 Statement * build_switch( bool isSwitch, ExpressionNode * ctl, StatementNode * stmt );422 Statement * build_case( ExpressionNode * ctl );423 Statement * build_default();424 Statement * build_while( CondCtl * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );425 Statement * build_do_while( ExpressionNode * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );426 Statement * build_for( ForCtrl * forctl, StatementNode * stmt, StatementNode * else_ = nullptr );427 Statement * build_branch( BranchStmt::Type kind );428 Statement * build_branch( std::string * identifier, BranchStmt::Type kind );429 Statement * build_computedgoto( ExpressionNode * ctl );430 Statement * build_return( ExpressionNode * ctl );431 Statement * build_throw( ExpressionNode * ctl );432 Statement * build_resume( ExpressionNode * ctl );433 Statement * build_resume_at( ExpressionNode * ctl , ExpressionNode * target );434 Statement * build_try( StatementNode * try_, StatementNode * catch_, StatementNode * finally_ );435 Statement * build_catch( CatchStmt::Kind kind, DeclarationNode * decl, ExpressionNode * cond, StatementNode * body );436 Statement * build_finally( StatementNode * stmt );437 Statement * build_compound( StatementNode * first );438 StatementNode * maybe_build_compound( StatementNode * first );439 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );440 Statement * build_directive( std::string * directive );441 SuspendStmt * build_suspend( StatementNode *, SuspendStmt::Type = SuspendStmt::None);442 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );443 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );444 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when );445 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when, StatementNode * else_stmt, ExpressionNode * else_when );446 Statement * build_with( ExpressionNode * exprs, StatementNode * stmt );447 Statement * build_mutex( ExpressionNode * exprs, StatementNode * stmt );448 449 //##############################################################################450 451 template< typename SynTreeType, typename NodeType, template< typename, typename...> class Container, typename... Args >452 void buildList( const NodeType * firstNode, Container< SynTreeType *, Args... > & outputList ) {453 SemanticErrorException errors;454 std::back_insert_iterator< Container< SynTreeType *, Args... > > out( outputList );455 const NodeType * cur = firstNode;456 457 while ( cur ) {458 try {459 SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::pointer_traits< decltype(cur->build())>::element_type >( cur ) );460 if ( result ) {461 result->location = cur->location;462 * out++ = result;463 } else {464 SemanticError( cur->location, "type specifier declaration in forall clause is currently unimplemented." );465 } // if466 } catch( SemanticErrorException & e ) {467 errors.append( e );468 } // try469 const ParseNode * temp = (cur->get_next());470 cur = dynamic_cast< const NodeType * >( temp ); // should not return nullptr471 if ( ! cur && temp ) { // non-homogeneous nodes ?472 SemanticError( temp->location, "internal error, non-homogeneous nodes founds in buildList processing." );473 } // if474 } // while475 if ( ! errors.isEmpty() ) {476 throw errors;477 } // if478 }479 480 // in DeclarationNode.cc481 void buildList( const DeclarationNode * firstNode, std::list< Declaration * > & outputList );482 void buildList( const DeclarationNode * firstNode, std::list< DeclarationWithType * > & outputList );483 void buildTypeList( const DeclarationNode * firstNode, std::list< Type * > & outputList );484 485 template< typename SynTreeType, typename NodeType >486 void buildMoveList( const NodeType * firstNode, std::list< SynTreeType * > & outputList ) {487 buildList( firstNode, outputList );488 delete firstNode;489 }490 491 // in ParseNode.cc492 101 std::ostream & operator<<( std::ostream & out, const ParseNode * node ); 493 102
Note:
See TracChangeset
for help on using the changeset viewer.