Changes in src/Parser/parser.yy [6cebfef:efc8f3e]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r6cebfef refc8f3e 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 20 22:03:04202113 // Update Count : 5 03112 // Last Modified On : Fri Oct 15 09:20:17 2021 13 // Update Count : 5163 14 14 // 15 15 … … 31 31 // from ANSI90 to ANSI11 C are marked with the comment "C99/C11". 32 32 33 // This grammar also has two levels of extensions. The first extensions cover most of the GCC C extensions All of the33 // This grammar also has two levels of extensions. The first extensions cover most of the GCC C extensions. All of the 34 34 // syntactic extensions for GCC C are marked with the comment "GCC". The second extensions are for Cforall (CFA), which 35 35 // fixes several of C's outstanding problems and extends C with many modern language concepts. All of the syntactic … … 69 69 // 2. String encodings are transformed into canonical form (one encoding at start) so the encoding can be found 70 70 // without searching the string, e.g.: "abc" L"def" L"ghi" => L"abc" "def" "ghi". Multiple encodings must match, 71 // i.e., u"a" U"b" L"c" is disallowed.71 // e.g., u"a" U"b" L"c" is disallowed. 72 72 73 73 if ( from[0] != '"' ) { // encoding ? … … 185 185 type = new ExpressionNode( new CastExpr( maybeMoveBuild<Expression>(type), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ) ); 186 186 } // if 187 // type = new ExpressionNode( build_func( new ExpressionNode( build_varref( new string( "__for_control_index_constraints__" ) ) ), type ) ); 187 188 return new ForCtrl( 188 189 distAttr( DeclarationNode::newTypeof( type, true ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ), … … 309 310 %token ATassign // @= 310 311 311 %type<tok> identifier 312 %type<tok> identifier_or_type_name attr_name 312 %type<tok> identifier identifier_at identifier_or_type_name attr_name 313 313 %type<tok> quasi_keyword 314 314 %type<constant> string_literal … … 326 326 %type<en> conditional_expression constant_expression assignment_expression assignment_expression_opt 327 327 %type<en> comma_expression comma_expression_opt 328 %type<en> argument_expression_list_opt argument_expression default_initializer_opt328 %type<en> argument_expression_list_opt argument_expression_list argument_expression default_initializer_opt 329 329 %type<ifctl> if_control_expression 330 330 %type<fctl> for_control_expression for_control_expression_list … … 558 558 IDENTIFIER 559 559 | quasi_keyword 560 ; 561 562 identifier_at: 563 identifier 560 564 | '@' // CFA 561 565 { Token tok = { new string( DeclarationNode::anonymous.newName() ), yylval.tok.loc }; $$ = tok; } … … 692 696 // empty 693 697 { $$ = nullptr; } 694 | argument_expression 698 | argument_expression_list 699 ; 700 701 argument_expression_list: 702 argument_expression 695 703 | argument_expression_list_opt ',' argument_expression 696 704 { $$ = (ExpressionNode *)($1->set_last( $3 )); } … … 730 738 | FLOATINGconstant fraction_constants_opt 731 739 { $$ = new ExpressionNode( build_field_name_fraction_constants( build_field_name_FLOATINGconstant( *$1 ), $2 ) ); } 732 | identifier fraction_constants_opt740 | identifier_at fraction_constants_opt // CFA, allow anonymous fields 733 741 { 734 742 $$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) ); … … 1083 1091 comma_expression_opt ';' 1084 1092 { $$ = new StatementNode( build_expr( $1 ) ); } 1093 | MUTEX '(' ')' comma_expression ';' 1094 { $$ = new StatementNode( build_mutex( nullptr, new StatementNode( build_expr( $4 ) ) ) ); } 1095 // { SemanticError( yylloc, "Mutex expression is currently unimplemented." ); $$ = nullptr; } 1085 1096 ; 1086 1097 … … 1181 1192 1182 1193 iteration_statement: 1183 WHILE '(' push if_control_expression ')' statement pop 1184 { $$ = new StatementNode( build_while( $4, maybe_build_compound( $6 ) ) ); } 1185 | WHILE '(' ')' statement // CFA => while ( 1 ) 1194 WHILE '(' ')' statement // CFA => while ( 1 ) 1186 1195 { $$ = new StatementNode( build_while( new IfCtrl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) ); } 1187 | DO statement WHILE '(' comma_expression ')' ';' 1188 { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); } 1196 | WHILE '(' if_control_expression ')' statement %prec THEN 1197 { $$ = new StatementNode( build_while( $3, maybe_build_compound( $5 ) ) ); } 1198 | WHILE '(' if_control_expression ')' statement ELSE statement // CFA 1199 { SemanticError( yylloc, "Loop default block is currently unimplemented." ); $$ = nullptr; } 1189 1200 | DO statement WHILE '(' ')' ';' // CFA => do while( 1 ) 1190 1201 { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) ); } 1191 | FOR '(' push for_control_expression_list ')' statement pop 1192 { $$ = new StatementNode( build_for( $4, maybe_build_compound( $6 ) ) ); } 1202 | DO statement WHILE '(' comma_expression ')' ';' %prec THEN 1203 { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); } 1204 | DO statement WHILE '(' comma_expression ')' ELSE statement // CFA 1205 { SemanticError( yylloc, "Loop default block is currently unimplemented." ); $$ = nullptr; } 1193 1206 | FOR '(' ')' statement // CFA => for ( ;; ) 1194 1207 { $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) ); } 1208 | FOR '(' for_control_expression_list ')' statement %prec THEN 1209 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ) ) ); } 1210 | FOR '(' for_control_expression_list ')' statement ELSE statement // CFA 1211 { SemanticError( yylloc, "Loop default block is currently unimplemented." ); $$ = nullptr; } 1195 1212 ; 1196 1213 … … 1338 1355 with_statement: 1339 1356 WITH '(' tuple_expression_list ')' statement 1340 { 1341 $$ = new StatementNode( build_with( $3, $5 ) ); 1342 } 1357 { $$ = new StatementNode( build_with( $3, $5 ) ); } 1343 1358 ; 1344 1359 1345 1360 // If MUTEX becomes a general qualifier, there are shift/reduce conflicts, so change syntax to "with mutex". 1346 1361 mutex_statement: 1347 MUTEX '(' argument_expression_list _opt')' statement1362 MUTEX '(' argument_expression_list ')' statement 1348 1363 { $$ = new StatementNode( build_mutex( $3, $5 ) ); } 1349 1364 ; … … 2445 2460 | simple_assignment_operator initializer { $$ = $1 == OperKinds::Assign ? $2 : $2->set_maybeConstructed( false ); } 2446 2461 | '=' VOID { $$ = new InitializerNode( true ); } 2462 | '{' initializer_list_opt comma_opt '}' { $$ = new InitializerNode( $2, true ); } 2447 2463 ; 2448 2464 … … 2458 2474 | designation initializer { $$ = $2->set_designators( $1 ); } 2459 2475 | initializer_list_opt ',' initializer { $$ = (InitializerNode *)( $1->set_last( $3 ) ); } 2460 | initializer_list_opt ',' designation initializer 2461 { $$ = (InitializerNode *)($1->set_last( $4->set_designators( $3 ) )); } 2476 | initializer_list_opt ',' designation initializer { $$ = (InitializerNode *)($1->set_last( $4->set_designators( $3 ) )); } 2462 2477 ; 2463 2478 … … 2474 2489 designation: 2475 2490 designator_list ':' // C99, CFA uses ":" instead of "=" 2476 | identifier ':' // GCC, field name2491 | identifier_at ':' // GCC, field name 2477 2492 { $$ = new ExpressionNode( build_varref( $1 ) ); } 2478 2493 ; … … 2486 2501 2487 2502 designator: 2488 '.' identifier // C99, field name2503 '.' identifier_at // C99, field name 2489 2504 { $$ = new ExpressionNode( build_varref( $2 ) ); } 2490 2505 | '[' push assignment_expression pop ']' // C99, single array element … … 2918 2933 2919 2934 paren_identifier: 2920 identifier 2935 identifier_at 2921 2936 { $$ = DeclarationNode::newName( $1 ); } 2922 2937 | '(' paren_identifier ')' // redundant parenthesis
Note:
See TracChangeset
for help on using the changeset viewer.