Changes in src/Parser/parser.yy [f135b50:d824715]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rf135b50 rd824715 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 1 11:06:13202213 // Update Count : 5 16712 // Last Modified On : Mon Mar 14 16:35:29 2022 13 // Update Count : 5276 14 14 // 15 15 … … 610 610 // | RESUME '(' comma_expression ')' compound_statement 611 611 // { SemanticError( yylloc, "Resume expression is currently unimplemented." ); $$ = nullptr; } 612 | IDENTIFIER IDENTIFIER // syntax error 613 { 614 SemanticError( yylloc, ::toString( "Adjacent identifiers are not meaningful in an expression. " 615 "Possible problem is identifier \"", *$1.str, 616 "\" is a misspelled typename or an incorrectly specified type name, " 617 "e.g., missing generic parameter or missing struct/union/enum before typename." ) ); 618 $$ = nullptr; 619 } 620 | IDENTIFIER direct_type // syntax error 621 { 622 SemanticError( yylloc, ::toString( "Identifier \"", *$1.str, "\" cannot appear before a type. " 623 "Possible problem is misspelled storage or CV qualifier." ) ); 624 $$ = nullptr; 625 } 612 626 ; 613 627 … … 638 652 // Historic, transitional: Disallow commas in subscripts. 639 653 // Switching to this behaviour may help check if a C compatibilty case uses comma-exprs in subscripts. 640 // { SemanticError( yylloc, "New array subscript is currently unimplemented." ); $$ = nullptr; }641 654 // Current: Commas in subscripts make tuples. 642 655 { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, new ExpressionNode( build_tuple( (ExpressionNode *)($3->set_last( $5 ) ) )) ) ); } … … 647 660 // equivalent to the old x[i,j]. 648 661 { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, $3 ) ); } 662 | constant '[' assignment_expression ']' // 3[a], 'a'[a], 3.5[a] 663 { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, $3 ) ); } 664 | string_literal '[' assignment_expression ']' // "abc"[3], 3["abc"] 665 { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, new ExpressionNode( $1 ), $3 ) ); } 649 666 | postfix_expression '{' argument_expression_list_opt '}' // CFA, constructor call 650 667 { … … 1052 1069 identifier_or_type_name ':' attribute_list_opt statement 1053 1070 { $$ = $4->add_label( $1, $3 ); } 1071 | identifier_or_type_name ':' attribute_list_opt error // syntax error 1072 { 1073 SemanticError( yylloc, ::toString( "Label \"", *$1.str, "\" must be associated with a statement, " 1074 "where a declaration, case, or default is not a statement. " 1075 "Move the label or terminate with a semi-colon." ) ); 1076 $$ = nullptr; 1077 } 1054 1078 ; 1055 1079 … … 1086 1110 | statement_list_nodecl statement 1087 1111 { assert( $1 ); $1->set_last( $2 ); $$ = $1; } 1112 | statement_list_nodecl error // syntax error 1113 { SemanticError( yylloc, "Declarations only allowed at the start of the switch body, i.e., after the '{'." ); $$ = nullptr; } 1088 1114 ; 1089 1115 … … 1093 1119 | MUTEX '(' ')' comma_expression ';' 1094 1120 { $$ = new StatementNode( build_mutex( nullptr, new StatementNode( build_expr( $4 ) ) ) ); } 1095 // { SemanticError( yylloc, "Mutex expression is currently unimplemented." ); $$ = nullptr; }1096 1121 ; 1097 1122 … … 1113 1138 $$ = $7 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw; 1114 1139 } 1140 | SWITCH '(' comma_expression ')' '{' error '}' // CFA, syntax error 1141 { SemanticError( yylloc, "Only declarations can appear before the list of case clauses." ); $$ = nullptr; } 1115 1142 | CHOOSE '(' comma_expression ')' case_clause // CFA 1116 1143 { $$ = new StatementNode( build_switch( false, $3, $5 ) ); } … … 1120 1147 $$ = $7 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw; 1121 1148 } 1149 | CHOOSE '(' comma_expression ')' '{' error '}' // CFA, syntax error 1150 { SemanticError( yylloc, "Only declarations can appear before the list of case clauses." ); $$ = nullptr; } 1122 1151 ; 1123 1152 … … 1158 1187 1159 1188 case_label: // CFA 1160 CASE case_value_list ':' { $$ = $2; } 1189 CASE error // syntax error 1190 { SemanticError( yylloc, "Missing case list after case." ); $$ = nullptr; } 1191 | CASE case_value_list ':' { $$ = $2; } 1192 | CASE case_value_list error // syntax error 1193 { SemanticError( yylloc, "Missing colon after case list." ); $$ = nullptr; } 1161 1194 | DEFAULT ':' { $$ = new StatementNode( build_default() ); } 1162 1195 // A semantic check is required to ensure only one default clause per switch/choose statement. 1163 ; 1164 1165 //label_list_opt: 1166 // // empty 1167 // | identifier_or_type_name ':' 1168 // | label_list_opt identifier_or_type_name ':' 1169 // ; 1196 | DEFAULT error // syntax error 1197 { SemanticError( yylloc, "Missing colon after default." ); $$ = nullptr; } 1198 ; 1170 1199 1171 1200 case_label_list: // CFA … … 1197 1226 { $$ = new StatementNode( build_while( $3, maybe_build_compound( $5 ) ) ); } 1198 1227 | WHILE '(' conditional_declaration ')' statement ELSE statement // CFA 1199 // { SemanticError( yylloc, "Loop default block is currently unimplemented." ); $$ = nullptr; }1200 1228 { $$ = new StatementNode( build_while( $3, maybe_build_compound( $5 ), $7 ) ); } 1201 1229 | DO statement WHILE '(' ')' ';' // CFA => do while( 1 ) … … 1204 1232 { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); } 1205 1233 | DO statement WHILE '(' comma_expression ')' ELSE statement // CFA 1206 // { SemanticError( yylloc, "Loop default block is currently unimplemented." ); $$ = nullptr; }1207 1234 { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ), $8 ) ); } 1208 1235 | FOR '(' ')' statement // CFA => for ( ;; ) … … 1211 1238 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ) ) ); } 1212 1239 | FOR '(' for_control_expression_list ')' statement ELSE statement // CFA 1213 // { SemanticError( yylloc, "Loop default block is currently unimplemented." ); $$ = nullptr; }1214 1240 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ), $7 ) ); } 1215 1241 ; … … 1406 1432 | when_clause_opt ELSE statement 1407 1433 { $$ = build_waitfor_timeout( nullptr, maybe_build_compound( $3 ), $1 ); } 1408 // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless)1409 | when_clause_opt timeout statement WOR ELSE statement 1434 // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless) 1435 | when_clause_opt timeout statement WOR ELSE statement // syntax error 1410 1436 { SemanticError( yylloc, "else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; } 1411 1437 | when_clause_opt timeout statement WOR when_clause ELSE statement … … 2277 2303 ; 2278 2304 2279 enum_type: // static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed );// enum2305 enum_type: // enum 2280 2306 ENUM attribute_list_opt '{' enumerator_list comma_opt '}' 2281 { $$ = DeclarationNode::newEnum( nullptr, $4, true , false)->addQualifiers( $2 ); }2307 { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); } 2282 2308 | ENUM attribute_list_opt identifier 2283 2309 { typedefTable.makeTypedef( *$3 ); } 2284 2310 '{' enumerator_list comma_opt '}' 2285 { $$ = DeclarationNode::newEnum( $3, $6, true , false)->addQualifiers( $2 ); }2311 { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); } 2286 2312 | ENUM attribute_list_opt typedef_name // unqualified type name 2287 2313 '{' enumerator_list comma_opt '}' 2288 { $$ = DeclarationNode::newEnum( $3->name, $5, true , false)->addQualifiers( $2 ); }2314 { $$ = DeclarationNode::newEnum( $3->name, $5, true )->addQualifiers( $2 ); } 2289 2315 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt '{' enumerator_list comma_opt '}' 2290 2316 { 2291 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) 2292 { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } 2293 // SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; 2294 2295 $$ = DeclarationNode::newEnum( nullptr, $7, true, true ) ->addQualifiers( $5 ) -> addEnumBase( $3 ); 2296 // $$ = DeclarationNode::newEnum( nullptr, $7, true, true ) ->addQualifiers( $5 ); 2297 } 2298 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt // Question: why attributes/qualifier after identifier 2317 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } 2318 SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; 2319 } 2320 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt 2299 2321 { 2300 2322 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } … … 2303 2325 '{' enumerator_list comma_opt '}' 2304 2326 { 2305 $$ = DeclarationNode::newEnum( $6, $10, true, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ) -> addEnumBase( $3 ); 2306 // $$ = DeclarationNode::newEnum( $6, $10, true, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ); 2327 SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; 2307 2328 } 2308 2329 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt typedef_name attribute_list_opt '{' enumerator_list comma_opt '}' … … 2310 2331 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } 2311 2332 typedefTable.makeTypedef( *$6->name ); 2312 $$ = DeclarationNode::newEnum( $6->name, $9, true, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ) -> addEnumBase( $3 ); 2313 // $$ = DeclarationNode::newEnum( $6->name, $9, true, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ); 2333 SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; 2314 2334 } 2315 2335 | enum_type_nobody … … 2318 2338 enum_type_nobody: // enum - {...} 2319 2339 ENUM attribute_list_opt identifier 2320 { typedefTable.makeTypedef( *$3 ); $$ = DeclarationNode::newEnum( $3, 0, false , false)->addQualifiers( $2 ); }2340 { typedefTable.makeTypedef( *$3 ); $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 ); } 2321 2341 | ENUM attribute_list_opt type_name // qualified type name 2322 { typedefTable.makeTypedef( *$3->type->symbolic.name ); $$ = DeclarationNode::newEnum( $3->type->symbolic.name, 0, false , false)->addQualifiers( $2 ); }2342 { typedefTable.makeTypedef( *$3->type->symbolic.name ); $$ = DeclarationNode::newEnum( $3->type->symbolic.name, 0, false )->addQualifiers( $2 ); } 2323 2343 ; 2324 2344 … … 2735 2755 | ASM '(' string_literal ')' ';' // GCC, global assembler statement 2736 2756 { $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) ); } 2757 | EXTERN STRINGliteral 2758 { 2759 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" 2760 linkage = LinkageSpec::update( yylloc, linkage, $2 ); 2761 } 2762 up external_definition down 2763 { 2764 linkage = linkageStack.top(); 2765 linkageStack.pop(); 2766 $$ = $5; 2767 } 2737 2768 | EXTERN STRINGliteral // C++-style linkage specifier 2738 2769 {
Note:
See TracChangeset
for help on using the changeset viewer.