diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-02-17 17:27:38 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-02-17 17:27:38 +0000 |
commit | c85746b6a6c3080bac409e0acb8cc8b332b2761e (patch) | |
tree | 7e37429cbe6014e2ed6aba6466b69cf914e2af38 /c_parser/src | |
parent | b81f60d8b523260526af15361d4ce0ac4a7757c8 (diff) | |
download | Compiler-c85746b6a6c3080bac409e0acb8cc8b332b2761e.tar.gz Compiler-c85746b6a6c3080bac409e0acb8cc8b332b2761e.zip |
Finished compound statement for function and added test cases
Diffstat (limited to 'c_parser/src')
-rw-r--r-- | c_parser/src/c_parser.y | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/c_parser/src/c_parser.y b/c_parser/src/c_parser.y index 13f3d13..6d5db38 100644 --- a/c_parser/src/c_parser.y +++ b/c_parser/src/c_parser.y @@ -23,10 +23,10 @@ void yyerror(const char *); %token T_SC T_CMA T_EQ T_LRB T_RRB T_LCB T_RCB %token T_INT_CONST -%type <stmnt> EXT_DEF EXT_DECLARATION EXT_DECLARATION_2 +%type <stmnt> EXT_DEF EXT_DECLARATION %type <stmnt> FUNC_DEF PARAMETER_LIST PARAMETER PARAM_DECLARATOR -%type <stmnt> DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER -%type <stmnt> COMPOUND_STATEMENT +%type <stmnt> DECLARATION_LIST DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER +%type <stmnt> COMPOUND_STATEMENT COMPOUND_STATEMENT_2 // %type <number> // T_CONSTANT %type <string> T_IDENTIFIER //T_OPERATOR @@ -43,30 +43,31 @@ EXT_DEF : EXT_DECLARATION { g_root->push($1); } | EXT_DEF EXT_DECLARATION { g_root->push($2); } ; -EXT_DECLARATION : DECLARATION_SPEC EXT_DECLARATION_2 { $$ = $2; } -; - -EXT_DECLARATION_2 : DECLARATION { $$ = $1; } +EXT_DECLARATION : DECLARATION { $$ = $1; } | FUNC_DEF { $$ = $1; } ; // FUNCTION DEFINITION -FUNC_DEF : T_IDENTIFIER T_LRB PARAMETER_LIST T_RRB COMPOUND_STATEMENT { $$ = new ast_Function(*$1, $3, $5); } +FUNC_DEF : DECLARATION_SPEC T_IDENTIFIER T_LRB PARAMETER_LIST T_RRB COMPOUND_STATEMENT { $$ = new ast_Function(*$2, $4, $6); } ; -PARAMETER_LIST: PARAMETER { $$ = new ast_ParamList($1); } +PARAMETER_LIST : PARAMETER { $$ = new ast_ParamList($1); } | PARAMETER_LIST T_CMA PARAMETER { $$->push($3); } ; -PARAMETER: DECLARATION_SPEC PARAM_DECLARATOR { $$ = $2; } +PARAMETER : DECLARATION_SPEC PARAM_DECLARATOR { $$ = $2; } ; -PARAM_DECLARATOR: T_IDENTIFIER { $$ = new ast_Parameter(*$1);} +PARAM_DECLARATOR : T_IDENTIFIER { $$ = new ast_Parameter(*$1);} +; // DECLARATION -DECLARATION : INIT_DECLARATOR_LIST T_SC { $$ = $1; } +DECLARATION_LIST : DECLARATION { $$ = new ast_DeclarationList($1); } + | DECLARATION_LIST DECLARATION { $$->push($2); } + +DECLARATION : DECLARATION_SPEC INIT_DECLARATOR_LIST T_SC { $$ = $2; } ; DECLARATION_SPEC : DECLARATION_SPEC_T { ; } @@ -94,7 +95,11 @@ INITIALIZER : T_INT_CONST { ; } // STATEMENT -COMPOUND_STATEMENT: T_LCB EXT_DEF T_RCB { $$ = new ast_CompoundStatement($2); } +COMPOUND_STATEMENT : T_LCB COMPOUND_STATEMENT_2 { $$ = $2; } +; + +COMPOUND_STATEMENT_2 : T_RCB { $$ = new ast_CompoundStatement(); } + | DECLARATION_LIST T_RCB { $$ = new ast_CompoundStatement($1); } ; %% |