Changeset 3f7e12cb for src/Parser
- Timestamp:
- Nov 8, 2017, 5:43:33 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, stuck-waitfor-destruct, with_gc
- Children:
- 954908d
- Parents:
- 78315272 (diff), e35f30a (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. - Location:
- src/Parser
- Files:
-
- 8 edited
-
DeclarationNode.cc (modified) (3 diffs)
-
ExpressionNode.cc (modified) (11 diffs)
-
ParseNode.h (modified) (3 diffs)
-
StatementNode.cc (modified) (4 diffs)
-
TypeData.cc (modified) (29 diffs)
-
lex.ll (modified) (6 diffs)
-
parser.yy (modified) (19 diffs)
-
parserutility.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
r78315272 r3f7e12cb 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 12:34:05 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thr Aug 10 17:02:00201713 // Update Count : 102 111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Sep 23 18:16:48 2017 13 // Update Count : 1024 14 14 // 15 15 … … 40 40 using namespace std; 41 41 42 // These must remain in the same order asthe corresponding DeclarationNode enumerations.43 const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "float", "double", "long double", " NoBasicTypeNames" };42 // These must harmonize with the corresponding DeclarationNode enumerations. 43 const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "float", "double", "long double", "int128", "float80", "float128", "NoBasicTypeNames" }; 44 44 const char * DeclarationNode::complexTypeNames[] = { "_Complex", "_Imaginary", "NoComplexTypeNames" }; 45 45 const char * DeclarationNode::signednessNames[] = { "signed", "unsigned", "NoSignednessNames" }; … … 1031 1031 1032 1032 if ( variable.tyClass != NoTypeClass ) { 1033 static const TypeDecl::Kind kindMap[] = { TypeDecl::Any, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype }; 1034 assertf( sizeof(kindMap)/sizeof(kindMap[0] == NoTypeClass-1), "DeclarationNode::build: kindMap is out of sync." ); 1033 // otype is internally converted to dtype + otype parameters 1034 static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype }; 1035 assertf( sizeof(kindMap)/sizeof(kindMap[0]) == NoTypeClass, "DeclarationNode::build: kindMap is out of sync." ); 1035 1036 assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." ); 1036 TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable. initializer ? variable.initializer->buildType() : nullptr );1037 TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == Otype, variable.initializer ? variable.initializer->buildType() : nullptr ); 1037 1038 buildList( variable.assertions, ret->get_assertions() ); 1038 1039 return ret; -
src/Parser/ExpressionNode.cc
r78315272 r3f7e12cb 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Sep 14 23:09:34201713 // Update Count : 69012 // Last Modified On : Wed Sep 27 22:51:55 2017 13 // Update Count : 781 14 14 // 15 15 … … 60 60 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; } 61 61 62 static const char * lnthsInt[2][6] = { 63 { "int8_t", "int16_t", "int32_t", "int64_t", "size_t", }, 64 { "uint8_t", "uint16_t", "uint32_t", "uint64_t", "size_t", } 65 }; // lnthsInt 66 67 static inline void checkLNInt( string & str, int & lnth, int & size ) { 68 string::size_type posn = str.find_first_of( "lL" ), start = posn; 69 if ( posn == string::npos ) return; 70 size = 4; // assume largest size 71 posn += 1; // advance to size 72 if ( str[posn] == '8' ) { // 8 73 lnth = 0; 74 } else if ( str[posn] == '1' ) { 75 posn += 1; 76 if ( str[posn] == '6' ) { // 16 77 lnth = 1; 78 } else { // 128 79 posn += 1; 80 lnth = 5; 81 } // if 82 } else { 83 if ( str[posn] == '3' ) { // 32 84 lnth = 2; 85 } else if ( str[posn] == '6' ) { // 64 86 lnth = 3; 87 } else { 88 assertf( false, "internal error, bad integral length %s", str.c_str() ); 89 } // if 90 posn += 1; 91 } // if 92 str.erase( start, posn - start + 1 ); // remove length suffix 93 } // checkLNInt 94 62 95 static void sepNumeric( string & str, string & units ) { 63 96 string::size_type posn = str.find_first_of( "`" ); … … 69 102 70 103 Expression * build_constantInteger( string & str ) { 71 static const BasicType::Kind kind[2][ 5] = {104 static const BasicType::Kind kind[2][6] = { 72 105 // short (h) must be before char (hh) 73 { BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },74 { BasicType::ShortUnsignedInt, BasicType::UnsignedChar, BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt },106 { BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, BasicType::SignedInt128, }, 107 { BasicType::ShortUnsignedInt, BasicType::UnsignedChar, BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt, BasicType::UnsignedInt128, }, 75 108 }; 76 109 77 string units; // units110 string units; 78 111 sepNumeric( str, units ); // separate constant from units 79 112 80 113 bool dec = true, Unsigned = false; // decimal, unsigned constant 81 int size; // 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => size_t 114 int size; // 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => int128 115 int lnth = -1; // literal length 116 82 117 unsigned long long int v; // converted integral value 83 118 size_t last = str.length() - 1; // last character of constant … … 140 175 } // if 141 176 str.erase( last - size - 1, size + 1 ); // remove 'h'/"hh" 177 } else { // suffix "ln" ? 178 checkLNInt( str, lnth, size ); 142 179 } // if 143 180 } else if ( checkL( str[ last ] ) ) { // suffix 'l' ? … … 163 200 str.erase( last - size, size + 1 ); // remove 'h'/"hh" 164 201 } else if ( checkZ( str[last] ) ) { // suffix 'z' ? 165 size = 5;202 lnth = 4; 166 203 str.erase( last, 1 ); // remove 'z' 167 } // if 168 204 } else { // suffix "ln" ? 205 checkLNInt( str, lnth, size ); 206 } // if 207 208 assert( 0 <= size && size < 6 ); 209 // Constant type is correct for overload resolving. 169 210 ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) ); 170 if ( Unsigned && size < 2 ) { // less than int ?171 // int i = -1uh => 65535 not -1, so cast is necessary for unsigned, which eliminates warnings for large values.211 if ( Unsigned && size < 2 ) { // hh or h, less than int ? 212 // int i = -1uh => 65535 not -1, so cast is necessary for unsigned, which unfortunately eliminates warnings for large values. 172 213 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ) ); 173 } else if ( size == 5 ) { // explicit cast to size_t 174 ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), "size_t", false ) ); 214 } else if ( lnth != -1 ) { // explicit length ? 215 if ( lnth == 5 ) { // int128 ? 216 size = 5; 217 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ) ); 218 } else { 219 ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][lnth], false ) ); 220 } // if 175 221 } // if 176 222 CLEANUP: … … 182 228 return ret; 183 229 } // build_constantInteger 230 231 232 static inline void checkLNFloat( string & str, int & lnth, int & size ) { 233 string::size_type posn = str.find_first_of( "lL" ), start = posn; 234 if ( posn == string::npos ) return; 235 size = 2; // assume largest size 236 lnth = 0; 237 posn += 1; // advance to size 238 if ( str[posn] == '3' ) { // 32 239 size = 0; 240 } else if ( str[posn] == '6' ) { // 64 241 size = 1; 242 } else if ( str[posn] == '8' || str[posn] == '1' ) { // 80, 128 243 size = 2; 244 if ( str[posn] == '1' ) posn += 1; 245 } else { 246 assertf( false, "internal error, bad floating point length %s", str.c_str() ); 247 } // if 248 posn += 1; 249 str.erase( start, posn - start + 1 ); // remove length suffix 250 } // checkLNFloat 251 184 252 185 253 Expression * build_constantFloat( string & str ) { … … 189 257 }; 190 258 191 string units; // units259 string units; 192 260 sepNumeric( str, units ); // separate constant from units 193 261 194 262 bool complx = false; // real, complex 195 int size = 1; // 0 => float, 1 => double (default), 2 => long double 263 int size = 1; // 0 => float, 1 => double, 2 => long double 264 int lnth = -1; // literal length 196 265 // floating-point constant has minimum of 2 characters: 1. or .1 197 266 size_t last = str.length() - 1; … … 211 280 } else if ( checkL( str[last] ) ) { // long double ? 212 281 size = 2; 282 } else { 283 size = 1; // double (default) 284 checkLNFloat( str, lnth, size ); 213 285 } // if 214 286 if ( ! complx && checkI( str[last - 1] ) ) { // imaginary ? … … 216 288 } // if 217 289 290 assert( 0 <= size && size < 3 ); 218 291 Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) ); 292 if ( lnth != -1 ) { // explicit length ? 293 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[complx][size] ) ); 294 } // if 219 295 if ( units.length() != 0 ) { 220 296 ret = new UntypedExpr( new NameExpr( units ), { ret } ); … … 321 397 322 398 NameExpr * build_varref( const string * name ) { 323 NameExpr * expr = new NameExpr( *name , nullptr);399 NameExpr * expr = new NameExpr( *name ); 324 400 delete name; 325 401 return expr; … … 412 488 list< Expression * > args; 413 489 buildMoveList( expr_node, args ); 414 return new UntypedExpr( maybeMoveBuild< Expression >(function), args , nullptr);490 return new UntypedExpr( maybeMoveBuild< Expression >(function), args ); 415 491 } // build_func 416 492 -
src/Parser/ParseNode.h
r78315272 r3f7e12cb 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Sep 14 23:09:39201713 // Update Count : 8 1512 // Last Modified On : Sat Sep 23 18:11:22 2017 13 // Update Count : 821 14 14 // 15 15 … … 47 47 #define YYLTYPE_IS_DECLARED 1 /* alert the parser that we have our own definition */ 48 48 49 extern char * yyfilename;50 extern int yylineno;51 49 extern YYLTYPE yylloc; 52 50 … … 197 195 class DeclarationNode : public ParseNode { 198 196 public: 199 enum BasicType { Void, Bool, Char, Int, Float, Double, LongDouble, NoBasicType }; 197 // These enumerations must harmonize with their names. 198 enum BasicType { Void, Bool, Char, Int, Float, Double, LongDouble, Int128, Float80, Float128, NoBasicType }; 199 static const char * basicTypeNames[]; 200 200 enum ComplexType { Complex, Imaginary, NoComplexType }; 201 static const char * complexTypeNames[]; 201 202 enum Signedness { Signed, Unsigned, NoSignedness }; 203 static const char * signednessNames[]; 202 204 enum Length { Short, Long, LongLong, NoLength }; 205 static const char * lengthNames[]; 203 206 enum Aggregate { Struct, Union, Trait, Coroutine, Monitor, Thread, NoAggregate }; 207 static const char * aggregateNames[]; 204 208 enum TypeClass { Otype, Dtype, Ftype, Ttype, NoTypeClass }; 209 static const char * typeClassNames[]; 205 210 enum BuiltinType { Valist, Zero, One, NoBuiltinType }; 206 207 static const char * basicTypeNames[];208 static const char * complexTypeNames[];209 static const char * signednessNames[];210 static const char * lengthNames[];211 static const char * aggregateNames[];212 static const char * typeClassNames[];213 211 static const char * builtinTypeNames[]; 214 212 -
src/Parser/StatementNode.cc
r78315272 r3f7e12cb 234 234 target, 235 235 maybeMoveBuild<Statement >( stmt ), 236 maybeMoveBuild<Expression>( when)236 notZeroExpr( maybeMoveBuild<Expression>( when ) ) 237 237 }); 238 238 … … 250 250 delete targetExpr; 251 251 252 node->clauses. push_back(WaitForStmt::Clause{252 node->clauses.insert( node->clauses.begin(), WaitForStmt::Clause{ 253 253 std::move( target ), 254 254 maybeMoveBuild<Statement >( stmt ), 255 maybeMoveBuild<Expression>( when)255 notZeroExpr( maybeMoveBuild<Expression>( when ) ) 256 256 }); 257 257 … … 265 265 node->timeout.time = maybeMoveBuild<Expression>( timeout ); 266 266 node->timeout.statement = maybeMoveBuild<Statement >( stmt ); 267 node->timeout.condition = maybeMoveBuild<Expression>( when);267 node->timeout.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) ); 268 268 } 269 269 else { 270 node->orelse.statement = maybeMoveBuild<Statement >( stmt );271 node->orelse.condition = maybeMoveBuild<Expression>( when);270 node->orelse.statement = maybeMoveBuild<Statement >( stmt ); 271 node->orelse.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) ); 272 272 } 273 273 … … 280 280 node->timeout.time = maybeMoveBuild<Expression>( timeout ); 281 281 node->timeout.statement = maybeMoveBuild<Statement >( stmt ); 282 node->timeout.condition = maybeMoveBuild<Expression>( when);282 node->timeout.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) ); 283 283 284 284 node->orelse.statement = maybeMoveBuild<Statement >( else_stmt ); 285 node->orelse.condition = maybeMoveBuild<Expression>( else_when);285 node->orelse.condition = notZeroExpr( maybeMoveBuild<Expression>( else_when ) ); 286 286 287 287 return node; 288 288 } 289 290 // WaitForStmt::Target build_waitfor( const std::string * name, ExpressionNode * arguments ) {291 // return WaitForStmt::Clause{292 293 // };294 // }295 289 296 290 Statement *build_compound( StatementNode *first ) { -
src/Parser/TypeData.cc
r78315272 r3f7e12cb 10 10 // Created On : Sat May 16 15:12:51 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 1 23:13:38201713 // Update Count : 5 6912 // Last Modified On : Mon Sep 25 18:33:41 2017 13 // Update Count : 587 14 14 // 15 15 … … 98 98 } // TypeData::TypeData 99 99 100 100 101 TypeData::~TypeData() { 101 102 delete base; … … 161 162 } // switch 162 163 } // TypeData::~TypeData 164 163 165 164 166 TypeData * TypeData::clone() const { … … 235 237 } // TypeData::clone 236 238 239 237 240 void TypeData::print( ostream &os, int indent ) const { 238 241 for ( int i = 0; i < Type::NumTypeQualifier; i += 1 ) { … … 399 402 } // TypeData::print 400 403 404 401 405 template< typename ForallList > 402 406 void buildForall( const DeclarationNode * firstNode, ForallList &outputList ) { 403 407 buildList( firstNode, outputList ); 404 for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 408 auto n = firstNode; 409 for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i, n = (DeclarationNode*)n->get_next() ) { 405 410 TypeDecl * td = static_cast<TypeDecl *>(*i); 406 if ( td->get_kind() == TypeDecl::Any) {411 if ( n->variable.tyClass == DeclarationNode::Otype ) { 407 412 // add assertion parameters to `type' tyvars in reverse order 408 413 // add dtor: void ^?{}(T *) … … 430 435 } // if 431 436 } // for 432 } 437 } // buildForall 438 433 439 434 440 Type * typebuild( const TypeData * td ) { … … 477 483 } // typebuild 478 484 485 479 486 TypeData * typeextractAggregate( const TypeData * td, bool toplevel ) { 480 487 TypeData * ret = nullptr; … … 504 511 } // typeextractAggregate 505 512 513 506 514 Type::Qualifiers buildQualifiers( const TypeData * td ) { 507 515 return td->qualifiers; 508 516 } // buildQualifiers 509 517 518 519 static string genTSError( string msg, DeclarationNode::BasicType basictype ) { 520 throw SemanticError( string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." ); 521 } // genTSError 522 510 523 Type * buildBasicType( const TypeData * td ) { 511 524 BasicType::Kind ret; … … 513 526 switch ( td->basictype ) { 514 527 case DeclarationNode::Void: 515 if ( td->signedness != DeclarationNode::NoSignedness && td->length != DeclarationNode::NoLength ) { 516 throw SemanticError( "invalid type specifier \"void\" in type: ", td ); 517 } // if 518 528 if ( td->signedness != DeclarationNode::NoSignedness ) { 529 genTSError( DeclarationNode::signednessNames[ td->signedness ], td->basictype ); 530 } // if 531 if ( td->length != DeclarationNode::NoLength ) { 532 genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype ); 533 } // if 519 534 return new VoidType( buildQualifiers( td ) ); 520 535 break; … … 522 537 case DeclarationNode::Bool: 523 538 if ( td->signedness != DeclarationNode::NoSignedness ) { 524 throw SemanticError( string( "invalid type specifier " ) + DeclarationNode::signednessNames[ td->signedness ] + " in type: ", td);539 genTSError( DeclarationNode::signednessNames[ td->signedness ], td->basictype ); 525 540 } // if 526 541 if ( td->length != DeclarationNode::NoLength ) { 527 throw SemanticError( string( "invalid type specifier " ) + DeclarationNode::lengthNames[ td->length ] + " in type: ", td);542 genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype ); 528 543 } // if 529 544 … … 538 553 539 554 if ( td->length != DeclarationNode::NoLength ) { 540 throw SemanticError( string( "invalid type specifier " ) + DeclarationNode::lengthNames[ td->length ] + " in type: ", td);555 genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype ); 541 556 } // if 542 557 … … 557 572 break; 558 573 574 case DeclarationNode::Int128: 575 ret = td->signedness == 1 ? BasicType::UnsignedInt128 : BasicType::SignedInt128; 576 if ( td->length != DeclarationNode::NoLength ) { 577 genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype ); 578 } // if 579 break; 580 559 581 case DeclarationNode::Float: 582 case DeclarationNode::Float80: 583 case DeclarationNode::Float128: 560 584 case DeclarationNode::Double: 561 585 case DeclarationNode::LongDouble: // not set until below … … 568 592 FloatingPoint: ; 569 593 if ( td->signedness != DeclarationNode::NoSignedness ) { 570 throw SemanticError( string( "invalid type specifier " ) + DeclarationNode::signednessNames[ td->signedness ] + " in type: ", td);594 genTSError( DeclarationNode::signednessNames[ td->signedness ], td->basictype ); 571 595 } // if 572 596 if ( td->length == DeclarationNode::Short || td->length == DeclarationNode::LongLong ) { 573 throw SemanticError( string( "invalid type specifier " ) + DeclarationNode::lengthNames[ td->length ] + " in type: ", td);597 genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype ); 574 598 } // if 575 599 if ( td->basictype == DeclarationNode::Float && td->length == DeclarationNode::Long ) { 576 throw SemanticError( "invalid type specifier \"long\" in type: ", td);600 genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype ); 577 601 } // if 578 602 if ( td->length == DeclarationNode::Long ) { … … 593 617 goto Integral; 594 618 default: 595 assert (false);619 assertf( false, "unknown basic type" ); 596 620 return nullptr; 597 621 } // switch … … 601 625 return bt; 602 626 } // buildBasicType 627 603 628 604 629 PointerType * buildPointer( const TypeData * td ) { … … 612 637 return pt; 613 638 } // buildPointer 639 614 640 615 641 ArrayType * buildArray( const TypeData * td ) { … … 626 652 } // buildArray 627 653 654 628 655 ReferenceType * buildReference( const TypeData * td ) { 629 656 ReferenceType * rt; … … 637 664 } // buildReference 638 665 666 639 667 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { 640 668 assert( td->kind == TypeData::Aggregate ); … … 665 693 return at; 666 694 } // buildAggregate 695 667 696 668 697 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { … … 722 751 } // buildAggInst 723 752 753 724 754 ReferenceToType * buildAggInst( const TypeData * td ) { 725 755 assert( td->kind == TypeData::AggregateInst ); … … 761 791 } // buildAggInst 762 792 793 763 794 NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage ) { 764 795 assert( td->kind == TypeData::Symbolic ); … … 768 799 ret = new TypedefDecl( name, scs, typebuild( td->base ), linkage ); 769 800 } else { 770 ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl:: Any);801 ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Dtype, true ); 771 802 } // if 772 803 buildList( td->symbolic.params, ret->get_parameters() ); … … 774 805 return ret; 775 806 } // buildSymbolic 807 776 808 777 809 EnumDecl * buildEnum( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { … … 790 822 } // buildEnum 791 823 824 792 825 TypeInstType * buildSymbolicInst( const TypeData * td ) { 793 826 assert( td->kind == TypeData::SymbolicInst ); … … 797 830 return ret; 798 831 } // buildSymbolicInst 832 799 833 800 834 TupleType * buildTuple( const TypeData * td ) { … … 807 841 } // buildTuple 808 842 843 809 844 TypeofType * buildTypeof( const TypeData * td ) { 810 845 assert( td->kind == TypeData::Typeof ); … … 813 848 return new TypeofType( buildQualifiers( td ), td->typeexpr->build() ); 814 849 } // buildTypeof 850 815 851 816 852 Declaration * buildDecl( const TypeData * td, const string &name, Type::StorageClasses scs, Expression * bitfieldWidth, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec linkage, Expression *asmName, Initializer * init, std::list< Attribute * > attributes ) { … … 836 872 return nullptr; 837 873 } // buildDecl 874 838 875 839 876 FunctionType * buildFunction( const TypeData * td ) { … … 857 894 return ft; 858 895 } // buildFunction 896 859 897 860 898 // Transform KR routine declarations into C99 routine declarations: -
src/Parser/lex.ll
r78315272 r3f7e12cb 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Sun Sep 10 22:29:15201713 * Update Count : 6 2012 * Last Modified On : Wed Oct 25 13:53:56 2017 13 * Update Count : 634 14 14 */ 15 15 … … 93 93 // numeric constants, CFA: '_' in constant 94 94 hex_quad {hex}("_"?{hex}){3} 95 length ("ll"|"LL"|[lL])|("hh"|"HH"|[hH]) 95 size_opt (8|16|32|64|128)? 96 length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hH]) 96 97 integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]))?{user_suffix_opt} 97 98 … … 109 110 // GCC: D (double) and iI (imaginary) suffixes, and DL (long double) 110 111 exponent "_"?[eE]"_"?[+-]?{decimal_digits} 111 floating_suffix ([fFdDlL]?[iI]?)|([iI][lLfFdD]) 112 floating_size 32|64|80|128 113 floating_length ([fFdDlL]|[lL]{floating_size}) 114 floating_suffix ({floating_length}?[iI]?)|([iI]{floating_length}) 112 115 floating_suffix_opt ("_"?({floating_suffix}|"DL"))?{user_suffix_opt} 113 116 decimal_digits ({decimal})|({decimal}({decimal}|"_")*{decimal}) … … 230 233 __extension__ { KEYWORD_RETURN(EXTENSION); } // GCC 231 234 extern { KEYWORD_RETURN(EXTERN); } 232 fallthrough { KEYWORD_RETURN(FALLTHRU); } // CFA233 235 fallthru { KEYWORD_RETURN(FALLTHRU); } // CFA 236 fallthrough { KEYWORD_RETURN(FALLTHROUGH); } // CFA 234 237 finally { KEYWORD_RETURN(FINALLY); } // CFA 235 238 float { KEYWORD_RETURN(FLOAT); } 236 __float128 { KEYWORD_RETURN(FLOAT); } // GCC 239 __float80 { KEYWORD_RETURN(FLOAT80); } // GCC 240 float80 { KEYWORD_RETURN(FLOAT80); } // GCC 241 __float128 { KEYWORD_RETURN(FLOAT128); } // GCC 242 float128 { KEYWORD_RETURN(FLOAT128); } // GCC 237 243 for { KEYWORD_RETURN(FOR); } 238 244 forall { KEYWORD_RETURN(FORALL); } // CFA … … 249 255 __inline__ { KEYWORD_RETURN(INLINE); } // GCC 250 256 int { KEYWORD_RETURN(INT); } 251 __int128 { KEYWORD_RETURN(INT ); } // GCC252 __int128_t { KEYWORD_RETURN(INT); } // GCC257 __int128 { KEYWORD_RETURN(INT128); } // GCC 258 int128 { KEYWORD_RETURN(INT128); } // GCC 253 259 __label__ { KEYWORD_RETURN(LABEL); } // GCC 254 260 long { KEYWORD_RETURN(LONG); } … … 285 291 __typeof { KEYWORD_RETURN(TYPEOF); } // GCC 286 292 __typeof__ { KEYWORD_RETURN(TYPEOF); } // GCC 287 __uint128_t { KEYWORD_RETURN(INT); } // GCC288 293 union { KEYWORD_RETURN(UNION); } 289 294 unsigned { KEYWORD_RETURN(UNSIGNED); } -
src/Parser/parser.yy
r78315272 r3f7e12cb 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Sep 14 23:07:12201713 // Update Count : 28 1512 // Last Modified On : Wed Oct 25 12:28:54 2017 13 // Update Count : 2893 14 14 // 15 15 … … 43 43 #define YYDEBUG_LEXER_TEXT (yylval) // lexer loads this up each time 44 44 #define YYDEBUG 1 // get the pretty debugging code to compile 45 #define YYERROR_VERBOSE 45 #define YYERROR_VERBOSE // more information in syntax errors 46 46 47 47 #undef __GNUC_MINOR__ … … 117 117 bool forall = false; // aggregate have one or more forall qualifiers ? 118 118 119 # define YYLLOC_DEFAULT(Cur, Rhs, N) \ 120 do \ 121 if (N) { \ 122 (Cur).first_line = YYRHSLOC(Rhs, 1).first_line; \ 123 (Cur).first_column = YYRHSLOC(Rhs, 1).first_column; \ 124 (Cur).last_line = YYRHSLOC(Rhs, N).last_line; \ 125 (Cur).last_column = YYRHSLOC(Rhs, N).last_column; \ 126 (Cur).filename = YYRHSLOC(Rhs, 1).filename; \ 127 } else { \ 128 (Cur).first_line = (Cur).last_line = \ 129 YYRHSLOC(Rhs, 0).last_line; \ 130 (Cur).first_column = (Cur).last_column = \ 131 YYRHSLOC(Rhs, 0).last_column; \ 132 (Cur).filename = YYRHSLOC(Rhs, 0).filename; \ 133 } \ 134 while (0) 119 // https://www.gnu.org/software/bison/manual/bison.html#Location-Type 120 #define YYLLOC_DEFAULT(Cur, Rhs, N) \ 121 if ( N ) { \ 122 (Cur).first_line = YYRHSLOC( Rhs, 1 ).first_line; \ 123 (Cur).first_column = YYRHSLOC( Rhs, 1 ).first_column; \ 124 (Cur).last_line = YYRHSLOC( Rhs, N ).last_line; \ 125 (Cur).last_column = YYRHSLOC( Rhs, N ).last_column; \ 126 (Cur).filename = YYRHSLOC( Rhs, 1 ).filename; \ 127 } else { \ 128 (Cur).first_line = (Cur).last_line = YYRHSLOC( Rhs, 0 ).last_line; \ 129 (Cur).first_column = (Cur).last_column = YYRHSLOC( Rhs, 0 ).last_column; \ 130 (Cur).filename = YYRHSLOC( Rhs, 0 ).filename; \ 131 } 135 132 %} 136 133 137 134 %define parse.error verbose 138 135 139 // Types declaration 136 // Types declaration for productions 140 137 %union 141 138 { … … 173 170 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED 174 171 %token BOOL COMPLEX IMAGINARY // C99 172 %token INT128 FLOAT80 FLOAT128 // GCC 175 173 %token ZERO_T ONE_T // CFA 176 174 %token VALIST // GCC … … 182 180 %token ATTRIBUTE EXTENSION // GCC 183 181 %token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN 184 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH WHEN WAITFOR // CFA182 %token CHOOSE DISABLE ENABLE FALLTHRU FALLTHROUGH TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH WHEN WAITFOR // CFA 185 183 %token ASM // C99, extension ISO/IEC 9899:1999 Section J.5.10(1) 186 184 %token ALIGNAS ALIGNOF GENERIC STATICASSERT // C11 … … 252 250 %type<sn> exception_statement handler_clause finally_clause 253 251 %type<catch_kind> handler_key 252 %type<sn> mutex_statement 254 253 %type<en> when_clause when_clause_opt waitfor timeout 255 254 %type<sn> waitfor_statement … … 363 362 %precedence ELSE // token precedence for start of else clause in IF/WAITFOR statement 364 363 365 %locations 364 %locations // support location tracking for error messages 366 365 367 366 %start translation_unit // parse-tree root … … 458 457 | '(' compound_statement ')' // GCC, lambda expression 459 458 { $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); } 460 | primary_expression '{' argument_expression_list '}' // CFA, constructor call461 {462 Token fn;463 fn.str = new std::string( "?{}" ); // location undefined - use location of '{'?464 $$ = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) ) );465 }466 459 | type_name '.' no_attr_identifier // CFA, nested type 467 { $$ = nullptr; } // FIX ME460 { throw SemanticError("Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME 468 461 | type_name '.' '[' push field_list pop ']' // CFA, nested type / tuple field selector 469 { $$ = nullptr; } // FIX ME462 { throw SemanticError("Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME 470 463 ; 471 464 … … 478 471 // equivalent to the old x[i,j]. 479 472 { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, $4 ) ); } 473 | postfix_expression '{' argument_expression_list '}' // CFA, constructor call 474 { 475 Token fn; 476 fn.str = new std::string( "?{}" ); // location undefined - use location of '{'? 477 $$ = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) ) ); 478 } 480 479 | postfix_expression '(' argument_expression_list ')' 481 480 { $$ = new ExpressionNode( build_func( $1, $3 ) ); } … … 809 808 | jump_statement 810 809 | with_statement 810 | mutex_statement 811 811 | waitfor_statement 812 812 | exception_statement … … 974 974 ; 975 975 976 fall_through_name: // CFA 977 FALLTHRU 978 | FALLTHROUGH 979 ; 980 976 981 fall_through: // CFA 977 FALLTHRU982 fall_through_name 978 983 { $$ = nullptr; } 979 | FALLTHRU';'984 | fall_through_name ';' 980 985 { $$ = nullptr; } 981 986 ; … … 1033 1038 ; 1034 1039 1040 // If MUTEX becomes a general qualifier, there are shift/reduce conflicts, so change syntax to "with mutex". 1041 mutex_statement: 1042 MUTEX '(' argument_expression_list ')' statement 1043 { $$ = nullptr; } // FIX ME 1044 ; 1045 1035 1046 when_clause: 1036 1047 WHEN '(' comma_expression ')' … … 1551 1562 | VOLATILE 1552 1563 { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); } 1553 | MUTEX1554 { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); }1555 1564 | ATOMIC 1556 1565 { $$ = DeclarationNode::newTypeQualifier( Type::Atomic ); } … … 1606 1615 1607 1616 basic_type_name: 1608 CHAR 1617 VOID 1618 { $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); } 1619 | BOOL // C99 1620 { $$ = DeclarationNode::newBasicType( DeclarationNode::Bool ); } 1621 | CHAR 1609 1622 { $$ = DeclarationNode::newBasicType( DeclarationNode::Char ); } 1623 | INT 1624 { $$ = DeclarationNode::newBasicType( DeclarationNode::Int ); } 1625 | INT128 1626 { $$ = DeclarationNode::newBasicType( DeclarationNode::Int128 ); } 1627 | FLOAT 1628 { $$ = DeclarationNode::newBasicType( DeclarationNode::Float ); } 1629 | FLOAT80 1630 { $$ = DeclarationNode::newBasicType( DeclarationNode::Float80 ); } 1631 | FLOAT128 1632 { $$ = DeclarationNode::newBasicType( DeclarationNode::Float128 ); } 1610 1633 | DOUBLE 1611 1634 { $$ = DeclarationNode::newBasicType( DeclarationNode::Double ); } 1612 | FLOAT 1613 { $$ = DeclarationNode::newBasicType( DeclarationNode::Float ); } 1614 | INT 1615 { $$ = DeclarationNode::newBasicType( DeclarationNode::Int ); } 1616 | LONG 1617 { $$ = DeclarationNode::newLength( DeclarationNode::Long ); } 1618 | SHORT 1619 { $$ = DeclarationNode::newLength( DeclarationNode::Short ); } 1635 | COMPLEX // C99 1636 { $$ = DeclarationNode::newComplexType( DeclarationNode::Complex ); } 1637 | IMAGINARY // C99 1638 { $$ = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); } 1620 1639 | SIGNED 1621 1640 { $$ = DeclarationNode::newSignedNess( DeclarationNode::Signed ); } 1622 1641 | UNSIGNED 1623 1642 { $$ = DeclarationNode::newSignedNess( DeclarationNode::Unsigned ); } 1624 | VOID 1625 { $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); } 1626 | BOOL // C99 1627 { $$ = DeclarationNode::newBasicType( DeclarationNode::Bool ); } 1628 | COMPLEX // C99 1629 { $$ = DeclarationNode::newComplexType( DeclarationNode::Complex ); } 1630 | IMAGINARY // C99 1631 { $$ = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); } 1643 | SHORT 1644 { $$ = DeclarationNode::newLength( DeclarationNode::Short ); } 1645 | LONG 1646 { $$ = DeclarationNode::newLength( DeclarationNode::Long ); } 1632 1647 | ZERO_T 1633 1648 { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Zero ); } … … 2476 2491 | TYPEDEFname 2477 2492 | TYPEGENname 2493 | FALLTHROUGH 2494 { $$ = Token{ new string( "fallthrough" ), { nullptr, -1 } }; } 2478 2495 | CONST 2479 2496 { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; } … … 2699 2716 paren_identifier attribute_list_opt 2700 2717 { $$ = $1->addQualifiers( $2 ); } 2718 | '&' MUTEX paren_identifier attribute_list_opt 2719 { $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( Type::Mutex ), OperKinds::AddressOf ) )->addQualifiers( $4 ); } 2701 2720 | identifier_parameter_ptr 2702 2721 | identifier_parameter_array attribute_list_opt … … 2739 2758 // 2740 2759 // typedef int foo; 2760 // forall( otype T ) struct foo; 2741 2761 // int f( int foo ); // redefine typedef name in new scope 2742 2762 // … … 2746 2766 typedef attribute_list_opt 2747 2767 { $$ = $1->addQualifiers( $2 ); } 2768 | '&' MUTEX typedef attribute_list_opt 2769 { $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( Type::Mutex ), OperKinds::AddressOf ) )->addQualifiers( $4 ); } 2748 2770 | type_parameter_ptr 2749 2771 | type_parameter_array attribute_list_opt … … 2892 2914 abstract_parameter_declarator: 2893 2915 abstract_parameter_ptr 2916 | '&' MUTEX attribute_list_opt 2917 { $$ = DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( Type::Mutex ), OperKinds::AddressOf )->addQualifiers( $3 ); } 2894 2918 | abstract_parameter_array attribute_list_opt 2895 2919 { $$ = $1->addQualifiers( $2 ); } -
src/Parser/parserutility.cc
r78315272 r3f7e12cb 29 29 30 30 Expression *notZeroExpr( Expression *orig ) { 31 if( !orig ) return nullptr; 31 32 UntypedExpr *comparison = new UntypedExpr( new NameExpr( "?!=?" ) ); 32 33 comparison->get_args().push_back( orig );
Note:
See TracChangeset
for help on using the changeset viewer.