Changes in src/Parser/parser.yy [e7aed49:c6b1105]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
re7aed49 rc6b1105 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 22 21:20:17201613 // Update Count : 1 58412 // Last Modified On : Mon Jun 27 17:47:56 2016 13 // Update Count : 1627 14 14 // 15 15 … … 224 224 %type<decl> typedef type_array typedef_declaration typedef_declaration_specifier typedef_expression 225 225 %type<decl> type_function type_parameter_array type_parameter_function type_parameter_ptr 226 %type<decl> type_parameter_redeclarator type_ptr type_redeclarator typedef_type_specifier226 %type<decl> type_parameter_redeclarator type_ptr variable_type_redeclarator typedef_type_specifier 227 227 %type<decl> typegen_declaration_specifier typegen_type_specifier typegen_name 228 228 … … 350 350 primary_expression 351 351 | postfix_expression '[' push assignment_expression pop ']' 352 // CFA, comma_expression disallowed in th e context because it results in a commomuser error: subscripting a352 // CFA, comma_expression disallowed in this context because it results in a common user error: subscripting a 353 353 // matrix with x[i,j] instead of x[i][j]. While this change is not backwards compatible, there seems to be 354 354 // little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is … … 421 421 unary_expression: 422 422 postfix_expression 423 // first location where constant/string can have operator applied: sizeof 3/sizeof "abc" still requires semantics424 //checks, e.g., ++3, 3--, *3, &&3423 // first location where constant/string can have operator applied: sizeof 3/sizeof "abc" still requires 424 // semantics checks, e.g., ++3, 3--, *3, &&3 425 425 | constant 426 426 { $$ = $1; } … … 431 431 | ptrref_operator cast_expression // CFA 432 432 { $$ = new CompositeExprNode( $1, $2 ); } 433 // '*' ('&') is separated from unary_operator because of shift/reduce conflict in:434 // { * X; } // dereference X435 // { * int X; } // CFA declaration of pointer to int433 // '*' ('&') is separated from unary_operator because of shift/reduce conflict in: 434 // { * X; } // dereference X 435 // { * int X; } // CFA declaration of pointer to int 436 436 | unary_operator cast_expression 437 437 { $$ = new CompositeExprNode( $1, $2 ); } … … 456 456 | ALIGNOF '(' type_name_no_function ')' // GCC, type alignment 457 457 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( $3 ) ); } 458 | ANDAND no_attr_identifier// GCC, address of label459 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( $2, true ) ); }458 // | ANDAND IDENTIFIER // GCC, address of label 459 // { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( $2, true ) ); } 460 460 ; 461 461 … … 463 463 '*' { $$ = new OperatorNode( OperatorNode::PointTo ); } 464 464 | '&' { $$ = new OperatorNode( OperatorNode::AddressOf ); } 465 // GCC, address of label must be handled by semantic check for ref,ref,label 466 | ANDAND { $$ = new OperatorNode( OperatorNode::And ); } 465 467 ; 466 468 … … 651 653 652 654 labeled_statement: 653 no_attr_identifier ':' attribute_list_opt statement 655 // labels cannot be identifiers 0 or 1 656 IDENTIFIER ':' attribute_list_opt statement 654 657 { 655 658 $$ = $4->add_label( $1 ); … … 804 807 805 808 jump_statement: 806 GOTO no_attr_identifier';'809 GOTO IDENTIFIER ';' 807 810 { $$ = new StatementNode( StatementNode::Goto, $2 ); } 808 811 | GOTO '*' comma_expression ';' // GCC, computed goto … … 813 816 // A semantic check is required to ensure this statement appears only in the body of an iteration statement. 814 817 { $$ = new StatementNode( StatementNode::Continue ); } 815 | CONTINUE no_attr_identifier';' // CFA, multi-level continue818 | CONTINUE IDENTIFIER ';' // CFA, multi-level continue 816 819 // A semantic check is required to ensure this statement appears only in the body of an iteration statement, and 817 820 // the target of the transfer appears only at the start of an iteration statement. … … 820 823 // A semantic check is required to ensure this statement appears only in the body of an iteration statement. 821 824 { $$ = new StatementNode( StatementNode::Break ); } 822 | BREAK no_attr_identifier';' // CFA, multi-level exit825 | BREAK IDENTIFIER ';' // CFA, multi-level exit 823 826 // A semantic check is required to ensure this statement appears only in the body of an iteration statement, and 824 827 // the target of the transfer appears only at the start of an iteration statement. … … 1500 1503 // A semantic check is required to ensure bit_subrange only appears on base type int. 1501 1504 { $$ = $1->addBitfield( $2 ); } 1502 | type_redeclarator bit_subrange_size_opt1505 | variable_type_redeclarator bit_subrange_size_opt 1503 1506 // A semantic check is required to ensure bit_subrange only appears on base type int. 1504 1507 { $$ = $1->addBitfield( $2 ); } … … 1744 1747 1745 1748 designator: 1746 // lexer ambiguity: designator ".0" is floating-point constant or designator for name 01747 // only ".0" and ".1"allowed => semantic check1749 // lexer ambiguity: designator ".0" is floating-point constant or designator for name 0 only ".0" and ".1" 1750 // allowed => semantic check 1748 1751 FLOATINGconstant 1749 1752 { $$ = new DesignatorNode( new VarRefNode( $1 ) ); } … … 1994 1997 function_definition 1995 1998 // These rules are a concession to the "implicit int" type_specifier because there is a significant amount of 1996 // code with functions missing a type-specifier on the return type. Parsing is possible because 1997 // function_definition does not appear in the context of an expression (nested functions would preclude this 1998 // concession). A function prototype declaration must still have a type_specifier. OBSOLESCENT (see 1) 1999 // legacy code with global functions missing the type-specifier for the return type, and assuming "int". 2000 // Parsing is possible because function_definition does not appear in the context of an expression (nested 2001 // functions preclude this concession, i.e., all nested function must have a return type). A function prototype 2002 // declaration must still have a type_specifier. OBSOLESCENT (see 1) 1999 2003 | function_declarator compound_statement 2000 2004 { … … 2074 2078 declarator: 2075 2079 variable_declarator 2080 | variable_type_redeclarator 2076 2081 | function_declarator 2077 | type_redeclarator2078 2082 ; 2079 2083 … … 2201 2205 ; 2202 2206 2203 // This pattern parses a function declarator that is not redefining a typedef name. Because functions cannot be nested, 2204 // there is no context where a function definition can redefine a typedef name. To allow nested functions requires 2205 // further separation of variable and function declarators in type_redeclarator. The pattern precludes returning 2206 // arrays and functions versus pointers to arrays and functions. 2207 // This pattern parses a function declarator that is not redefining a typedef name. For non-nested functions, there is 2208 // no context where a function definition can redefine a typedef name, i.e., the typedef and function name cannot exist 2209 // is the same scope. The pattern precludes returning arrays and functions versus pointers to arrays and functions. 2207 2210 2208 2211 function_declarator: … … 2288 2291 // and functions versus pointers to arrays and functions. 2289 2292 2290 type_redeclarator:2293 variable_type_redeclarator: 2291 2294 paren_type attribute_list_opt 2292 2295 { $$ = $1->addQualifiers( $2 ); } … … 2305 2308 2306 2309 type_ptr: 2307 ptrref_operator type_redeclarator2310 ptrref_operator variable_type_redeclarator 2308 2311 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2309 | ptrref_operator type_qualifier_list type_redeclarator2312 | ptrref_operator type_qualifier_list variable_type_redeclarator 2310 2313 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2311 2314 | '(' type_ptr ')' … … 2390 2393 // not as redundant parentheses around the identifier." 2391 2394 // 2392 // which precludes the following cases:2395 // For example: 2393 2396 // 2394 2397 // typedef float T;
Note:
See TracChangeset
for help on using the changeset viewer.