aboutsummaryrefslogtreecommitdiffstats
path: root/c_parser
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-02-15 22:54:00 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-02-15 22:54:00 +0000
commit24d1547515ddeb03c6fcf7ae0162b0c397180a40 (patch)
tree609e0573c809710e05ef9df5f05b3f095e6687b3 /c_parser
parent2864f0483c9c7dc8b57184348a1b2a8ab3656ddd (diff)
downloadCompiler-24d1547515ddeb03c6fcf7ae0162b0c397180a40.tar.gz
Compiler-24d1547515ddeb03c6fcf7ae0162b0c397180a40.zip
Don't know if I made progress
Diffstat (limited to 'c_parser')
-rw-r--r--c_parser/src/c_lexer.flex4
-rw-r--r--c_parser/src/c_parser.y60
2 files changed, 43 insertions, 21 deletions
diff --git a/c_parser/src/c_lexer.flex b/c_parser/src/c_lexer.flex
index c2b0d52..ba19cd5 100644
--- a/c_parser/src/c_lexer.flex
+++ b/c_parser/src/c_lexer.flex
@@ -45,6 +45,10 @@ const|volatile { return T_TYPE_QUAL; }
; { return T_SC; }
= { return T_EQ; }
, { return T_CMA; }
+[(] { return T_LRB; }
+[)] { return T_RRB; }
+[{] { return T_LCB; }
+[}] { return T_RCB; }
({HEXCONSTANT}|{OCTALCONSTANT}|{DECIMALCONSTANT}){INTEGERSUFFIX}? { return T_INT_CONST; }
diff --git a/c_parser/src/c_parser.y b/c_parser/src/c_parser.y
index 038f7dd..97d13a7 100644
--- a/c_parser/src/c_parser.y
+++ b/c_parser/src/c_parser.y
@@ -18,38 +18,56 @@ void yyerror(const char *);
// double number;
std::string *string;
}
-
-%token T_TYPE_SPEC T_TYPE_QUAL T_STRG_SPEC T_IDENTIFIER T_SC T_CMA T_EQ T_INT_CONST
-
-%type <stmnt> STMNT DCLRTN DCLRTN_SPEC DCLRTN_SPEC_T INIT_DCLRTR INIT_DCLRTR_LIST DCLRTR INITIALIZER STMNT_LIST // COMP_STMNT STMNT_LIST_STMNT SLCT_STMNT ITR_STMNT JMP_STMNT
-// %type <number> // T_CONSTANT
+
+%token T_TYPE_SPEC T_TYPE_QUAL T_STRG_SPEC T_IDENTIFIER T_SC T_CMA T_EQ T_LRB T_RRB T_LCB T_RCB T_INT_CONST
+
+%type <stmnt> EXT_DEF EXT_DECLARATION FUNC_DEF DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER
+// %type <number> // T_CONSTANT
%type <string> T_IDENTIFIER //T_OPERATOR
-
+
%start ROOT
-
+
%%
-ROOT : STMNT_LIST { ; }
+ROOT : EXT_DEF { ; }
-STMNT_LIST : STMNT { ; }
- | STMNT_LIST STMNT { ; }
- | DCLRTN { ; }
+// EXTERNAL DEFINITION
-STMNT : DCLRTN { ; }
+EXT_DEF : EXT_DECLARATION { ; }
+ | EXT_DEF EXT_DECLARATION { $$ = $2; }
-DCLRTN : DCLRTN_SPEC INIT_DCLRTR_LIST T_SC { $$ = $2; }
-DCLRTN_SPEC : DCLRTN_SPEC_T { ; }
- | DCLRTN_SPEC_T DCLRTN_SPEC { ; }
-DCLRTN_SPEC_T : T_TYPE_SPEC { ; }
+EXT_DECLARATION : DECLARATION_SPEC EXT_DECLARATION_2 { ; }
+
+EXT_DECLARATION_2 : DECLARATION { ; }
+ | FUNC_DEF { ; }
+
+// FUNCTION DEFINITION
+
+FUNC_DEF : T_IDENTIFIER T_LRB T_RRB T_LCB T_RCB { ; }
+
+// DECLARATION
+
+DECLARATION : INIT_DECLARATOR_LIST T_SC { ; }
+
+DECLARATION_SPEC : DECLARATION_SPEC_T { ; }
+ | DECLARATION_SPEC_T DECLARATION_SPEC { ; }
+
+DECLARATION_SPEC_T : T_TYPE_SPEC { ; }
| T_TYPE_QUAL { ; }
| T_STRG_SPEC { ; }
-INIT_DCLRTR_LIST : INIT_DCLRTR { g_root->push($1); }
- | INIT_DCLRTR_LIST T_CMA INIT_DCLRTR { g_root->push($3); }
-INIT_DCLRTR : DCLRTR { ; }
- | DCLRTR T_EQ INITIALIZER { ; }
-DCLRTR : T_IDENTIFIER {$$ = new ast_Declaration(*$1); }
+
+INIT_DECLARATOR_LIST : INIT_DECLARATOR { g_root->push($1); }
+ | INIT_DECLARATOR_LIST T_CMA INIT_DECLARATOR { g_root->push($3); }
+
+INIT_DECLARATOR : DECLARATOR { ; }
+ | DECLARATOR T_EQ INITIALIZER { ; }
+
+DECLARATOR : T_IDENTIFIER {$$ = new ast_Declaration(*$1); }
+
INITIALIZER : T_INT_CONST { ; }
+// STATEMENTS
+
%%
ast_Top *g_root; // Definition of variable (to match declaration earlier)