Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    refc8f3e r63b3279e  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Oct 15 09:20:17 2021
    13 // Update Count     : 5163
     12// Last Modified On : Sat Sep 11 08:20:44 2021
     13// Update Count     : 5040
    1414//
    1515
     
    3131// from ANSI90 to ANSI11 C are marked with the comment "C99/C11".
    3232
    33 // This grammar also has two levels of extensions. The first extensions cover most of the GCC C extensions. All of the
     33// This grammar also has two levels of extensions. The first extensions cover most of the GCC C extensions All of the
    3434// syntactic extensions for GCC C are marked with the comment "GCC". The second extensions are for Cforall (CFA), which
    3535// fixes several of C's outstanding problems and extends C with many modern language concepts. All of the syntactic
     
    6969        // 2. String encodings are transformed into canonical form (one encoding at start) so the encoding can be found
    7070        //    without searching the string, e.g.: "abc" L"def" L"ghi" => L"abc" "def" "ghi". Multiple encodings must match,
    71         //    e.g., u"a" U"b" L"c" is disallowed.
     71        //    i.e., u"a" U"b" L"c" is disallowed.
    7272
    7373        if ( from[0] != '"' ) {                                                         // encoding ?
     
    310310%token ATassign                                                                                 // @=
    311311
    312 %type<tok> identifier                                   identifier_at                           identifier_or_type_name         attr_name
     312%type<tok> identifier
     313%type<tok> identifier_or_type_name  attr_name
    313314%type<tok> quasi_keyword
    314315%type<constant> string_literal
     
    326327%type<en> conditional_expression                constant_expression                     assignment_expression           assignment_expression_opt
    327328%type<en> comma_expression                              comma_expression_opt
    328 %type<en> argument_expression_list_opt  argument_expression_list        argument_expression                     default_initializer_opt
     329%type<en> argument_expression_list_opt  argument_expression                     default_initializer_opt
    329330%type<ifctl> if_control_expression
    330331%type<fctl> for_control_expression              for_control_expression_list
     
    558559        IDENTIFIER
    559560        | quasi_keyword
    560         ;
    561 
    562 identifier_at:
    563         identifier
    564561        | '@'                                                                                           // CFA
    565562                { Token tok = { new string( DeclarationNode::anonymous.newName() ), yylval.tok.loc }; $$ = tok; }
     
    696693        // empty
    697694                { $$ = nullptr; }
    698         | argument_expression_list
    699         ;
    700 
    701 argument_expression_list:
    702         argument_expression
     695        | argument_expression
    703696        | argument_expression_list_opt ',' argument_expression
    704697                { $$ = (ExpressionNode *)($1->set_last( $3 )); }
     
    738731        | FLOATINGconstant fraction_constants_opt
    739732                { $$ = new ExpressionNode( build_field_name_fraction_constants( build_field_name_FLOATINGconstant( *$1 ), $2 ) ); }
    740         | identifier_at fraction_constants_opt                          // CFA, allow anonymous fields
     733        | identifier fraction_constants_opt
    741734                {
    742735                        $$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) );
     
    10911084        comma_expression_opt ';'
    10921085                { $$ = 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; }
    10961086        ;
    10971087
     
    11921182
    11931183iteration_statement:
    1194         WHILE '(' ')' statement                                                         // CFA => while ( 1 )
     1184        WHILE '(' push if_control_expression ')' statement pop
     1185                { $$ = new StatementNode( build_while( $4, maybe_build_compound( $6 ) ) ); }
     1186        | WHILE '(' ')' statement                                                       // CFA => while ( 1 )
    11951187                { $$ = new StatementNode( build_while( new IfCtrl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) ); }
    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; }
     1188        | DO statement WHILE '(' comma_expression ')' ';'
     1189                { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); }
    12001190        | DO statement WHILE '(' ')' ';'                                        // CFA => do while( 1 )
    12011191                { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) ); }
    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; }
     1192        | FOR '(' push for_control_expression_list ')' statement pop
     1193                { $$ = new StatementNode( build_for( $4, maybe_build_compound( $6 ) ) ); }
    12061194        | FOR '(' ')' statement                                                         // CFA => for ( ;; )
    12071195                { $$ = 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; }
    12121196        ;
    12131197
     
    13551339with_statement:
    13561340        WITH '(' tuple_expression_list ')' statement
    1357                 { $$ = new StatementNode( build_with( $3, $5 ) ); }
     1341                {
     1342                        $$ = new StatementNode( build_with( $3, $5 ) );
     1343                }
    13581344        ;
    13591345
    13601346// If MUTEX becomes a general qualifier, there are shift/reduce conflicts, so change syntax to "with mutex".
    13611347mutex_statement:
    1362         MUTEX '(' argument_expression_list ')' statement
     1348        MUTEX '(' argument_expression_list_opt ')' statement
    13631349                { $$ = new StatementNode( build_mutex( $3, $5 ) ); }
    13641350        ;
     
    24892475designation:
    24902476        designator_list ':'                                                                     // C99, CFA uses ":" instead of "="
    2491         | identifier_at ':'                                                                     // GCC, field name
     2477        | identifier ':'                                                                        // GCC, field name
    24922478                { $$ = new ExpressionNode( build_varref( $1 ) ); }
    24932479        ;
     
    25012487
    25022488designator:
    2503         '.' identifier_at                                                                       // C99, field name
     2489        '.' identifier                                                                          // C99, field name
    25042490                { $$ = new ExpressionNode( build_varref( $2 ) ); }
    25052491        | '[' push assignment_expression pop ']'                        // C99, single array element
     
    29332919
    29342920paren_identifier:
    2935         identifier_at
     2921        identifier
    29362922                { $$ = DeclarationNode::newName( $1 ); }
    29372923        | '(' paren_identifier ')'                                                      // redundant parenthesis
Note: See TracChangeset for help on using the changeset viewer.