Changeset 647e2ea


Ignore:
Timestamp:
Mar 4, 2024, 6:05:52 PM (2 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
9262fe9
Parents:
1d5e5601
Message:

try @@(...) for attributes, rename and reorder grammar rules, remove apparently unnecessary push/pop rules, first attempt at [] => [void] return type

Location:
src/Parser
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/lex.ll

    r1d5e5601 r647e2ea  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Tue Oct  3 17:10:57 2023
    13  * Update Count     : 773
     12 * Last Modified On : Sat Feb 24 11:47:24 2024
     13 * Update Count     : 777
    1414 */
    1515
     
    407407";"                             { ASCIIOP_RETURN(); }
    408408"."                             { ASCIIOP_RETURN(); }                                   // also operator
     409"@@"                    { NAMEDOP_RETURN(ATTR); }                               // CFA, attribute shorthand
    409410"..."                   { NAMEDOP_RETURN(ELLIPSIS); }
    410411
  • src/Parser/parser.yy

    r1d5e5601 r647e2ea  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb 23 18:25:46 2024
    13 // Update Count     : 6484
     12// Last Modified On : Mon Mar  4 08:44:25 2024
     13// Update Count     : 6562
    1414//
    1515
     
    126126        DeclarationNode * cl = (new DeclarationNode)->addType( typeSpec ); // typeSpec IS DELETED!!!
    127127
    128         // Start at second variable in declaration list and clone the type specifiers for each variable..
     128        // Start at second variable in declaration list and clone the type specifiers for each variable.
    129129        for ( DeclarationNode * cur = dynamic_cast<DeclarationNode *>( declList->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
    130130                cl->cloneBaseType( cur, copyattr );                             // cur is modified
     
    389389%token LE GE EQ NE                                                                              // <=   >=      ==      !=
    390390%token ANDAND OROR                                                                              // &&   ||
    391 %token ELLIPSIS                                                                                 // ...
     391%token ATTR ELLIPSIS                                                                    // @@   ...
    392392
    393393%token EXPassign        MULTassign      DIVassign       MODassign       // \=   *=      /=      %=
     
    433433%type<stmt> statement                                   labeled_statement                       compound_statement
    434434%type<stmt> statement_decl                              statement_decl_list                     statement_list_nodecl
    435 %type<stmt> selection_statement                 if_statement
     435%type<stmt> selection_statement
    436436%type<clause> switch_clause_list_opt    switch_clause_list
    437437%type<expr> case_value
     
    500500%type<decl> cfa_identifier_parameter_declarator_tuple cfa_identifier_parameter_ptr
    501501
    502 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_ellipsis_list_opt
     502%type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_list_ellipsis_opt
    503503
    504504%type<decl> cfa_typedef_declaration cfa_variable_declaration cfa_variable_specifier
     
    508508%type<decl> KR_parameter_list KR_parameter_list_opt
    509509
    510 %type<decl> parameter_declaration parameter_list parameter_type_list_opt
     510%type<decl> parameter_declaration parameter_list parameter_list_ellipsis_opt
    511511
    512512%type<decl> paren_identifier paren_type
     
    530530%type<decl> type_parameter type_parameter_list type_initializer_opt
    531531
    532 %type<expr> type_parameters_opt type_list array_type_list
     532%type<expr> type_parameters_opt type_list array_type_list // array_dimension_list
    533533
    534534%type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list
     
    12461246        ;
    12471247
     1248// if, switch, and choose require parenthesis around the conditional because it can be followed by a statement.
     1249// For example, without parenthesis:
     1250//
     1251//    if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
     1252//    switch ( S ) { ... } => switch ( S ) { compound literal... } ... or
     1253
    12481254selection_statement:
    1249                         // pop causes a S/R conflict without separating the IF statement into a non-terminal even after resolving
    1250                         // the inherent S/R conflict with THEN/ELSE.
    1251         push if_statement pop
    1252                 { $$ = $2; }
     1255        IF '(' conditional_declaration ')' statement            %prec THEN
     1256                // explicitly deal with the shift/reduce conflict on if/else
     1257                { $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), nullptr ) ); }
     1258        | IF '(' conditional_declaration ')' statement ELSE statement
     1259                { $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), maybe_build_compound( yylloc, $7 ) ) ); }
    12531260        | SWITCH '(' comma_expression ')' case_clause
    12541261                { $$ = new StatementNode( build_switch( yylloc, true, $3, $5 ) ); }
     
    12741281        | CHOOSE '(' comma_expression ')' '{' error '}'         // CFA, invalid syntax rule
    12751282                { SemanticError( yylloc, "syntax error, declarations can only appear before the list of case clauses." ); $$ = nullptr; }
    1276         ;
    1277 
    1278 if_statement:
    1279         IF '(' conditional_declaration ')' statement            %prec THEN
    1280                 // explicitly deal with the shift/reduce conflict on if/else
    1281                 { $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), nullptr ) ); }
    1282         | IF '(' conditional_declaration ')' statement ELSE statement
    1283                 { $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), maybe_build_compound( yylloc, $7 ) ) ); }
    12841283        ;
    12851284
     
    18971896declaration_list:
    18981897        declaration
    1899         | declaration_list declaration          { $$ = $1->set_last( $2 ); }
     1898        | declaration_list declaration
     1899                { $$ = $1->set_last( $2 ); }
    19001900        ;
    19011901
     
    19901990        | declaration_qualifier_list type_qualifier_list cfa_function_specifier
    19911991                { $$ = $3->addQualifiers( $1 )->addQualifiers( $2 ); }
    1992         | cfa_function_declaration ',' identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')'
     1992        | cfa_function_declaration ',' identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')'
    19931993                {
    19941994                        // Append the return type at the start (left-hand-side) to each identifier in the list.
     
    20002000
    20012001cfa_function_specifier:                                                                 // CFA
    2002 //      '[' ']' identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' // S/R conflict
    2003 //              {
    2004 //                      $$ = DeclarationNode::newFunction( $3, DeclarationNode::newTuple( 0 ), $6, nullptr, true );
    2005 //              }
    2006 //      '[' ']' identifier '(' push cfa_parameter_ellipsis_list_opt pop ')'
    2007 //              {
    2008 //                      typedefTable.setNextIdentifier( *$5 );
    2009 //                      $$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, nullptr, true );
    2010 //              }
    2011 //      | '[' ']' TYPEDEFname '(' push cfa_parameter_ellipsis_list_opt pop ')'
    2012 //              {
    2013 //                      typedefTable.setNextIdentifier( *$5 );
    2014 //                      $$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, nullptr, true );
    2015 //              }
    2016 //      | '[' ']' typegen_name
     2002        '[' ']' identifier '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
     2003                { $$ = DeclarationNode::newFunction( $3,  DeclarationNode::newTuple( nullptr ), $6, nullptr )->addQualifiers( $9 ); }
     2004        | '[' ']' TYPEDEFname '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
     2005                { $$ = DeclarationNode::newFunction( $3,  DeclarationNode::newTuple( nullptr ), $6, nullptr )->addQualifiers( $9 ); }
     2006        // | '[' ']' TYPEGENname '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
     2007        //      { $$ = DeclarationNode::newFunction( $3,  DeclarationNode::newTuple( nullptr ), $6, nullptr )->addQualifiers( $9 ); }
     2008
    20172009                // identifier_or_type_name must be broken apart because of the sequence:
    20182010                //
    2019                 //   '[' ']' identifier_or_type_name '(' cfa_parameter_ellipsis_list_opt ')'
     2011                //   '[' ']' identifier_or_type_name '(' cfa_parameter_list_ellipsis_opt ')'
    20202012                //   '[' ']' type_specifier
    20212013                //
    20222014                // type_specifier can resolve to just TYPEDEFname (e.g., typedef int T; int f( T );). Therefore this must be
    20232015                // flattened to allow lookahead to the '(' without having to reduce identifier_or_type_name.
    2024         cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
     2016        | cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
    20252017                // To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator).
    20262018                { $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); }
    2027         | cfa_function_return identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
     2019        | cfa_function_return identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
    20282020                { $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); }
    20292021        ;
     
    20322024        '[' push cfa_parameter_list pop ']'
    20332025                { $$ = DeclarationNode::newTuple( $3 ); }
    2034         | '[' push cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ']'
     2026        | '[' push cfa_parameter_list ',' cfa_abstract_parameter_list pop ']'
    20352027                // To obtain LR(1 ), the last cfa_abstract_parameter_list is added into this flattened rule to lookahead to the ']'.
    2036                 { $$ = DeclarationNode::newTuple( $3->set_last( $7 ) ); }
     2028                { $$ = DeclarationNode::newTuple( $3->set_last( $5 ) ); }
    20372029        ;
    20382030
     
    20482040                        $$ = $2->addTypedef();
    20492041                }
    2050         | cfa_typedef_declaration pop ',' push identifier
    2051                 {
    2052                         typedefTable.addToEnclosingScope( *$5, TYPEDEFname, "cfa_typedef_declaration 3" );
    2053                         $$ = $1->set_last( $1->cloneType( $5 ) );
     2042        | cfa_typedef_declaration ',' identifier
     2043                {
     2044                        typedefTable.addToEnclosingScope( *$3, TYPEDEFname, "cfa_typedef_declaration 3" );
     2045                        $$ = $1->set_last( $1->cloneType( $3 ) );
    20542046                }
    20552047        ;
     
    26912683        ;
    26922684
     2685// ***********
     2686// Enumeration
     2687// ***********
     2688
    26932689enum_type:
    26942690        ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
     
    27192715        | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt
    27202716                {
    2721                         if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0 )) {
     2717                        if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0) ) {
    27222718                                SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );
    27232719                        }
     
    27892785        ;
    27902786
    2791 cfa_parameter_ellipsis_list_opt:                                                // CFA, abstract + real
    2792         // empty
    2793                 { $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); }
    2794         | ELLIPSIS
    2795                 { $$ = nullptr; }
    2796         | cfa_abstract_parameter_list
    2797         | cfa_parameter_list
    2798         | cfa_parameter_list pop ',' push cfa_abstract_parameter_list
    2799                 { $$ = $1->set_last( $5 ); }
    2800         | cfa_abstract_parameter_list pop ',' push ELLIPSIS
    2801                 { $$ = $1->addVarArgs(); }
    2802         | cfa_parameter_list pop ',' push ELLIPSIS
    2803                 { $$ = $1->addVarArgs(); }
    2804         ;
    2805 
    2806 cfa_parameter_list:                                                                             // CFA
    2807                 // To obtain LR(1) between cfa_parameter_list and cfa_abstract_tuple, the last cfa_abstract_parameter_list is
    2808                 // factored out from cfa_parameter_list, flattening the rules to get lookahead to the ']'.
    2809         cfa_parameter_declaration
    2810         | cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
    2811                 { $$ = $1->set_last( $5 ); }
    2812         | cfa_parameter_list pop ',' push cfa_parameter_declaration
    2813                 { $$ = $1->set_last( $5 ); }
    2814         | cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
    2815                 { $$ = $1->set_last( $5 )->set_last( $9 ); }
    2816         ;
    2817 
    2818 cfa_abstract_parameter_list:                                                    // CFA, new & old style abstract
    2819         cfa_abstract_parameter_declaration
    2820         | cfa_abstract_parameter_list pop ',' push cfa_abstract_parameter_declaration
    2821                 { $$ = $1->set_last( $5 ); }
    2822         ;
    2823 
    2824 parameter_type_list_opt:
     2787// *******************
     2788// Function parameters
     2789// *******************
     2790
     2791parameter_list_ellipsis_opt:
    28252792        // empty
    28262793                { $$ = nullptr; }
     
    28332800
    28342801parameter_list:                                                                                 // abstract + real
    2835         abstract_parameter_declaration
    2836         | parameter_declaration
     2802        parameter_declaration
     2803        | abstract_parameter_declaration
     2804        | parameter_list ',' parameter_declaration
     2805                { $$ = $1->set_last( $3 ); }
    28372806        | parameter_list ',' abstract_parameter_declaration
    28382807                { $$ = $1->set_last( $3 ); }
    2839         | parameter_list ',' parameter_declaration
     2808        ;
     2809
     2810cfa_parameter_list_ellipsis_opt:                                                // CFA, abstract + real
     2811        // empty
     2812                { $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); }
     2813        | ELLIPSIS
     2814                { $$ = nullptr; }
     2815        | cfa_parameter_list
     2816        | cfa_abstract_parameter_list
     2817        | cfa_parameter_list ',' cfa_abstract_parameter_list
     2818                { $$ = $1->set_last( $3 ); }
     2819        | cfa_parameter_list ',' ELLIPSIS
     2820                { $$ = $1->addVarArgs(); }
     2821        | cfa_abstract_parameter_list ',' ELLIPSIS
     2822                { $$ = $1->addVarArgs(); }
     2823        ;
     2824
     2825cfa_parameter_list:                                                                             // CFA
     2826                // To obtain LR(1) between cfa_parameter_list and cfa_abstract_tuple, the last cfa_abstract_parameter_list is
     2827                // factored out from cfa_parameter_list, flattening the rules to get lookahead to the ']'.
     2828        cfa_parameter_declaration
     2829        | cfa_abstract_parameter_list ',' cfa_parameter_declaration
     2830                { $$ = $1->set_last( $3 ); }
     2831        | cfa_parameter_list ',' cfa_parameter_declaration
     2832                { $$ = $1->set_last( $3 ); }
     2833        | cfa_parameter_list ',' cfa_abstract_parameter_list ',' cfa_parameter_declaration
     2834                { $$ = $1->set_last( $3 )->set_last( $5 ); }
     2835        ;
     2836
     2837cfa_abstract_parameter_list:                                                    // CFA, new & old style abstract
     2838        cfa_abstract_parameter_declaration
     2839        | cfa_abstract_parameter_list ',' cfa_abstract_parameter_declaration
    28402840                { $$ = $1->set_last( $3 ); }
    28412841        ;
     
    28432843// Provides optional identifier names (abstract_declarator/variable_declarator), no initialization, different semantics
    28442844// for typedef name by using type_parameter_redeclarator instead of typedef_redeclarator, and function prototypes.
     2845
     2846parameter_declaration:
     2847                // No SUE declaration in parameter list.
     2848        declaration_specifier_nobody identifier_parameter_declarator default_initializer_opt
     2849                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
     2850        | declaration_specifier_nobody type_parameter_redeclarator default_initializer_opt
     2851                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
     2852        ;
     2853
     2854abstract_parameter_declaration:
     2855        declaration_specifier_nobody default_initializer_opt
     2856                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
     2857        | declaration_specifier_nobody abstract_parameter_declarator default_initializer_opt
     2858                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
     2859        ;
    28452860
    28462861cfa_parameter_declaration:                                                              // CFA, new & old style parameter declaration
     
    28642879                { $$ = $2->addQualifiers( $1 ); }
    28652880        | cfa_abstract_function
    2866         ;
    2867 
    2868 parameter_declaration:
    2869                 // No SUE declaration in parameter list.
    2870         declaration_specifier_nobody identifier_parameter_declarator default_initializer_opt
    2871                 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    2872         | declaration_specifier_nobody type_parameter_redeclarator default_initializer_opt
    2873                 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    2874         ;
    2875 
    2876 abstract_parameter_declaration:
    2877         declaration_specifier_nobody default_initializer_opt
    2878                 { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    2879         | declaration_specifier_nobody abstract_parameter_declarator default_initializer_opt
    2880                 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    28812881        ;
    28822882
     
    33953395        ATTRIBUTE '(' '(' attribute_name_list ')' ')'
    33963396                { $$ = $4; }
     3397        | ATTRIBUTE '(' attribute_name_list ')'                         // CFA
     3398                { $$ = $3; }
     3399        | ATTR '(' attribute_name_list ')'                                      // CFA
     3400                { $$ = $3; }
    33973401        ;
    33983402
     
    34993503
    35003504variable_function:
    3501         '(' variable_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3505        '(' variable_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    35023506                { $$ = $2->addParamList( $5 ); }
    3503         | '(' attribute_list variable_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3507        | '(' attribute_list variable_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    35043508                { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
    35053509        | '(' variable_function ')'                                                     // redundant parenthesis
     
    35223526
    35233527function_no_ptr:
    3524         paren_identifier '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3528        paren_identifier '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    35253529                { $$ = $1->addParamList( $3 ); }
    3526         | '(' function_ptr ')' '(' parameter_type_list_opt ')'
     3530        | '(' function_ptr ')' '(' parameter_list_ellipsis_opt ')'
    35273531                { $$ = $2->addParamList( $5 ); }
    3528         | '(' attribute_list function_ptr ')' '(' parameter_type_list_opt ')'
     3532        | '(' attribute_list function_ptr ')' '(' parameter_list_ellipsis_opt ')'
    35293533                { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
    35303534        | '(' function_no_ptr ')'                                                       // redundant parenthesis
     
    35763580        paren_identifier '(' identifier_list ')'                        // function_declarator handles empty parameter
    35773581                { $$ = $1->addIdList( $3 ); }
    3578         | '(' KR_function_ptr ')' '(' parameter_type_list_opt ')'
     3582        | '(' KR_function_ptr ')' '(' parameter_list_ellipsis_opt ')'
    35793583                { $$ = $2->addParamList( $5 ); }
    3580         | '(' attribute_list KR_function_ptr ')' '(' parameter_type_list_opt ')'
     3584        | '(' attribute_list KR_function_ptr ')' '(' parameter_list_ellipsis_opt ')'
    35813585                { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
    35823586        | '(' KR_function_no_ptr ')'                                            // redundant parenthesis
     
    36683672
    36693673variable_type_function:
    3670         '(' variable_type_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3674        '(' variable_type_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    36713675                { $$ = $2->addParamList( $5 ); }
    3672         | '(' attribute_list variable_type_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3676        | '(' attribute_list variable_type_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    36733677                { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
    36743678        | '(' variable_type_function ')'                                        // redundant parenthesis
     
    36913695
    36923696function_type_no_ptr:
    3693         paren_type '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3697        paren_type '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    36943698                { $$ = $1->addParamList( $3 ); }
    3695         | '(' function_type_ptr ')' '(' parameter_type_list_opt ')'
     3699        | '(' function_type_ptr ')' '(' parameter_list_ellipsis_opt ')'
    36963700                { $$ = $2->addParamList( $5 ); }
    3697         | '(' attribute_list function_type_ptr ')' '(' parameter_type_list_opt ')'
     3701        | '(' attribute_list function_type_ptr ')' '(' parameter_list_ellipsis_opt ')'
    36983702                { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
    36993703        | '(' function_type_no_ptr ')'                                          // redundant parenthesis
     
    37383742                { $$ = $1->addQualifiers( $2 ); }
    37393743        | '&' MUTEX paren_identifier attribute_list_opt
    3740                 { $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ), OperKinds::AddressOf ) )->addQualifiers( $4 ); }
     3744                { $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ),
     3745                                                                                                                        OperKinds::AddressOf ) )->addQualifiers( $4 ); }
    37413746        | identifier_parameter_ptr
    37423747        | identifier_parameter_array attribute_list_opt
     
    37673772
    37683773identifier_parameter_function:
    3769         paren_identifier '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3774        paren_identifier '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    37703775                { $$ = $1->addParamList( $3 ); }
    3771         | '(' identifier_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3776        | '(' identifier_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    37723777                { $$ = $2->addParamList( $5 ); }
    37733778        | '(' identifier_parameter_function ')'                         // redundant parenthesis
     
    37883793                { $$ = $1->addQualifiers( $2 ); }
    37893794        | '&' MUTEX typedef_name attribute_list_opt
    3790                 { $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ), OperKinds::AddressOf ) )->addQualifiers( $4 ); }
     3795                { $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ),
     3796                                                                                                                        OperKinds::AddressOf ) )->addQualifiers( $4 ); }
    37913797        | type_parameter_ptr
    37923798        | type_parameter_array attribute_list_opt
     
    38203826
    38213827type_parameter_function:
    3822         typedef_name '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3828        typedef_name '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    38233829                { $$ = $1->addParamList( $3 ); }
    3824         | '(' type_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3830        | '(' type_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    38253831                { $$ = $2->addParamList( $5 ); }
    38263832        ;
     
    38703876
    38713877abstract_function:
    3872         '(' parameter_type_list_opt ')'                 // empty parameter list OBSOLESCENT (see 3)
     3878        '(' parameter_list_ellipsis_opt ')'                     // empty parameter list OBSOLESCENT (see 3)
    38733879                { $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
    3874         | '(' abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3880        | '(' abstract_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    38753881                { $$ = $2->addParamList( $5 ); }
    38763882        | '(' abstract_function ')'                                                     // redundant parenthesis
     
    38883894                { $$ = DeclarationNode::newArray( $3, nullptr, false )->addArray( DeclarationNode::newArray( $6, nullptr, false ) ); }
    38893895                // { SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
     3896
     3897                // If needed, the following parses and does not use comma_expression, so the array structure can be built.
     3898        // | '[' push assignment_expression pop ',' push array_dimension_list pop ']' // CFA
     3899
    38903900        | '[' push array_type_list pop ']'                                      // CFA
    38913901                { $$ = DeclarationNode::newArray( $3, nullptr, false ); }
    38923902        | multi_array_dimension
    38933903        ;
     3904
     3905// array_dimension_list:
     3906//      assignment_expression
     3907//      | array_dimension_list ',' assignment_expression
     3908//      ;
    38943909
    38953910array_type_list:
     
    39934008
    39944009abstract_parameter_function:
    3995         '(' parameter_type_list_opt ')'                 // empty parameter list OBSOLESCENT (see 3)
     4010        '(' parameter_list_ellipsis_opt ')'                     // empty parameter list OBSOLESCENT (see 3)
    39964011                { $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
    3997         | '(' abstract_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     4012        | '(' abstract_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    39984013                { $$ = $2->addParamList( $5 ); }
    39994014        | '(' abstract_parameter_function ')'                           // redundant parenthesis
     
    40724087
    40734088variable_abstract_function:
    4074         '(' variable_abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
     4089        '(' variable_abstract_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
    40754090                { $$ = $2->addParamList( $5 ); }
    40764091        | '(' variable_abstract_function ')'                            // redundant parenthesis
     
    41584173//
    41594174//              cfa_abstract_tuple identifier_or_type_name
    4160 //              '[' cfa_parameter_list ']' identifier_or_type_name '(' cfa_parameter_ellipsis_list_opt ')'
     4175//              '[' cfa_parameter_list ']' identifier_or_type_name '(' cfa_parameter_list_ellipsis_opt ')'
    41614176//
    41624177// since a function return type can be syntactically identical to a tuple type:
     
    42244239
    42254240cfa_abstract_function:                                                                  // CFA
    4226 //      '[' ']' '(' cfa_parameter_ellipsis_list_opt ')'
    4227 //              { $$ = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), $4, nullptr ); }
    4228         cfa_abstract_tuple '(' push cfa_parameter_ellipsis_list_opt pop ')'
     4241        '[' ']' '(' cfa_parameter_list_ellipsis_opt ')'
     4242                { $$ = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), $4, nullptr ); }
     4243        | cfa_abstract_tuple '(' push cfa_parameter_list_ellipsis_opt pop ')'
    42294244                { $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); }
    4230         | cfa_function_return '(' push cfa_parameter_ellipsis_list_opt pop ')'
     4245        | cfa_function_return '(' push cfa_parameter_list_ellipsis_opt pop ')'
    42314246                { $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); }
    42324247        ;
Note: See TracChangeset for help on using the changeset viewer.