From 24d1547515ddeb03c6fcf7ae0162b0c397180a40 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Wed, 15 Feb 2017 22:54:00 +0000 Subject: Don't know if I made progress --- c_parser/src/c_lexer.flex | 4 ++++ c_parser/src/c_parser.y | 60 ++++++++++++++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 21 deletions(-) (limited to 'c_parser/src') 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 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 // 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 EXT_DEF EXT_DECLARATION FUNC_DEF DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER +// %type // T_CONSTANT %type 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) -- cgit