Changeset 647e2ea
- Timestamp:
- Mar 4, 2024, 6:05:52 PM (13 months ago)
- Branches:
- master
- Children:
- 9262fe9
- Parents:
- 1d5e5601
- Location:
- src/Parser
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Parser/lex.ll ¶
r1d5e5601 r647e2ea 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Tue Oct 3 17:10:57 202313 * Update Count : 77 312 * Last Modified On : Sat Feb 24 11:47:24 2024 13 * Update Count : 777 14 14 */ 15 15 … … 407 407 ";" { ASCIIOP_RETURN(); } 408 408 "." { ASCIIOP_RETURN(); } // also operator 409 "@@" { NAMEDOP_RETURN(ATTR); } // CFA, attribute shorthand 409 410 "..." { NAMEDOP_RETURN(ELLIPSIS); } 410 411 -
TabularUnified src/Parser/parser.yy ¶
r1d5e5601 r647e2ea 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 23 18:25:46202413 // Update Count : 6 48412 // Last Modified On : Mon Mar 4 08:44:25 2024 13 // Update Count : 6562 14 14 // 15 15 … … 126 126 DeclarationNode * cl = (new DeclarationNode)->addType( typeSpec ); // typeSpec IS DELETED!!! 127 127 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. 129 129 for ( DeclarationNode * cur = dynamic_cast<DeclarationNode *>( declList->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) { 130 130 cl->cloneBaseType( cur, copyattr ); // cur is modified … … 389 389 %token LE GE EQ NE // <= >= == != 390 390 %token ANDAND OROR // && || 391 %token ELLIPSIS //...391 %token ATTR ELLIPSIS // @@ ... 392 392 393 393 %token EXPassign MULTassign DIVassign MODassign // \= *= /= %= … … 433 433 %type<stmt> statement labeled_statement compound_statement 434 434 %type<stmt> statement_decl statement_decl_list statement_list_nodecl 435 %type<stmt> selection_statement if_statement435 %type<stmt> selection_statement 436 436 %type<clause> switch_clause_list_opt switch_clause_list 437 437 %type<expr> case_value … … 500 500 %type<decl> cfa_identifier_parameter_declarator_tuple cfa_identifier_parameter_ptr 501 501 502 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_ ellipsis_list_opt502 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_list_ellipsis_opt 503 503 504 504 %type<decl> cfa_typedef_declaration cfa_variable_declaration cfa_variable_specifier … … 508 508 %type<decl> KR_parameter_list KR_parameter_list_opt 509 509 510 %type<decl> parameter_declaration parameter_list parameter_ type_list_opt510 %type<decl> parameter_declaration parameter_list parameter_list_ellipsis_opt 511 511 512 512 %type<decl> paren_identifier paren_type … … 530 530 %type<decl> type_parameter type_parameter_list type_initializer_opt 531 531 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 533 533 534 534 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list … … 1246 1246 ; 1247 1247 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 1248 1254 selection_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 ) ) ); } 1253 1260 | SWITCH '(' comma_expression ')' case_clause 1254 1261 { $$ = new StatementNode( build_switch( yylloc, true, $3, $5 ) ); } … … 1274 1281 | CHOOSE '(' comma_expression ')' '{' error '}' // CFA, invalid syntax rule 1275 1282 { 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 THEN1280 // explicitly deal with the shift/reduce conflict on if/else1281 { $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), nullptr ) ); }1282 | IF '(' conditional_declaration ')' statement ELSE statement1283 { $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), maybe_build_compound( yylloc, $7 ) ) ); }1284 1283 ; 1285 1284 … … 1897 1896 declaration_list: 1898 1897 declaration 1899 | declaration_list declaration { $$ = $1->set_last( $2 ); } 1898 | declaration_list declaration 1899 { $$ = $1->set_last( $2 ); } 1900 1900 ; 1901 1901 … … 1990 1990 | declaration_qualifier_list type_qualifier_list cfa_function_specifier 1991 1991 { $$ = $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 ')' 1993 1993 { 1994 1994 // Append the return type at the start (left-hand-side) to each identifier in the list. … … 2000 2000 2001 2001 cfa_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 2017 2009 // identifier_or_type_name must be broken apart because of the sequence: 2018 2010 // 2019 // '[' ']' identifier_or_type_name '(' cfa_parameter_ ellipsis_list_opt ')'2011 // '[' ']' identifier_or_type_name '(' cfa_parameter_list_ellipsis_opt ')' 2020 2012 // '[' ']' type_specifier 2021 2013 // 2022 2014 // type_specifier can resolve to just TYPEDEFname (e.g., typedef int T; int f( T );). Therefore this must be 2023 2015 // 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_opt2016 | cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt 2025 2017 // To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator). 2026 2018 { $$ = 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_opt2019 | cfa_function_return identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt 2028 2020 { $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); } 2029 2021 ; … … 2032 2024 '[' push cfa_parameter_list pop ']' 2033 2025 { $$ = DeclarationNode::newTuple( $3 ); } 2034 | '[' push cfa_parameter_list pop ',' pushcfa_abstract_parameter_list pop ']'2026 | '[' push cfa_parameter_list ',' cfa_abstract_parameter_list pop ']' 2035 2027 // 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 ) ); } 2037 2029 ; 2038 2030 … … 2048 2040 $$ = $2->addTypedef(); 2049 2041 } 2050 | cfa_typedef_declaration pop ',' pushidentifier2051 { 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 ) ); 2054 2046 } 2055 2047 ; … … 2691 2683 ; 2692 2684 2685 // *********** 2686 // Enumeration 2687 // *********** 2688 2693 2689 enum_type: 2694 2690 ENUM attribute_list_opt '{' enumerator_list comma_opt '}' … … 2719 2715 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt 2720 2716 { 2721 if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0 )) {2717 if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0) ) { 2722 2718 SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); 2723 2719 } … … 2789 2785 ; 2790 2786 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 2791 parameter_list_ellipsis_opt: 2825 2792 // empty 2826 2793 { $$ = nullptr; } … … 2833 2800 2834 2801 parameter_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 ); } 2837 2806 | parameter_list ',' abstract_parameter_declaration 2838 2807 { $$ = $1->set_last( $3 ); } 2839 | parameter_list ',' parameter_declaration 2808 ; 2809 2810 cfa_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 2825 cfa_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 2837 cfa_abstract_parameter_list: // CFA, new & old style abstract 2838 cfa_abstract_parameter_declaration 2839 | cfa_abstract_parameter_list ',' cfa_abstract_parameter_declaration 2840 2840 { $$ = $1->set_last( $3 ); } 2841 2841 ; … … 2843 2843 // Provides optional identifier names (abstract_declarator/variable_declarator), no initialization, different semantics 2844 2844 // for typedef name by using type_parameter_redeclarator instead of typedef_redeclarator, and function prototypes. 2845 2846 parameter_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 2854 abstract_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 ; 2845 2860 2846 2861 cfa_parameter_declaration: // CFA, new & old style parameter declaration … … 2864 2879 { $$ = $2->addQualifiers( $1 ); } 2865 2880 | cfa_abstract_function 2866 ;2867 2868 parameter_declaration:2869 // No SUE declaration in parameter list.2870 declaration_specifier_nobody identifier_parameter_declarator default_initializer_opt2871 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }2872 | declaration_specifier_nobody type_parameter_redeclarator default_initializer_opt2873 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }2874 ;2875 2876 abstract_parameter_declaration:2877 declaration_specifier_nobody default_initializer_opt2878 { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }2879 | declaration_specifier_nobody abstract_parameter_declarator default_initializer_opt2880 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }2881 2881 ; 2882 2882 … … 3395 3395 ATTRIBUTE '(' '(' attribute_name_list ')' ')' 3396 3396 { $$ = $4; } 3397 | ATTRIBUTE '(' attribute_name_list ')' // CFA 3398 { $$ = $3; } 3399 | ATTR '(' attribute_name_list ')' // CFA 3400 { $$ = $3; } 3397 3401 ; 3398 3402 … … 3499 3503 3500 3504 variable_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) 3502 3506 { $$ = $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) 3504 3508 { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); } 3505 3509 | '(' variable_function ')' // redundant parenthesis … … 3522 3526 3523 3527 function_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) 3525 3529 { $$ = $1->addParamList( $3 ); } 3526 | '(' function_ptr ')' '(' parameter_ type_list_opt ')'3530 | '(' function_ptr ')' '(' parameter_list_ellipsis_opt ')' 3527 3531 { $$ = $2->addParamList( $5 ); } 3528 | '(' attribute_list function_ptr ')' '(' parameter_ type_list_opt ')'3532 | '(' attribute_list function_ptr ')' '(' parameter_list_ellipsis_opt ')' 3529 3533 { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); } 3530 3534 | '(' function_no_ptr ')' // redundant parenthesis … … 3576 3580 paren_identifier '(' identifier_list ')' // function_declarator handles empty parameter 3577 3581 { $$ = $1->addIdList( $3 ); } 3578 | '(' KR_function_ptr ')' '(' parameter_ type_list_opt ')'3582 | '(' KR_function_ptr ')' '(' parameter_list_ellipsis_opt ')' 3579 3583 { $$ = $2->addParamList( $5 ); } 3580 | '(' attribute_list KR_function_ptr ')' '(' parameter_ type_list_opt ')'3584 | '(' attribute_list KR_function_ptr ')' '(' parameter_list_ellipsis_opt ')' 3581 3585 { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); } 3582 3586 | '(' KR_function_no_ptr ')' // redundant parenthesis … … 3668 3672 3669 3673 variable_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) 3671 3675 { $$ = $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) 3673 3677 { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); } 3674 3678 | '(' variable_type_function ')' // redundant parenthesis … … 3691 3695 3692 3696 function_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) 3694 3698 { $$ = $1->addParamList( $3 ); } 3695 | '(' function_type_ptr ')' '(' parameter_ type_list_opt ')'3699 | '(' function_type_ptr ')' '(' parameter_list_ellipsis_opt ')' 3696 3700 { $$ = $2->addParamList( $5 ); } 3697 | '(' attribute_list function_type_ptr ')' '(' parameter_ type_list_opt ')'3701 | '(' attribute_list function_type_ptr ')' '(' parameter_list_ellipsis_opt ')' 3698 3702 { $$ = $3->addQualifiers( $2 )->addParamList( $6 ); } 3699 3703 | '(' function_type_no_ptr ')' // redundant parenthesis … … 3738 3742 { $$ = $1->addQualifiers( $2 ); } 3739 3743 | '&' 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 ); } 3741 3746 | identifier_parameter_ptr 3742 3747 | identifier_parameter_array attribute_list_opt … … 3767 3772 3768 3773 identifier_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) 3770 3775 { $$ = $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) 3772 3777 { $$ = $2->addParamList( $5 ); } 3773 3778 | '(' identifier_parameter_function ')' // redundant parenthesis … … 3788 3793 { $$ = $1->addQualifiers( $2 ); } 3789 3794 | '&' 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 ); } 3791 3797 | type_parameter_ptr 3792 3798 | type_parameter_array attribute_list_opt … … 3820 3826 3821 3827 type_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) 3823 3829 { $$ = $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) 3825 3831 { $$ = $2->addParamList( $5 ); } 3826 3832 ; … … 3870 3876 3871 3877 abstract_function: 3872 '(' parameter_ type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)3878 '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3) 3873 3879 { $$ = 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) 3875 3881 { $$ = $2->addParamList( $5 ); } 3876 3882 | '(' abstract_function ')' // redundant parenthesis … … 3888 3894 { $$ = DeclarationNode::newArray( $3, nullptr, false )->addArray( DeclarationNode::newArray( $6, nullptr, false ) ); } 3889 3895 // { 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 3890 3900 | '[' push array_type_list pop ']' // CFA 3891 3901 { $$ = DeclarationNode::newArray( $3, nullptr, false ); } 3892 3902 | multi_array_dimension 3893 3903 ; 3904 3905 // array_dimension_list: 3906 // assignment_expression 3907 // | array_dimension_list ',' assignment_expression 3908 // ; 3894 3909 3895 3910 array_type_list: … … 3993 4008 3994 4009 abstract_parameter_function: 3995 '(' parameter_ type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)4010 '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3) 3996 4011 { $$ = 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) 3998 4013 { $$ = $2->addParamList( $5 ); } 3999 4014 | '(' abstract_parameter_function ')' // redundant parenthesis … … 4072 4087 4073 4088 variable_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) 4075 4090 { $$ = $2->addParamList( $5 ); } 4076 4091 | '(' variable_abstract_function ')' // redundant parenthesis … … 4158 4173 // 4159 4174 // 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 ')' 4161 4176 // 4162 4177 // since a function return type can be syntactically identical to a tuple type: … … 4224 4239 4225 4240 cfa_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 ')' 4229 4244 { $$ = 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 ')' 4231 4246 { $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); } 4232 4247 ;
Note: See TracChangeset
for help on using the changeset viewer.