Changeset a2e0687
- Timestamp:
- Jul 28, 2017, 8:58:23 AM (7 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, with_gc
- Children:
- 59310bf, 86d5ba7c
- Parents:
- 874960b
- Location:
- src/Parser
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r874960b ra2e0687 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 27 12:10:10 2017 13 // Update Count : 556 14 // 15 16 #include <cassert> 17 #include <cctype> 18 #include <climits> 19 #include <cstdio> 20 #include <algorithm> 12 // Last Modified On : Thu Jul 27 21:42:38 2017 13 // Update Count : 567 14 // 15 16 #include <climits> // access INT_MAX, UINT_MAX, LONG_MAX, ULONG_MAX, LLONG_MAX 21 17 #include <sstream> 22 18 … … 26 22 #include "SynTree/Expression.h" 27 23 #include "SynTree/Declaration.h" 28 #include "Common/UnimplementedError.h"29 24 #include "parserutility.h" 30 #include "Common/utility.h"31 25 32 26 using namespace std; … … 55 49 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; } 56 50 57 Expression * build_constantInteger( const std::string & str ) {51 Expression * build_constantInteger( const std::string & str ) { 58 52 static const BasicType::Kind kind[2][3] = { 59 53 { BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt }, … … 135 129 } // build_constantInteger 136 130 137 Expression * build_constantFloat( const std::string & str ) {131 Expression * build_constantFloat( const std::string & str ) { 138 132 static const BasicType::Kind kind[2][3] = { 139 133 { BasicType::Float, BasicType::Double, BasicType::LongDouble }, … … 170 164 } // build_constantFloat 171 165 172 Expression * build_constantChar( const std::string & str ) {166 Expression * build_constantChar( const std::string & str ) { 173 167 Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) ); 174 168 delete &str; // created by lex … … 176 170 } // build_constantChar 177 171 178 ConstantExpr * build_constantStr( const std::string & str ) {172 ConstantExpr * build_constantStr( const std::string & str ) { 179 173 // string should probably be a primitive type 180 ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),181 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), 174 ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), 175 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"' 182 176 false, false ); 183 // constant 0 is ignored for pure string value 184 ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); 177 ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value 185 178 delete &str; // created by lex 186 179 return ret; … … 214 207 } // build_field_name_fraction_constants 215 208 216 217 218 209 Expression * build_field_name_REALFRACTIONconstant( const std::string & str ) { 219 210 if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( "invalid tuple index " + str ); … … 230 221 } // build_field_name_REALDECIMALconstant 231 222 232 NameExpr * build_varref( const string * name ) {233 NameExpr * expr = new NameExpr( *name, nullptr );223 NameExpr * build_varref( const string * name ) { 224 NameExpr * expr = new NameExpr( *name, nullptr ); 234 225 delete name; 235 226 return expr; 236 } 237 238 // Must harmonize with OperKinds. 239 static const char * OperName[] = {227 } // build_varref 228 229 230 static const char * OperName[] = { // must harmonize with OperKinds 240 231 // diadic 241 232 "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&", … … 245 236 // monadic 246 237 "+?", "-?", "AddressOf", "*?", "!?", "~?", "++?", "?++", "--?", "?--", "&&" 247 }; 248 249 Expression * build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) {250 Type * targetType = maybeMoveBuildType( decl_node );238 }; // OperName 239 240 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) { 241 Type * targetType = maybeMoveBuildType( decl_node ); 251 242 if ( dynamic_cast< VoidType * >( targetType ) ) { 252 243 delete targetType; … … 255 246 return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType ); 256 247 } // if 257 } 258 259 260 Expression *build_virtual_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) { 261 Type *targetType = maybeMoveBuildType( decl_node ); 262 Expression *castArg = maybeMoveBuild< Expression >( expr_node ); 248 } // build_cast 249 250 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) { 251 Type * targetType = maybeMoveBuildType( decl_node ); 252 Expression * castArg = maybeMoveBuild< Expression >( expr_node ); 263 253 return new VirtualCastExpr( castArg, targetType ); 264 } 265 266 Expression * build_fieldSel( ExpressionNode *expr_node, Expression *member ) {267 UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );268 return ret; 269 } 270 271 Expression * build_pfieldSel( ExpressionNode *expr_node, Expression *member ) {272 UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) );254 } // build_virtual_cast 255 256 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ) { 257 UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) ); 258 return ret; 259 } // build_fieldSel 260 261 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member ) { 262 UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) ); 273 263 deref->location = expr_node->location; 274 264 deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) ); 275 UntypedMemberExpr * ret = new UntypedMemberExpr( member, deref );276 return ret; 277 } 278 279 Expression * build_addressOf( ExpressionNode *expr_node ) {265 UntypedMemberExpr * ret = new UntypedMemberExpr( member, deref ); 266 return ret; 267 } // build_pfieldSel 268 269 Expression * build_addressOf( ExpressionNode * expr_node ) { 280 270 return new AddressExpr( maybeMoveBuild< Expression >(expr_node) ); 281 } 282 Expression *build_sizeOfexpr( ExpressionNode *expr_node ) { 271 } // build_addressOf 272 273 Expression * build_sizeOfexpr( ExpressionNode * expr_node ) { 283 274 return new SizeofExpr( maybeMoveBuild< Expression >(expr_node) ); 284 } 285 Expression *build_sizeOftype( DeclarationNode *decl_node ) { 275 } // build_sizeOfexpr 276 277 Expression * build_sizeOftype( DeclarationNode * decl_node ) { 286 278 return new SizeofExpr( maybeMoveBuildType( decl_node ) ); 287 } 288 Expression *build_alignOfexpr( ExpressionNode *expr_node ) { 279 } // build_sizeOftype 280 281 Expression * build_alignOfexpr( ExpressionNode * expr_node ) { 289 282 return new AlignofExpr( maybeMoveBuild< Expression >(expr_node) ); 290 } 291 Expression *build_alignOftype( DeclarationNode *decl_node ) { 283 } // build_alignOfexpr 284 285 Expression * build_alignOftype( DeclarationNode * decl_node ) { 292 286 return new AlignofExpr( maybeMoveBuildType( decl_node) ); 293 } 294 Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) { 287 } // build_alignOftype 288 289 Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member ) { 295 290 Expression * ret = new UntypedOffsetofExpr( maybeMoveBuildType( decl_node ), member->get_name() ); 296 291 delete member; 297 292 return ret; 298 } 299 300 Expression * build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) {293 } // build_offsetOf 294 295 Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode * expr_node2, bool kind ) { 301 296 return new LogicalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), notZeroExpr( maybeMoveBuild< Expression >(expr_node2) ), kind ); 302 } 303 304 Expression * build_unary_val( OperKinds op, ExpressionNode *expr_node ) {297 } // build_and_or 298 299 Expression * build_unary_val( OperKinds op, ExpressionNode * expr_node ) { 305 300 std::list< Expression * > args; 306 301 args.push_back( maybeMoveBuild< Expression >(expr_node) ); 307 302 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 308 } 309 Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node ) { 303 } // build_unary_val 304 305 Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) { 310 306 std::list< Expression * > args; 311 307 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node) ) ); 312 308 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 313 } 314 Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 309 } // build_unary_ptr 310 311 Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) { 315 312 std::list< Expression * > args; 316 313 args.push_back( maybeMoveBuild< Expression >(expr_node1) ); 317 314 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 318 315 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 319 } 320 Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 316 } // build_binary_val 317 318 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) { 321 319 std::list< Expression * > args; 322 320 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node1) ) ); 323 321 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 324 322 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 325 } 326 327 Expression * build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) {323 } // build_binary_ptr 324 325 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 ) { 328 326 return new ConditionalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), maybeMoveBuild< Expression >(expr_node2), maybeMoveBuild< Expression >(expr_node3) ); 329 } 330 331 Expression * build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {327 } // build_cond 328 329 Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) { 332 330 return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) ); 333 } 334 335 Expression * build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) {331 } // build_comma 332 333 Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node ) { 336 334 return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) ); 337 } 338 Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) { 335 } // build_attrexpr 336 337 Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node ) { 339 338 return new AttrExpr( var, maybeMoveBuildType( decl_node ) ); 340 } 341 342 Expression * build_tuple( ExpressionNode * expr_node ) {339 } // build_attrtype 340 341 Expression * build_tuple( ExpressionNode * expr_node ) { 343 342 std::list< Expression * > exprs; 344 343 buildMoveList( expr_node, exprs ); 345 344 return new UntypedTupleExpr( exprs );; 346 } 347 348 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node ) {345 } // build_tuple 346 347 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node ) { 349 348 std::list< Expression * > args; 350 349 buildMoveList( expr_node, args ); 351 350 return new UntypedExpr( maybeMoveBuild< Expression >(function), args, nullptr ); 352 } 353 354 Expression * build_range( ExpressionNode * low, ExpressionNode *high ) {351 } // build_func 352 353 Expression * build_range( ExpressionNode * low, ExpressionNode * high ) { 355 354 return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) ); 356 } 357 358 Expression * build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {355 } // build_range 356 357 Expression * build_asmexpr( ExpressionNode * inout, ConstantExpr * constraint, ExpressionNode * operand ) { 359 358 return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) ); 360 } 361 362 Expression * build_valexpr( StatementNode *s ) {359 } // build_asmexpr 360 361 Expression * build_valexpr( StatementNode * s ) { 363 362 return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ) ); 364 } 365 Expression *build_typevalue( DeclarationNode *decl ) { 363 } // build_valexpr 364 365 Expression * build_typevalue( DeclarationNode * decl ) { 366 366 return new TypeExpr( maybeMoveBuildType( decl ) ); 367 } 368 369 Expression * build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ) {367 } // build_typevalue 368 369 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ) { 370 370 Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type 371 371 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type … … 393 393 assert( false ); 394 394 } // if 395 } 395 } // build_compoundLiteral 396 396 397 397 // Local Variables: // -
src/Parser/lex.ll
r874960b ra2e0687 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Thu Jul 27 12:05:50201713 * Update Count : 5 4912 * Last Modified On : Thu Jul 27 21:46:06 2017 13 * Update Count : 550 14 14 */ 15 15 … … 418 418 419 419 /* unknown characters */ 420 . { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }420 . { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); } 421 421 422 422 %% -
src/Parser/parser.yy
r874960b ra2e0687 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 27 12:08:08201713 // Update Count : 246 712 // Last Modified On : Thu Jul 27 21:07:16 2017 13 // Update Count : 2468 14 14 // 15 15 … … 527 527 | ALIGNOF unary_expression // GCC, variable alignment 528 528 { $$ = new ExpressionNode( build_alignOfexpr( $2 ) ); } 529 | ALIGNOF '(' type_no_function ')' // GCC, type alignment529 | ALIGNOF '(' type_no_function ')' // GCC, type alignment 530 530 { $$ = new ExpressionNode( build_alignOftype( $3 ) ); } 531 531 | OFFSETOF '(' type_no_function ',' no_attr_identifier ')'
Note: See TracChangeset
for help on using the changeset viewer.