Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rc6b1105 re7aed49  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jun 27 17:47:56 2016
    13 // Update Count     : 1627
     12// Last Modified On : Wed Jun 22 21:20:17 2016
     13// Update Count     : 1584
    1414//
    1515
     
    224224%type<decl> typedef type_array typedef_declaration typedef_declaration_specifier typedef_expression
    225225%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_specifier
     226%type<decl> type_parameter_redeclarator type_ptr type_redeclarator typedef_type_specifier
    227227%type<decl> typegen_declaration_specifier typegen_type_specifier typegen_name
    228228
     
    350350        primary_expression
    351351        | postfix_expression '[' push assignment_expression pop ']'
    352                 // CFA, comma_expression disallowed in this context because it results in a common user error: subscripting a
     352                // CFA, comma_expression disallowed in the context because it results in a commom user error: subscripting a
    353353                // matrix with x[i,j] instead of x[i][j]. While this change is not backwards compatible, there seems to be
    354354                // little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is
     
    421421unary_expression:
    422422        postfix_expression
    423                 // first location where constant/string can have operator applied: sizeof 3/sizeof "abc" still requires
    424                 // semantics checks, e.g., ++3, 3--, *3, &&3
     423        // first location where constant/string can have operator applied: sizeof 3/sizeof "abc" still requires semantics
     424        // checks, e.g., ++3, 3--, *3, &&3
    425425        | constant
    426426                { $$ = $1; }
     
    431431        | ptrref_operator cast_expression                                       // CFA
    432432                { $$ = new CompositeExprNode( $1, $2 ); }
    433                 // '*' ('&') is separated from unary_operator because of shift/reduce conflict in:
    434                 //              { * X; }         // dereference X
    435                 //              { * int X; } // CFA declaration of pointer to int
     433        // '*' ('&') is separated from unary_operator because of shift/reduce conflict in:
     434        //              { * X; }         // dereference X
     435        //              { * int X; } // CFA declaration of pointer to int
    436436        | unary_operator cast_expression
    437437                { $$ = new CompositeExprNode( $1, $2 ); }
     
    456456        | ALIGNOF '(' type_name_no_function ')'                         // GCC, type alignment
    457457                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( $3 ) ); }
    458 //      | ANDAND IDENTIFIER                                                                     // GCC, address of label
    459 //              { $$ = 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 ) ); }
    460460        ;
    461461
     
    463463        '*'                                                                                     { $$ = new OperatorNode( OperatorNode::PointTo ); }
    464464        | '&'                                                                           { $$ = 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 ); }
    467465        ;
    468466
     
    653651
    654652labeled_statement:
    655                 // labels cannot be identifiers 0 or 1
    656         IDENTIFIER ':' attribute_list_opt statement
     653        no_attr_identifier ':' attribute_list_opt statement
    657654                {
    658655                        $$ = $4->add_label( $1 );
     
    807804
    808805jump_statement:
    809         GOTO IDENTIFIER ';'
     806        GOTO no_attr_identifier ';'
    810807                { $$ = new StatementNode( StatementNode::Goto, $2 ); }
    811808        | GOTO '*' comma_expression ';'                                         // GCC, computed goto
     
    816813                // A semantic check is required to ensure this statement appears only in the body of an iteration statement.
    817814                { $$ = new StatementNode( StatementNode::Continue ); }
    818         | CONTINUE IDENTIFIER ';'                                       // CFA, multi-level continue
     815        | CONTINUE no_attr_identifier ';'                                       // CFA, multi-level continue
    819816                // A semantic check is required to ensure this statement appears only in the body of an iteration statement, and
    820817                // the target of the transfer appears only at the start of an iteration statement.
     
    823820                // A semantic check is required to ensure this statement appears only in the body of an iteration statement.
    824821                { $$ = new StatementNode( StatementNode::Break ); }
    825         | BREAK IDENTIFIER ';'                                          // CFA, multi-level exit
     822        | BREAK no_attr_identifier ';'                                          // CFA, multi-level exit
    826823                // A semantic check is required to ensure this statement appears only in the body of an iteration statement, and
    827824                // the target of the transfer appears only at the start of an iteration statement.
     
    15031500                // A semantic check is required to ensure bit_subrange only appears on base type int.
    15041501                { $$ = $1->addBitfield( $2 ); }
    1505         | variable_type_redeclarator bit_subrange_size_opt
     1502        | type_redeclarator bit_subrange_size_opt
    15061503                // A semantic check is required to ensure bit_subrange only appears on base type int.
    15071504                { $$ = $1->addBitfield( $2 ); }
     
    17471744
    17481745designator:
    1749                 // lexer ambiguity: designator ".0" is floating-point constant or designator for name 0 only ".0" and ".1"
    1750                 // allowed => semantic check
     1746        // lexer ambiguity: designator ".0" is floating-point constant or designator for name 0
     1747        // only ".0" and ".1" allowed => semantic check
    17511748        FLOATINGconstant
    17521749                { $$ = new DesignatorNode( new VarRefNode( $1 ) ); }
     
    19971994        function_definition
    19981995                // 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)
    20031999        | function_declarator compound_statement
    20042000                {
     
    20782074declarator:
    20792075        variable_declarator
    2080         | variable_type_redeclarator
    20812076        | function_declarator
     2077        | type_redeclarator
    20822078        ;
    20832079
     
    22052201        ;
    22062202
    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.
    22102207
    22112208function_declarator:
     
    22912288// and functions versus pointers to arrays and functions.
    22922289
    2293 variable_type_redeclarator:
     2290type_redeclarator:
    22942291        paren_type attribute_list_opt
    22952292                { $$ = $1->addQualifiers( $2 ); }
     
    23082305
    23092306type_ptr:
    2310         ptrref_operator variable_type_redeclarator
     2307        ptrref_operator type_redeclarator
    23112308                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    2312         | ptrref_operator type_qualifier_list variable_type_redeclarator
     2309        | ptrref_operator type_qualifier_list type_redeclarator
    23132310                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    23142311        | '(' type_ptr ')'
     
    23932390//              not as redundant parentheses around the identifier."
    23942391//
    2395 // For example:
     2392// which precludes the following cases:
    23962393//
    23972394//              typedef float T;
Note: See TracChangeset for help on using the changeset viewer.