Ignore:
Timestamp:
Jul 4, 2017, 9:40:16 AM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
208e5be
Parents:
9c951e3 (diff), f7cb0bc (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into references

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r9c951e3 rb1e63ac5  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // cfa.y --
     7// parser.yy --
    88//
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 30 15:42:32 2017
    13 // Update Count     : 2318
     12// Last Modified On : Wed Jun 28 22:11:22 2017
     13// Update Count     : 2414
    1414//
    1515
     
    4848#include <cstdio>
    4949#include <stack>
    50 #include "lex.h"
    51 #include "parser.h"
    5250#include "ParseNode.h"
    5351#include "TypedefTable.h"
     
    8583        } // for
    8684} // distExt
     85
     86bool forall = false;                                                                    // aggregate have one or more forall qualifiers ?
    8787%}
     88
     89// Types declaration
     90%union
     91{
     92        Token tok;
     93        ParseNode * pn;
     94        ExpressionNode * en;
     95        DeclarationNode * decl;
     96        DeclarationNode::Aggregate aggKey;
     97        DeclarationNode::TypeClass tclass;
     98        StatementNode * sn;
     99        ConstantExpr * constant;
     100        ForCtl * fctl;
     101        LabelNode * label;
     102        InitializerNode * in;
     103        OperKinds op;
     104        std::string * str;
     105        bool flag;
     106}
    88107
    89108//************************* TERMINAL TOKENS ********************************
     
    138157%token ATassign                                                                                 // @=
    139158
    140 // Types declaration
    141 %union
    142 {
    143         Token tok;
    144         ParseNode * pn;
    145         ExpressionNode * en;
    146         DeclarationNode * decl;
    147         DeclarationNode::Aggregate aggKey;
    148         DeclarationNode::TypeClass tclass;
    149         StatementNode * sn;
    150         ConstantExpr * constant;
    151         ForCtl * fctl;
    152         LabelNode * label;
    153         InitializerNode * in;
    154         OperKinds op;
    155         std::string * str;
    156         bool flag;
    157 }
    158 
    159 %type<tok> identifier  no_01_identifier  no_attr_identifier zero_one
    160 %type<tok> identifier_or_type_name  no_attr_identifier_or_type_name  no_01_identifier_or_type_name  attr_name
     159%type<tok> identifier  no_attr_identifier  zero_one
     160%type<tok> identifier_or_type_name  no_attr_identifier_or_type_name  attr_name
    161161%type<constant> string_literal
    162162%type<str> string_literal_list
     
    191191%type<sn> case_value_list                               case_label                                      case_label_list
    192192%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    193 %type<sn> handler_list                                  handler_clause                          finally_clause
     193%type<sn> /* handler_list */                    handler_clause                          finally_clause
    194194
    195195// declarations
     
    205205%type<en>   bit_subrange_size_opt bit_subrange_size
    206206
    207 %type<decl> basic_declaration_specifier basic_type_name basic_type_specifier direct_type_name indirect_type_name
     207%type<decl> basic_declaration_specifier basic_type_name basic_type_specifier direct_type indirect_type
    208208
    209209%type<decl> trait_declaration trait_declaration_list trait_declaring_list trait_specifier
     
    259259%type<decl> type_declarator type_declarator_name type_declaring_list
    260260
    261 %type<decl> typedef typedef_type_specifier typedef_declaration typedef_declaration_specifier typedef_expression
     261%type<decl> type_declaration_specifier type_type_specifier type_name typegen_name
     262%type<decl> typedef typedef_declaration typedef_expression
    262263
    263264%type<decl> variable_type_redeclarator type_ptr type_array type_function
    264265
    265266%type<decl> type_parameter_redeclarator type_parameter_ptr type_parameter_array type_parameter_function
    266 %type<decl> typegen_declaration_specifier typegen_type_specifier typegen_name
    267 
    268 %type<decl> type_name type_name_no_function
    269 %type<decl> type_parameter type_parameter_list
    270 
    271 %type<en> type_name_list
     267
     268%type<decl> type type_no_function
     269%type<decl> type_parameter type_parameter_list type_initializer_opt
     270
     271%type<en> type_list
    272272
    273273%type<decl> type_qualifier type_qualifier_name type_qualifier_list_opt type_qualifier_list
     
    349349        IDENTIFIER
    350350        | ATTR_IDENTIFIER                                                                       // CFA
    351         | zero_one                                                                                      // CFA
    352         ;
    353 
    354 no_01_identifier:
    355         IDENTIFIER
    356         | ATTR_IDENTIFIER                                                                       // CFA
    357351        ;
    358352
    359353no_attr_identifier:
    360354        IDENTIFIER
    361         | zero_one                                                                                      // CFA
    362355        ;
    363356
     
    365358        ZERO
    366359        | ONE
    367         ;
     360        ;
    368361
    369362string_literal:
     
    393386        | '(' compound_statement ')'                                            // GCC, lambda expression
    394387                { $$ = new ExpressionNode( build_valexpr( $2 ) ); }
    395         | primary_expression '{' argument_expression_list '}' // CFA
     388        | primary_expression '{' argument_expression_list '}' // CFA, constructor call
    396389                {
    397390                        Token fn;
     
    399392                        $$ = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) ) );
    400393                }
     394        | type_name '.' no_attr_identifier                                      // CFA, nested type
     395                { $$ = nullptr; }                                                               // FIX ME
     396        | type_name '.' '[' push field_list pop ']'                     // CFA, nested type / tuple field selector
     397                { $$ = nullptr; }                                                               // FIX ME
    401398        ;
    402399
     
    429426        | postfix_expression DECR
    430427                { $$ = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, $1 ) ); }
    431         | '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99, compound-literal
     428        | '(' type_no_function ')' '{' initializer_list comma_opt '}' // C99, compound-literal
    432429                { $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); }
    433430        | '^' primary_expression '{' argument_expression_list '}' // CFA
     
    481478        | no_attr_identifier fraction_constants
    482479                {
    483                         if( (*$1) == "0" || (*$1) == "1" ) {
    484                                 $$ = new ExpressionNode( build_field_name_fraction_constants( build_constantZeroOne( *$1 ), $2 ) );
    485                         } else {
    486                                 $$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) );
    487                         }
     480                        $$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) );
     481                }
     482        | zero_one fraction_constants
     483                {
     484                        $$ = new ExpressionNode( build_field_name_fraction_constants( build_constantZeroOne( *$1 ), $2 ) );
    488485                }
    489486        ;
     
    533530        | SIZEOF unary_expression
    534531                { $$ = new ExpressionNode( build_sizeOfexpr( $2 ) ); }
    535         | SIZEOF '(' type_name_no_function ')'
     532        | SIZEOF '(' type_no_function ')'
    536533                { $$ = new ExpressionNode( build_sizeOftype( $3 ) ); }
    537534        | ALIGNOF unary_expression                                                      // GCC, variable alignment
    538535                { $$ = new ExpressionNode( build_alignOfexpr( $2 ) ); }
    539         | ALIGNOF '(' type_name_no_function ')'                         // GCC, type alignment
     536        | ALIGNOF '(' type_no_function ')'                              // GCC, type alignment
    540537                { $$ = new ExpressionNode( build_alignOftype( $3 ) ); }
    541         | OFFSETOF '(' type_name_no_function ',' no_attr_identifier ')'
     538        | OFFSETOF '(' type_no_function ',' no_attr_identifier ')'
    542539                { $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) ); }
    543540        | ATTR_IDENTIFIER
     
    545542        | ATTR_IDENTIFIER '(' argument_expression ')'
    546543                { $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), $3 ) ); }
    547         | ATTR_IDENTIFIER '(' type_name ')'
     544        | ATTR_IDENTIFIER '(' type ')'
    548545                { $$ = new ExpressionNode( build_attrtype( build_varref( $1 ), $3 ) ); }
    549546//      | ANDAND IDENTIFIER                                                                     // GCC, address of label
    550 //              { $$ = new ExpressionNode( new OperatorNode( OperKinds::LabelAddress ), new ExpressionNode( build_varref( $2, true ) ); }
     547//              { $$ = new ExpressionNode( new OperatorNode( OperKinds::LabelAddress ), new ExpressionNode( build_varref( $2 ) ); }
    551548        ;
    552549
     
    567564cast_expression:
    568565        unary_expression
    569         | '(' type_name_no_function ')' cast_expression
     566        | '(' type_no_function ')' cast_expression
    570567                { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
    571 //      | '(' type_name_no_function ')' tuple
     568//      | '(' type_no_function ')' tuple
    572569//              { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
    573570        ;
     
    656653        | logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand
    657654                { $$ = new ExpressionNode( build_cond( $1, $1, $4 ) ); }
    658 //      | logical_OR_expression '?' comma_expression ':' tuple // CFA, tuple expression
    659 //              { $$ = new ExpressionNode( build_cond( $1, $3, $5 ) ); }
    660655        ;
    661656
     
    669664        | unary_expression assignment_operator assignment_expression
    670665                { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
    671 //      | tuple assignment_opt                                                          // CFA, tuple expression
    672 //              { $$ = ( $2 == 0 ) ? $1 : new ExpressionNode( build_binary_ptr( OperKinds::Assign, $1, $2 ) ); }
    673666        ;
    674667
     
    936929                { $$ = new StatementNode( build_throw( $2 ) ); }
    937930        | THROWRESUME assignment_expression_opt ';'                     // handles reresume
    938                 { $$ = new StatementNode( build_throw( $2 ) ); }
     931                { $$ = new StatementNode( build_resume( $2 ) ); }
    939932        | THROWRESUME assignment_expression_opt AT assignment_expression ';' // handles reresume
    940                 { $$ = new StatementNode( build_throw( $2 ) ); }
     933                { $$ = new StatementNode( build_resume_at( $2, $4 ) ); }
    941934        ;
    942935
    943936exception_statement:
    944         TRY compound_statement handler_list
     937        TRY compound_statement handler_clause
    945938                { $$ = new StatementNode( build_try( $2, $3, 0 ) ); }
    946939        | TRY compound_statement finally_clause
    947940                { $$ = new StatementNode( build_try( $2, 0, $3 ) ); }
    948         | TRY compound_statement handler_list finally_clause
     941        | TRY compound_statement handler_clause finally_clause
    949942                { $$ = new StatementNode( build_try( $2, $3, $4 ) ); }
    950943        ;
    951944
    952 handler_list:
    953         handler_clause
    954                 // ISO/IEC 9899:1999 Section 15.3(6 ) If present, a "..." handler shall be the last handler for its try block.
    955         | CATCH '(' ELLIPSIS ')' compound_statement
    956                 { $$ = new StatementNode( build_catch( 0, $5, true ) ); }
    957         | handler_clause CATCH '(' ELLIPSIS ')' compound_statement
    958                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
    959         | CATCHRESUME '(' ELLIPSIS ')' compound_statement
    960                 { $$ = new StatementNode( build_catch( 0, $5, true ) ); }
    961         | handler_clause CATCHRESUME '(' ELLIPSIS ')' compound_statement
    962                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
    963         ;
     945//handler_list:
     946//      handler_clause
     947//              // ISO/IEC 9899:1999 Section 15.3(6 ) If present, a "..." handler shall be the last handler for its try block.
     948//      | CATCH '(' ELLIPSIS ')' compound_statement
     949//              { $$ = new StatementNode( build_catch( 0, $5, true ) ); }
     950//      | handler_clause CATCH '(' ELLIPSIS ')' compound_statement
     951//              { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
     952//      | CATCHRESUME '(' ELLIPSIS ')' compound_statement
     953//              { $$ = new StatementNode( build_catch( 0, $5, true ) ); }
     954//      | handler_clause CATCHRESUME '(' ELLIPSIS ')' compound_statement
     955//              { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
     956//      ;
    964957
    965958handler_clause:
    966         CATCH '(' push push exception_declaration pop ')' compound_statement pop
    967                 { $$ = new StatementNode( build_catch( $5, $8 ) ); }
     959        // TEMPORARY, TEST EXCEPTIONS
     960        CATCH '(' push push INTEGERconstant pop ')' compound_statement pop
     961                { $$ = new StatementNode( build_catch( CatchStmt::Terminate, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); }
     962        | handler_clause CATCH '(' push push INTEGERconstant pop ')' compound_statement pop
     963                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
     964
     965        | CATCH '(' push push exception_declaration pop ')' compound_statement pop
     966                { $$ = new StatementNode( build_catch( CatchStmt::Terminate, $5, nullptr, $8 ) ); }
    968967        | handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
    969                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
     968                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, $6, nullptr, $9 ) ) ); }
    970969        | CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    971                 { $$ = new StatementNode( build_catch( $5, $8 ) ); }
     970                { $$ = new StatementNode( build_catch( CatchStmt::Resume, $5, nullptr, $8 ) ); }
    972971        | handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    973                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
     972                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Resume, $6, nullptr, $9 ) ) ); }
    974973        ;
    975974
     
    13501349        basic_declaration_specifier
    13511350        | sue_declaration_specifier
    1352         | typedef_declaration_specifier
    1353         | typegen_declaration_specifier
     1351        | type_declaration_specifier
    13541352        ;
    13551353
     
    13621360        basic_declaration_specifier
    13631361        | sue_declaration_specifier_nobody
    1364         | typedef_declaration_specifier
    1365         | typegen_declaration_specifier
     1362        | type_declaration_specifier
    13661363        ;
    13671364
     
    13691366        basic_type_specifier
    13701367        | sue_type_specifier
    1371         | typedef_type_specifier
    1372         | typegen_type_specifier
     1368        | type_type_specifier
    13731369        ;
    13741370
     
    13811377        basic_type_specifier
    13821378        | sue_type_specifier_nobody
    1383         | typedef_type_specifier
    1384         | typegen_type_specifier
     1379        | type_type_specifier
    13851380        ;
    13861381
     
    15171512
    15181513basic_type_specifier:
    1519         direct_type_name
    1520         | type_qualifier_list_opt indirect_type_name type_qualifier_list_opt
     1514        direct_type
     1515        | type_qualifier_list_opt indirect_type type_qualifier_list_opt
    15211516                { $$ = $2->addQualifiers( $1 )->addQualifiers( $3 ); }
    15221517        ;
    15231518
    1524 direct_type_name:
     1519direct_type:
    15251520                // A semantic check is necessary for conflicting type qualifiers.
    15261521        basic_type_name
    15271522        | type_qualifier_list basic_type_name
    15281523                { $$ = $2->addQualifiers( $1 ); }
    1529         | direct_type_name type_qualifier
     1524        | direct_type type_qualifier
    15301525                { $$ = $1->addQualifiers( $2 ); }
    1531         | direct_type_name basic_type_name
     1526        | direct_type basic_type_name
    15321527                { $$ = $1->addType( $2 ); }
    15331528        ;
    15341529
    1535 indirect_type_name:
    1536         TYPEOF '(' type_name ')'                                                        // GCC: typeof(x) y;
     1530indirect_type:
     1531        TYPEOF '(' type ')'                                                                     // GCC: typeof(x) y;
    15371532                { $$ = $3; }
    15381533        | TYPEOF '(' comma_expression ')'                                       // GCC: typeof(a+b) y;
    15391534                { $$ = DeclarationNode::newTypeof( $3 ); }
    1540         | ATTR_TYPEGENname '(' type_name ')'                            // CFA: e.g., @type(x) y;
     1535        | ATTR_TYPEGENname '(' type ')'                                         // CFA: e.g., @type(x) y;
    15411536                { $$ = DeclarationNode::newAttr( $1, $3 ); }
    15421537        | ATTR_TYPEGENname '(' comma_expression ')'                     // CFA: e.g., @type(a+b) y;
     
    15561551sue_type_specifier:                                                                             // struct, union, enum + type specifier
    15571552        elaborated_type
    1558         | type_qualifier_list elaborated_type
    1559                 { $$ = $2->addQualifiers( $1 ); }
     1553        | type_qualifier_list
     1554                { if ( $1->type != nullptr && $1->type->forall ) forall = true; } // remember generic type
     1555          elaborated_type
     1556                { $$ = $3->addQualifiers( $1 ); }
    15601557        | sue_type_specifier type_qualifier
    15611558                { $$ = $1->addQualifiers( $2 ); }
     
    15801577        ;
    15811578
    1582 typedef_declaration_specifier:
    1583         typedef_type_specifier
    1584         | declaration_qualifier_list typedef_type_specifier
     1579type_declaration_specifier:
     1580        type_type_specifier
     1581        | declaration_qualifier_list type_type_specifier
    15851582                { $$ = $2->addQualifiers( $1 ); }
    1586         | typedef_declaration_specifier storage_class           // remaining OBSOLESCENT (see 2)
     1583        | type_declaration_specifier storage_class                      // remaining OBSOLESCENT (see 2)
    15871584                { $$ = $1->addQualifiers( $2 ); }
    1588         | typedef_declaration_specifier storage_class type_qualifier_list
     1585        | type_declaration_specifier storage_class type_qualifier_list
    15891586                { $$ = $1->addQualifiers( $2 )->addQualifiers( $3 ); }
    15901587        ;
    15911588
    1592 typedef_type_specifier:                                                                 // typedef types
     1589type_type_specifier:                                                                    // typedef types
     1590        type_name
     1591        | type_qualifier_list type_name
     1592                { $$ = $2->addQualifiers( $1 ); }
     1593        | type_type_specifier type_qualifier
     1594                { $$ = $1->addQualifiers( $2 ); }
     1595        ;
     1596
     1597type_name:
    15931598        TYPEDEFname
    15941599                { $$ = DeclarationNode::newFromTypedef( $1 ); }
    1595         | type_qualifier_list TYPEDEFname
    1596                 { $$ = DeclarationNode::newFromTypedef( $2 )->addQualifiers( $1 ); }
    1597         | typedef_type_specifier type_qualifier
    1598                 { $$ = $1->addQualifiers( $2 ); }
     1600        | '.' TYPEDEFname
     1601                { $$ = DeclarationNode::newFromTypedef( $2 ); } // FIX ME
     1602        | type_name '.' TYPEDEFname
     1603                { $$ = DeclarationNode::newFromTypedef( $3 ); } // FIX ME
     1604        | typegen_name
     1605        | '.' typegen_name
     1606                { $$ = $2; }                                                                    // FIX ME
     1607        | type_name '.' typegen_name
     1608                { $$ = $3; }                                                                    // FIX ME
     1609        ;
     1610
     1611typegen_name:                                                                                   // CFA
     1612        TYPEGENname '(' ')'
     1613                { $$ = DeclarationNode::newFromTypeGen( $1, nullptr ); }
     1614        | TYPEGENname '(' type_list ')'
     1615                { $$ = DeclarationNode::newFromTypeGen( $1, $3 ); }
    15991616        ;
    16001617
     
    16131630                { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), nullptr, $4, true )->addQualifiers( $2 ); }
    16141631        | aggregate_key attribute_list_opt no_attr_identifier_or_type_name
    1615                 { typedefTable.makeTypedef( *$3 ); }
     1632                {
     1633                        typedefTable.makeTypedef( *$3 );                        // create typedef
     1634                        if ( forall ) typedefTable.changeKind( *$3, TypedefTable::TG ); // possibly update
     1635                        forall = false;                                                         // reset
     1636                }
    16161637          '{' field_declaration_list '}'
    16171638                { $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $6, true )->addQualifiers( $2 ); }
    1618         | aggregate_key attribute_list_opt '(' type_name_list ')' '{' field_declaration_list '}' // CFA
     1639        | aggregate_key attribute_list_opt '(' type_list ')' '{' field_declaration_list '}' // CFA
    16191640                { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $4, $7, false )->addQualifiers( $2 ); }
    16201641        | aggregate_type_nobody
     
    16221643
    16231644aggregate_type_nobody:                                                                  // struct, union - {...}
    1624         aggregate_key attribute_list_opt no_attr_identifier_or_type_name
     1645        aggregate_key attribute_list_opt no_attr_identifier
    16251646                {
    16261647                        typedefTable.makeTypedef( *$3 );
    16271648                        $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
    16281649                }
    1629         | aggregate_key attribute_list_opt typegen_name         // CFA, S/R conflict
     1650        | aggregate_key attribute_list_opt TYPEDEFname
     1651                {
     1652                        typedefTable.makeTypedef( *$3 );
     1653                        $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
     1654                }
     1655        | aggregate_key attribute_list_opt typegen_name         // CFA
    16301656                { $$ = $3->addQualifiers( $2 ); }
    16311657        ;
     
    18651891        ;
    18661892
    1867 no_01_identifier_or_type_name:
    1868         no_01_identifier
    1869         | TYPEDEFname
    1870         | TYPEGENname
    1871         ;
    1872 
    18731893no_attr_identifier_or_type_name:
    18741894        no_attr_identifier
     
    18771897        ;
    18781898
    1879 type_name_no_function:                                                                  // sizeof, alignof, cast (constructor)
     1899type_no_function:                                                                               // sizeof, alignof, cast (constructor)
    18801900        cfa_abstract_declarator_tuple                                           // CFA
    18811901        | type_specifier
     
    18841904        ;
    18851905
    1886 type_name:                                                                                              // typeof, assertion
    1887         type_name_no_function
     1906type:                                                                                                   // typeof, assertion
     1907        type_no_function
    18881908        | cfa_abstract_function                                                         // CFA
    18891909        ;
     
    19251945designation:
    19261946        designator_list ':'                                                                     // C99, CFA uses ":" instead of "="
    1927         | no_attr_identifier_or_type_name ':'                           // GCC, field name
     1947        | no_attr_identifier ':'                                                        // GCC, field name
    19281948                { $$ = new ExpressionNode( build_varref( $1 ) ); }
    19291949        ;
     
    19371957
    19381958designator:
    1939         '.' no_attr_identifier_or_type_name                                     // C99, field name
     1959        '.' no_attr_identifier                                                          // C99, field name
    19401960                { $$ = new ExpressionNode( build_varref( $2 ) ); }
    19411961        | '[' push assignment_expression pop ']'                        // C99, single array element
     
    19681988//     on type arguments of polymorphic functions.
    19691989
    1970 typegen_declaration_specifier:                                                  // CFA
    1971         typegen_type_specifier
    1972         | declaration_qualifier_list typegen_type_specifier
    1973                 { $$ = $2->addQualifiers( $1 ); }
    1974         | typegen_declaration_specifier storage_class           // remaining OBSOLESCENT (see 2)
    1975                 { $$ = $1->addQualifiers( $2 ); }
    1976         | typegen_declaration_specifier storage_class type_qualifier_list
    1977                 { $$ = $1->addQualifiers( $2 )->addQualifiers( $3 ); }
    1978         ;
    1979 
    1980 typegen_type_specifier:                                                                 // CFA
    1981         typegen_name
    1982         | type_qualifier_list typegen_name
    1983                 { $$ = $2->addQualifiers( $1 ); }
    1984         | typegen_type_specifier type_qualifier
    1985                 { $$ = $1->addQualifiers( $2 ); }
    1986         ;
    1987 
    1988 typegen_name:                                                                                   // CFA
    1989         TYPEGENname '(' type_name_list ')'
    1990                 { $$ = DeclarationNode::newFromTypeGen( $1, $3 ); }
    1991         ;
    1992 
    19931990type_parameter_list:                                                                    // CFA
    1994         type_parameter assignment_opt
    1995         | type_parameter_list ',' type_parameter assignment_opt
     1991        type_parameter
     1992                { $$ = $1; }
     1993        | type_parameter_list ',' type_parameter
    19961994                { $$ = $1->appendList( $3 ); }
     1995        ;
     1996
     1997type_initializer_opt:                                                                   // CFA
     1998        // empty
     1999                { $$ = nullptr; }
     2000        | '=' type
     2001                { $$ = $2; }
    19972002        ;
    19982003
     
    20002005        type_class no_attr_identifier_or_type_name
    20012006                { typedefTable.addToEnclosingScope( *$2, TypedefTable::TD ); }
    2002           assertion_list_opt
    2003                 { $$ = DeclarationNode::newTypeParam( $1, $2 )->addAssertions( $4 ); }
     2007          type_initializer_opt assertion_list_opt
     2008                { $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); }
    20042009        | type_specifier identifier_parameter_declarator
    20052010        ;
     
    20242029
    20252030assertion:                                                                                              // CFA
    2026         '|' no_attr_identifier_or_type_name '(' type_name_list ')'
     2031        '|' no_attr_identifier_or_type_name '(' type_list ')'
    20272032                {
    20282033                        typedefTable.openTrait( *$2 );
     
    20312036        | '|' '{' push trait_declaration_list '}'
    20322037                { $$ = $4; }
    2033         | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list '}' '(' type_name_list ')'
     2038        | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list '}' '(' type_list ')'
    20342039                { $$ = nullptr; }
    20352040        ;
    20362041
    2037 type_name_list:                                                                                 // CFA
    2038         type_name
     2042type_list:                                                                                              // CFA
     2043        type
    20392044                { $$ = new ExpressionNode( build_typevalue( $1 ) ); }
    20402045        | assignment_expression
    2041         | type_name_list ',' type_name
     2046        | type_list ',' type
    20422047                { $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( build_typevalue( $3 ) ) ) ); }
    2043         | type_name_list ',' assignment_expression
     2048        | type_list ',' assignment_expression
    20442049                { $$ = (ExpressionNode *)( $1->set_last( $3 )); }
    20452050        ;
     
    20572062        type_declarator_name assertion_list_opt
    20582063                { $$ = $1->addAssertions( $2 ); }
    2059         | type_declarator_name assertion_list_opt '=' type_name
     2064        | type_declarator_name assertion_list_opt '=' type
    20602065                { $$ = $1->addAssertions( $2 )->addType( $4 ); }
    20612066        ;
     
    20672072                        $$ = DeclarationNode::newTypeDecl( $1, 0 );
    20682073                }
    2069         | no_01_identifier_or_type_name '(' push type_parameter_list pop ')'
     2074        | no_attr_identifier_or_type_name '(' push type_parameter_list pop ')'
    20702075                {
    20712076                        typedefTable.addToEnclosingScope( *$1, TypedefTable::TG );
     
    20932098        ;
    20942099
    2095 trait_declaration_list:                                                         // CFA
     2100trait_declaration_list:                                                                 // CFA
    20962101        trait_declaration
    20972102        | trait_declaration_list push trait_declaration
     
    20992104        ;
    21002105
    2101 trait_declaration:                                                                      // CFA
     2106trait_declaration:                                                                              // CFA
    21022107        cfa_trait_declaring_list pop ';'
    21032108        | trait_declaring_list pop ';'
Note: See TracChangeset for help on using the changeset viewer.