Changes in / [874ffa4:1cb7fab2]
- Location:
- src/Parser
- Files:
-
- 3 edited
-
ExpressionNode.cc (modified) (6 diffs)
-
TypeData.h (modified) (5 diffs)
-
lex.ll (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r874ffa4 r1cb7fab2 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 28 21:36:38 201913 // Update Count : 9 3312 // Last Modified On : Wed Feb 13 18:07:38 2019 13 // Update Count : 902 14 14 // 15 15 … … 57 57 static inline bool checkD( char c ) { return c == 'd' || c == 'D'; } 58 58 static inline bool checkF80( char c ) { return c == 'w' || c == 'W'; } 59 static inline bool checkL( char c ) { return c == 'l' || c == 'L'; } 59 60 static inline bool checkF128( char c ) { return c == 'q' || c == 'Q'; } 60 static inline bool checkL( char c ) { return c == 'l' || c == 'L'; }61 61 static inline bool checkI( char c ) { return c == 'i' || c == 'I'; } 62 62 static inline bool checkB( char c ) { return c == 'b' || c == 'B'; } 63 63 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; } 64 static inline bool checkN( char c ) { return c == 'n' || c == 'N'; }65 66 void lnthSuffix( string & str, int & type, int & ltype ) {67 string::size_type posn = str.find_last_of( "lL" );68 if ( posn != string::npos ) {69 type = 3; // default70 posn += 1; // advance to size71 if ( str[posn] == '3' ) { // 3272 type = ltype = 2; str.erase( posn, 2 );73 } else if ( str[posn] == '6' ) { // 6474 type = ltype = 3; str.erase( posn, 2 );75 } else if ( str[posn] == '8' ) { // 876 type = ltype = 1; str.erase( posn, 1 );77 } else if ( str[posn] == '1' ) {78 if ( str[posn + 1] == '6' ) { // 1679 type = ltype = 0; str.erase( posn, 2 );80 } else { // 12881 type = ltype = 5; str.erase( posn, 3 );82 } // if83 } // if84 } // if85 } // lnthSuffix86 64 87 65 Expression * build_constantInteger( string & str ) { … … 104 82 size_t last = str.length() - 1; // last subscript of constant 105 83 Expression * ret; 106 string fred( str );107 84 108 85 // special constants … … 116 93 } // if 117 94 118 // Cannot be just "0"/"1"; sscanf stops at the suffix, if any; value goes over the wall so always generate95 // Cannot be "0" 119 96 120 97 if ( str[0] == '0' ) { // radix character ? … … 138 115 } else { // decimal constant ? 139 116 sscanf( (char *)str.c_str(), "%llu", &v ); 140 //printf( "%llu\n", v ); 141 } // if 117 //printf( "%llu %llu\n", v, v ); 118 } // if 119 120 // At least one digit in integer constant, so safe to backup while looking for suffix. 142 121 143 122 string::size_type posn; 144 123 145 if ( isdigit( str[last] ) ) { // no suffix ? 146 lnthSuffix( str, type, ltype ); // could have length suffix 147 if ( type == -1 ) { 148 // no suffix type, use value to determine type 149 if ( v <= INT_MAX ) { // signed int 150 type = 2; 151 } else if ( v <= UINT_MAX && ! dec ) { // unsigned int 152 type = 2; 153 Unsigned = true; // unsigned 154 } else if ( v <= LONG_MAX ) { // signed long int 155 type = 3; 156 } else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int 157 type = 3; 158 Unsigned = true; // unsigned long int 159 } else if ( v <= LLONG_MAX ) { // signed long long int 160 type = 4; 161 } else { // unsigned long long int 162 type = 4; 163 Unsigned = true; // unsigned long long int 124 if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true; 125 126 posn = str.rfind( "hh" ); 127 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; } 128 129 posn = str.rfind( "HH" ); 130 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; } 131 132 posn = str.find_last_of( "hH" ); 133 if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; } 134 135 posn = str.find_last_of( "zZ" ); 136 if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; } 137 138 if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; } 139 140 posn = str.find_last_of( "lL" ); 141 if ( posn != string::npos ) { 142 type = 3; // default 143 posn += 1; // advance to size 144 if ( str[posn] == '3' ) { // 32 145 type = ltype = 2; str.erase( posn, 2 ); 146 } else if ( str[posn] == '6' ) { // 64 147 type = ltype = 3; str.erase( posn, 2 ); 148 } else if ( str[posn] == '8' ) { // 8 149 type = ltype = 1; str.erase( posn, 1 ); 150 } else if ( str[posn] == '1' ) { 151 if ( str[posn + 1] == '6' ) { // 16 152 type = ltype = 0; str.erase( posn, 2 ); 153 } else { // 128 154 type = ltype = 5; str.erase( posn, 3 ); 164 155 } // if 165 156 } // if 166 } else { 167 // At least one digit in integer constant, so safe to backup while looking for suffix. 168 169 if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true; 170 171 posn = str.rfind( "hh" ); 172 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; } 173 174 posn = str.rfind( "HH" ); 175 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; } 176 177 posn = str.find_last_of( "hH" ); 178 if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; } 179 180 posn = str.find_last_of( "nN" ); 181 if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; } 182 183 posn = str.find_last_of( "zZ" ); 184 if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; } 185 186 if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; } 187 188 lnthSuffix( str, type, ltype ); // must be after check for "ll" 189 if ( type == -1 ) { type = 3; goto FINI; } 190 FINI: ; 191 } // if 192 193 //if ( !( 0 <= type && type < 6 ) ) { printf( "%s %lu %d %s\n", fred.c_str(), fred.length(), type, str.c_str() ); } 157 } // if 158 FINI: 159 160 if ( type == -1 ) { // no suffix type, use value 161 if ( v <= INT_MAX ) { // signed int 162 type = 2; 163 } else if ( v <= UINT_MAX && ! dec ) { // unsigned int 164 type = 2; 165 Unsigned = true; // unsigned 166 } else if ( v <= LONG_MAX ) { // signed long int 167 type = 3; 168 } else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int 169 type = 3; 170 Unsigned = true; // unsigned long int 171 } else if ( v <= LLONG_MAX ) { // signed long long int 172 type = 4; 173 } else { // unsigned long long int 174 type = 4; 175 Unsigned = true; // unsigned long long int 176 } // if 177 } // if 178 194 179 assert( 0 <= type && type < 6 ); 195 196 180 // Constant type is correct for overload resolving. 197 181 ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][type] ), str, v ) ); … … 207 191 } // if 208 192 } // if 209 210 CLEANUP: ; 193 CLEANUP: 194 211 195 delete &str; // created by lex 212 196 return ret; -
src/Parser/TypeData.h
r874ffa4 r1cb7fab2 31 31 struct Aggregate_t { 32 32 DeclarationNode::Aggregate kind; 33 const std::string * name = nullptr;34 DeclarationNode * params = nullptr;35 ExpressionNode * actuals = nullptr; // holds actual parameters later applied to AggInst36 DeclarationNode * fields = nullptr;33 const std::string * name; 34 DeclarationNode * params; 35 ExpressionNode * actuals; // holds actual parameters later applied to AggInst 36 DeclarationNode * fields; 37 37 bool body; 38 38 bool anon; 39 39 40 40 bool tagged; 41 const std::string * parent = nullptr;41 const std::string * parent; 42 42 }; 43 43 44 44 struct AggInst_t { 45 TypeData * aggregate = nullptr;46 ExpressionNode * params = nullptr;45 TypeData * aggregate; 46 ExpressionNode * params; 47 47 bool hoistType; 48 48 }; 49 49 50 50 struct Array_t { 51 ExpressionNode * dimension = nullptr;51 ExpressionNode * dimension; 52 52 bool isVarLen; 53 53 bool isStatic; … … 55 55 56 56 struct Enumeration_t { 57 const std::string * name = nullptr;58 DeclarationNode * constants = nullptr;57 const std::string * name; 58 DeclarationNode * constants; 59 59 bool body; 60 60 bool anon; … … 62 62 63 63 struct Function_t { 64 mutable DeclarationNode * params = nullptr; // mutables modified in buildKRFunction65 mutable DeclarationNode * idList = nullptr; // old-style66 mutable DeclarationNode * oldDeclList = nullptr;67 StatementNode * body = nullptr;68 ExpressionNode * withExprs = nullptr; // expressions from function's with_clause64 mutable DeclarationNode * params; // mutables modified in buildKRFunction 65 mutable DeclarationNode * idList; // old-style 66 mutable DeclarationNode * oldDeclList; 67 StatementNode * body; 68 ExpressionNode * withExprs; // expressions from function's with_clause 69 69 }; 70 70 71 71 struct Symbolic_t { 72 const std::string * name = nullptr;72 const std::string * name; 73 73 bool isTypedef; // false => TYPEGENname, true => TYPEDEFname 74 DeclarationNode * params = nullptr;75 ExpressionNode * actuals = nullptr;76 DeclarationNode * assertions = nullptr;74 DeclarationNode * params; 75 ExpressionNode * actuals; 76 DeclarationNode * assertions; 77 77 }; 78 78 79 79 struct Qualified_t { // qualified type S.T 80 TypeData * parent = nullptr;81 TypeData * child = nullptr;80 TypeData * parent; 81 TypeData * child; 82 82 }; 83 83 … … 93 93 94 94 Type::Qualifiers qualifiers; 95 DeclarationNode * forall = nullptr;95 DeclarationNode * forall; 96 96 97 97 Aggregate_t aggregate; … … 102 102 Symbolic_t symbolic; 103 103 Qualified_t qualified; 104 DeclarationNode * tuple = nullptr;105 ExpressionNode * typeexpr = nullptr;104 DeclarationNode * tuple; 105 ExpressionNode * typeexpr; 106 106 107 107 TypeData( Kind k = Unknown ); -
src/Parser/lex.ll
r874ffa4 r1cb7fab2 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Wed Feb 27 22:44:03 201913 * Update Count : 70 412 * Last Modified On : Wed Feb 13 17:33:53 2019 13 * Update Count : 702 14 14 */ 15 15 … … 99 99 hex_quad {hex}("_"?{hex}){3} 100 100 size_opt (8|16|32|64|128)? 101 length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hH nN])101 length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hH]) 102 102 integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]))? 103 103
Note:
See TracChangeset
for help on using the changeset viewer.