aboutsummaryrefslogtreecommitdiffstats
path: root/c_parser/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-02-17 17:27:38 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-02-17 17:27:38 +0000
commitc85746b6a6c3080bac409e0acb8cc8b332b2761e (patch)
tree7e37429cbe6014e2ed6aba6466b69cf914e2af38 /c_parser/src
parentb81f60d8b523260526af15361d4ce0ac4a7757c8 (diff)
downloadCompiler-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.y31
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); }
;
%%