Changes in src/Parser/parser.yy [c6b1105:e7aed49]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rc6b1105 re7aed49 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 27 17:47:56201613 // Update Count : 1 62712 // Last Modified On : Wed Jun 22 21:20:17 2016 13 // Update Count : 1584 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 variable_type_redeclarator typedef_type_specifier226 %type<decl> type_parameter_redeclarator type_ptr 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 is context because it results in a commonuser error: subscripting a352 // CFA, comma_expression disallowed in the context because it results in a commom 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 requires424 // semanticschecks, e.g., ++3, 3--, *3, &&3423 // first location where constant/string can have operator applied: sizeof 3/sizeof "abc" still requires semantics 424 // 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 IDENTIFIER// GCC, address of label459 //{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( $2, true ) ); }458 | ANDAND no_attr_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,label466 | ANDAND { $$ = new OperatorNode( OperatorNode::And ); }467 465 ; 468 466 … … 653 651 654 652 labeled_statement: 655 // labels cannot be identifiers 0 or 1 656 IDENTIFIER ':' attribute_list_opt statement 653 no_attr_identifier ':' attribute_list_opt statement 657 654 { 658 655 $$ = $4->add_label( $1 ); … … 807 804 808 805 jump_statement: 809 GOTO IDENTIFIER';'806 GOTO no_attr_identifier ';' 810 807 { $$ = new StatementNode( StatementNode::Goto, $2 ); } 811 808 | GOTO '*' comma_expression ';' // GCC, computed goto … … 816 813 // A semantic check is required to ensure this statement appears only in the body of an iteration statement. 817 814 { $$ = new StatementNode( StatementNode::Continue ); } 818 | CONTINUE IDENTIFIER';' // CFA, multi-level continue815 | CONTINUE no_attr_identifier ';' // CFA, multi-level continue 819 816 // A semantic check is required to ensure this statement appears only in the body of an iteration statement, and 820 817 // the target of the transfer appears only at the start of an iteration statement. … … 823 820 // A semantic check is required to ensure this statement appears only in the body of an iteration statement. 824 821 { $$ = new StatementNode( StatementNode::Break ); } 825 | BREAK IDENTIFIER';' // CFA, multi-level exit822 | BREAK no_attr_identifier ';' // CFA, multi-level exit 826 823 // A semantic check is required to ensure this statement appears only in the body of an iteration statement, and 827 824 // the target of the transfer appears only at the start of an iteration statement. … … 1503 1500 // A semantic check is required to ensure bit_subrange only appears on base type int. 1504 1501 { $$ = $1->addBitfield( $2 ); } 1505 | variable_type_redeclarator bit_subrange_size_opt1502 | type_redeclarator bit_subrange_size_opt 1506 1503 // A semantic check is required to ensure bit_subrange only appears on base type int. 1507 1504 { $$ = $1->addBitfield( $2 ); } … … 1747 1744 1748 1745 designator: 1749 // lexer ambiguity: designator ".0" is floating-point constant or designator for name 0 only ".0" and ".1"1750 //allowed => semantic check1746 // lexer ambiguity: designator ".0" is floating-point constant or designator for name 0 1747 // only ".0" and ".1" allowed => semantic check 1751 1748 FLOATINGconstant 1752 1749 { $$ = new DesignatorNode( new VarRefNode( $1 ) ); } … … 1997 1994 function_definition 1998 1995 // These rules are a concession to the "implicit int" type_specifier because there is a significant amount of 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) 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) 2003 1999 | function_declarator compound_statement 2004 2000 { … … 2078 2074 declarator: 2079 2075 variable_declarator 2080 | variable_type_redeclarator2081 2076 | function_declarator 2077 | type_redeclarator 2082 2078 ; 2083 2079 … … 2205 2201 ; 2206 2202 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. 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. 2210 2207 2211 2208 function_declarator: … … 2291 2288 // and functions versus pointers to arrays and functions. 2292 2289 2293 variable_type_redeclarator:2290 type_redeclarator: 2294 2291 paren_type attribute_list_opt 2295 2292 { $$ = $1->addQualifiers( $2 ); } … … 2308 2305 2309 2306 type_ptr: 2310 ptrref_operator variable_type_redeclarator2307 ptrref_operator type_redeclarator 2311 2308 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2312 | ptrref_operator type_qualifier_list variable_type_redeclarator2309 | ptrref_operator type_qualifier_list type_redeclarator 2313 2310 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2314 2311 | '(' type_ptr ')' … … 2393 2390 // not as redundant parentheses around the identifier." 2394 2391 // 2395 // For example:2392 // which precludes the following cases: 2396 2393 // 2397 2394 // typedef float T;
Note:
See TracChangeset
for help on using the changeset viewer.