Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rca78437 rdc2b4d6  
    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
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jun 12 12:59:00 2017
    13 // Update Count     : 2402
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Mon Jul 17 12:17:00 2017
     13// Update Count     : 2455
    1414//
    1515
     
    4848#include <cstdio>
    4949#include <stack>
    50 #include "lex.h"
    51 #include "parser.h"
    5250#include "ParseNode.h"
    5351#include "TypedefTable.h"
     
    8886bool forall = false;                                                                    // aggregate have one or more forall qualifiers ?
    8987%}
     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        CatchStmt::Kind catch_kind;
     107}
    90108
    91109//************************* TERMINAL TOKENS ********************************
     
    111129%token ATTRIBUTE EXTENSION                                                              // GCC
    112130%token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
    113 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT        // CFA
     131%token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH   // CFA
    114132%token ASM                                                                                              // C99, extension ISO/IEC 9899:1999 Section J.5.10(1)
    115133%token ALIGNAS ALIGNOF GENERIC STATICASSERT                             // C11
     
    133151%token ELLIPSIS                                                                                 // ...
    134152
    135 %token MULTassign       DIVassign       MODassign                               // *=   /=      %=/
     153%token EXPassign        MULTassign      DIVassign       MODassign       // \=   *=      /=      %=
    136154%token PLUSassign       MINUSassign                                                     // +=   -=
    137155%token LSassign         RSassign                                                        // <<=  >>=
     
    139157
    140158%token ATassign                                                                                 // @=
    141 
    142 // Types declaration
    143 %union
    144 {
    145         Token tok;
    146         ParseNode * pn;
    147         ExpressionNode * en;
    148         DeclarationNode * decl;
    149         DeclarationNode::Aggregate aggKey;
    150         DeclarationNode::TypeClass tclass;
    151         StatementNode * sn;
    152         ConstantExpr * constant;
    153         ForCtl * fctl;
    154         LabelNode * label;
    155         InitializerNode * in;
    156         OperKinds op;
    157         std::string * str;
    158         bool flag;
    159 }
    160159
    161160%type<tok> identifier  no_attr_identifier  zero_one
     
    169168%type<op> ptrref_operator                               unary_operator                          assignment_operator
    170169%type<en> primary_expression                    postfix_expression                      unary_expression
    171 %type<en> cast_expression                               multiplicative_expression       additive_expression                     shift_expression
    172 %type<en> relational_expression                 equality_expression                     AND_expression                          exclusive_OR_expression
    173 %type<en> inclusive_OR_expression               logical_AND_expression          logical_OR_expression           conditional_expression
    174 %type<en> constant_expression                   assignment_expression           assignment_expression_opt
     170%type<en> cast_expression                               exponential_expression          multiplicative_expression       additive_expression
     171%type<en> shift_expression                              relational_expression           equality_expression
     172%type<en> AND_expression                                exclusive_OR_expression         inclusive_OR_expression
     173%type<en> logical_AND_expression                logical_OR_expression
     174%type<en> conditional_expression                constant_expression                     assignment_expression           assignment_expression_opt
    175175%type<en> comma_expression                              comma_expression_opt
    176 %type<en> argument_expression_list              argument_expression                     assignment_opt
     176%type<en> argument_expression_list              argument_expression                     default_initialize_opt
    177177%type<fctl> for_control_expression
    178178%type<en> subrange
     
    185185// statements
    186186%type<sn> labeled_statement                             compound_statement                      expression_statement            selection_statement
    187 %type<sn> iteration_statement                   jump_statement                          exception_statement                     asm_statement
     187%type<sn> iteration_statement                   jump_statement
     188%type<sn> with_statement                                exception_statement                     asm_statement
    188189%type<sn> fall_through_opt                              fall_through
    189190%type<sn> statement                                             statement_list
    190191%type<sn> block_item_list                               block_item
    191 %type<sn> case_clause
     192%type<sn> with_clause_opt
    192193%type<en> case_value
    193 %type<sn> case_value_list                               case_label                                      case_label_list
     194%type<sn> case_clause                                   case_value_list                         case_label                                      case_label_list
    194195%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    195196%type<sn> /* handler_list */                    handler_clause                          finally_clause
     197%type<catch_kind> handler_key
    196198
    197199// declarations
     
    572574        ;
    573575
     576exponential_expression:
     577        cast_expression
     578        | exponential_expression '\\' cast_expression
     579                { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); }
     580        ;
     581
    574582multiplicative_expression:
    575         cast_expression
    576         | multiplicative_expression '*' cast_expression
     583        exponential_expression
     584        | multiplicative_expression '*' exponential_expression
    577585                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
    578         | multiplicative_expression '/' cast_expression
     586        | multiplicative_expression '/' exponential_expression
    579587                { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
    580         | multiplicative_expression '%' cast_expression
     588        | multiplicative_expression '%' exponential_expression
    581589                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
    582590        ;
     
    677685        '='                                                                                     { $$ = OperKinds::Assign; }
    678686        | ATassign                                                                      { $$ = OperKinds::AtAssn; }
     687        | EXPassign                                                                     { $$ = OperKinds::ExpAssn; }
    679688        | MULTassign                                                            { $$ = OperKinds::MulAssn; }
    680689        | DIVassign                                                                     { $$ = OperKinds::DivAssn; }
     
    729738        | iteration_statement
    730739        | jump_statement
     740        | with_statement
    731741        | exception_statement
    732742        | asm_statement
     
    936946        ;
    937947
     948with_statement:
     949        WITH '(' tuple_expression_list ')' compound_statement
     950                { $$ = (StatementNode *)0; }                                    // FIX ME
     951        ;
     952
    938953exception_statement:
    939954        TRY compound_statement handler_clause
     
    959974
    960975handler_clause:
    961         CATCH '(' push push exception_declaration pop ')' compound_statement pop
    962                 { $$ = new StatementNode( build_catch( CatchStmt::Terminate, $5, nullptr, $8 ) ); }
    963         | handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
    964                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, $6, nullptr, $9 ) ) ); }
    965         | CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    966                 { $$ = new StatementNode( build_catch( CatchStmt::Resume, $5, nullptr, $8 ) ); }
    967         | handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    968                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Resume, $6, nullptr, $9 ) ) ); }
     976        // TEMPORARY, TEST EXCEPTIONS
     977        handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
     978                { $$ = new StatementNode( build_catch( $1, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); }
     979        | handler_clause handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
     980                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
     981
     982        | handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
     983                { $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); }
     984        | handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
     985                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); }
     986        ;
     987
     988handler_predicate_opt:
     989        //empty
     990        | ';' conditional_expression
     991        ;
     992
     993handler_key:
     994        CATCH
     995                { $$ = CatchStmt::Terminate; }
     996        | CATCHRESUME
     997                { $$ = CatchStmt::Resume; }
    969998        ;
    970999
     
    16511680        | aggregate_key attribute_list_opt typegen_name         // CFA
    16521681                { $$ = $3->addQualifiers( $2 ); }
     1682
     1683// Temp, testing TreeStruct
     1684    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name
     1685        {
     1686            typedefTable.makeTypedef( *$4 );            // create typedef
     1687            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
     1688            forall = false;                             // reset
     1689        }
     1690      '{' field_declaration_list '}'
     1691        {
     1692            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
     1693                $4, nullptr, nullptr, $7, true )->addQualifiers( $3 );
     1694        }
     1695    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname
     1696        {
     1697            typedefTable.makeTypedef( *$4 );            // create typedef
     1698            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
     1699            forall = false;                             // reset
     1700        }
     1701      '{' field_declaration_list '}'
     1702        {
     1703            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
     1704                $4, $5, nullptr, $8, true )->addQualifiers( $3 );
     1705        }
    16531706        ;
    16541707
     
    18291882cfa_parameter_declaration:                                                              // CFA, new & old style parameter declaration
    18301883        parameter_declaration
    1831         | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt
     1884        | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt
    18321885                { $$ = $1->addName( $2 ); }
    1833         | cfa_abstract_tuple identifier_or_type_name assignment_opt
     1886        | cfa_abstract_tuple identifier_or_type_name default_initialize_opt
    18341887                // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator).
    18351888                { $$ = $1->addName( $2 ); }
    1836         | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt
     1889        | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt
    18371890                { $$ = $2->addName( $3 )->addQualifiers( $1 ); }
    18381891        | cfa_function_specifier
     
    18511904parameter_declaration:
    18521905                // No SUE declaration in parameter list.
    1853         declaration_specifier_nobody identifier_parameter_declarator assignment_opt
     1906        declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt
    18541907                {
    18551908                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    18561909                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    18571910                }
    1858         | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
     1911        | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt
    18591912                {
    18601913                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    18641917
    18651918abstract_parameter_declaration:
    1866         declaration_specifier_nobody assignment_opt
     1919        declaration_specifier_nobody default_initialize_opt
    18671920                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1868         | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
     1921        | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt
    18691922                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    18701923        ;
     
    21672220                {
    21682221                        linkageStack.push( linkage );                           // handle nested extern "C"/"Cforall"
    2169                         linkage = LinkageSpec::linkageCheck( $2 );
     2222                        linkage = LinkageSpec::linkageUpdate( linkage, $2 );
    21702223                }
    21712224          '{' external_definition_list_opt '}'
     
    22032256        ;
    22042257
     2258with_clause_opt:
     2259        // empty
     2260                { $$ = (StatementNode *)0; }                                    // FIX ME
     2261        | WITH '(' tuple_expression_list ')'
     2262                { $$ = (StatementNode *)0; }                                    // FIX ME
     2263        ;
     2264
    22052265function_definition:
    2206         cfa_function_declaration compound_statement                     // CFA
     2266        cfa_function_declaration with_clause_opt compound_statement     // CFA
    22072267                {
    22082268                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22092269                        typedefTable.leaveScope();
    2210                         $$ = $1->addFunctionBody( $2 );
    2211                 }
    2212         | declaration_specifier function_declarator compound_statement
     2270                        $$ = $1->addFunctionBody( $3 );
     2271                }
     2272        | declaration_specifier function_declarator with_clause_opt compound_statement
    22132273                {
    22142274                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22152275                        typedefTable.leaveScope();
    2216                         $$ = $2->addFunctionBody( $3 )->addType( $1 );
    2217                 }
    2218         | type_qualifier_list function_declarator compound_statement
     2276                        $$ = $2->addFunctionBody( $4 )->addType( $1 );
     2277                }
     2278        | type_qualifier_list function_declarator with_clause_opt compound_statement
    22192279                {
    22202280                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22212281                        typedefTable.leaveScope();
    2222                         $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
    2223                 }
    2224         | declaration_qualifier_list function_declarator compound_statement
     2282                        $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
     2283                }
     2284        | declaration_qualifier_list function_declarator with_clause_opt compound_statement
    22252285                {
    22262286                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22272287                        typedefTable.leaveScope();
    2228                         $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
    2229                 }
    2230         | declaration_qualifier_list type_qualifier_list function_declarator compound_statement
     2288                        $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
     2289                }
     2290        | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement
    22312291                {
    22322292                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22332293                        typedefTable.leaveScope();
    2234                         $$ = $3->addFunctionBody( $4 )->addQualifiers( $2 )->addQualifiers( $1 );
     2294                        $$ = $3->addFunctionBody( $5 )->addQualifiers( $2 )->addQualifiers( $1 );
    22352295                }
    22362296
    22372297                // Old-style K&R function definition, OBSOLESCENT (see 4)
    2238         | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement
     2298        | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22392299                {
    22402300                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22412301                        typedefTable.leaveScope();
    2242                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addType( $1 );
    2243                 }
    2244         | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2302                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addType( $1 );
     2303                }
     2304        | type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22452305                {
    22462306                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22472307                        typedefTable.leaveScope();
    2248                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
     2308                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
    22492309                }
    22502310
    22512311                // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4)
    2252         | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2312        | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22532313                {
    22542314                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22552315                        typedefTable.leaveScope();
    2256                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
    2257                 }
    2258         | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2316                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
     2317                }
     2318        | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22592319                {
    22602320                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22612321                        typedefTable.leaveScope();
    2262                         $$ = $3->addOldDeclList( $5 )->addFunctionBody( $6 )->addQualifiers( $2 )->addQualifiers( $1 );
     2322                        $$ = $3->addOldDeclList( $5 )->addFunctionBody( $7 )->addQualifiers( $2 )->addQualifiers( $1 );
    22632323                }
    22642324        ;
     
    23232383        | TYPEGENname
    23242384        | CONST
    2325                 { $$ = Token{ new string( "__const__" ) }; }
     2385                { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; }
    23262386        ;
    23272387
     
    30223082        ;
    30233083
    3024 assignment_opt:
     3084default_initialize_opt:
    30253085        // empty
    30263086                { $$ = nullptr; }
Note: See TracChangeset for help on using the changeset viewer.