aboutsummaryrefslogtreecommitdiffstats
path: root/c_parser/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-02-19 05:06:45 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-02-19 05:06:45 +0000
commit0e9e8dab385375c0cbb83d89a71fbf8d71206b47 (patch)
treebacb57c4e93652ac8348d7951c63f1796c9f7750 /c_parser/src
parent258c14392606ec4ba0a590cac80ba4198ef920d9 (diff)
downloadCompiler-0e9e8dab385375c0cbb83d89a71fbf8d71206b47.tar.gz
Compiler-0e9e8dab385375c0cbb83d89a71fbf8d71206b47.zip
Finished if statement for the most part
Diffstat (limited to 'c_parser/src')
-rw-r--r--c_parser/src/c_lexer.flex5
-rw-r--r--c_parser/src/c_parser.y28
2 files changed, 22 insertions, 11 deletions
diff --git a/c_parser/src/c_lexer.flex b/c_parser/src/c_lexer.flex
index 5723e38..32ef4fb 100644
--- a/c_parser/src/c_lexer.flex
+++ b/c_parser/src/c_lexer.flex
@@ -40,8 +40,6 @@ typedef|extern|static|auto|register { return T_STRG_SPEC; }
void|char|short|int|long|float|double|signed|unsigned { return T_TYPE_SPEC; }
const|volatile { return T_TYPE_QUAL; }
-{IDENTIFIER} { yylval.string = new std::string(yytext); return T_IDENTIFIER; }
-
[;] { return T_SC; }
[=] { return T_EQ; }
[=][=] { return T_EQUALITY; }
@@ -53,6 +51,9 @@ const|volatile { return T_TYPE_QUAL; }
if { return T_IF; }
else { return T_ELSE; }
+return { return T_RETURN; }
+
+{IDENTIFIER} { yylval.string = new std::string(yytext); return T_IDENTIFIER; }
({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 9c65dfd..5b3af36 100644
--- a/c_parser/src/c_parser.y
+++ b/c_parser/src/c_parser.y
@@ -20,15 +20,15 @@ void yyerror(const char *);
}
%token T_TYPE_SPEC T_TYPE_QUAL T_STRG_SPEC T_IDENTIFIER
-%token T_SC T_CMA T_EQ T_LRB T_RRB T_LCB T_RCB T_EQUALITY
+%token T_SC T_CMA T_EQ T_LRB T_RRB T_LCB T_RCB T_EQUALITY T_RETURN
%token T_INT_CONST
%token T_IF T_ELSE
%type <stmnt> EXT_DEF EXT_DECLARATION
%type <stmnt> FUNC_DEF PARAMETER_LIST PARAMETER PARAM_DECLARATOR
%type <stmnt> DECLARATION_LIST DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER
-%type <stmnt> STATEMENT_LIST STATEMENT COMPOUND_STATEMENT COMPOUND_STATEMENT_2 SELECTION_STATEMENT
-%type <stmnt> EXPRESSION EQUALITY_EXPRESSION
+%type <stmnt> STATEMENT_LIST STATEMENT COMPOUND_STATEMENT COMPOUND_STATEMENT_2 SELECTION_STATEMENT SELECTION_STATEMENT_2 EXPRESSION_STATEMENT
+%type <stmnt> EXPRESSION EQUALITY_EXPRESSION RETURN_EXPRESSION
// %type <number> // T_CONSTANT
%type <string> T_IDENTIFIER //T_OPERATOR
@@ -103,7 +103,8 @@ STATEMENT_LIST : STATEMENT { $$ = new ast_StatementList($1); }
;
STATEMENT : COMPOUND_STATEMENT { $$ = $1; }
- | SELECTION_STATEMENT { ; }
+ | SELECTION_STATEMENT { $$ = $1; }
+ | EXPRESSION_STATEMENT { $$ = $1; }
;
COMPOUND_STATEMENT : T_LCB COMPOUND_STATEMENT_2 { $$ = $2; }
@@ -115,17 +116,26 @@ COMPOUND_STATEMENT_2 : T_RCB { $$ = new ast_CompoundStatement; }
| STATEMENT_LIST T_RCB { $$ = new ast_CompoundStatement($1); }
;
-SELECTION_STATEMENT : T_IF T_LRB EXPRESSION T_RRB STATEMENT SELECTION_STATEMENT_2 { ; }
+SELECTION_STATEMENT : T_IF T_LRB EXPRESSION T_RRB STATEMENT SELECTION_STATEMENT_2 { $$ = new ast_SelectionStatement($5, $6); }
+;
+
+SELECTION_STATEMENT_2 : %empty { $$ = new ast_SelectionStatement(); }
+ | T_ELSE STATEMENT { $$ = $2; }
+;
-SELECTION_STATEMENT_2 : %empty { ; }
- | T_ELSE STATEMENT { ; }
+EXPRESSION_STATEMENT : EXPRESSION T_SC { $$ = $1; }
+;
// Expressions
-EXPRESSION : EQUALITY_EXPRESSION { ; }
+EXPRESSION : EQUALITY_EXPRESSION { $$ = $1; }
+ | RETURN_EXPRESSION { $$ = $1; }
+;
+
+EQUALITY_EXPRESSION : T_IDENTIFIER T_EQUALITY T_IDENTIFIER { $$ = new ast_Variable(*$1); }
;
-EQUALITY_EXPRESSION : T_IDENTIFIER T_EQUALITY T_IDENTIFIER { ; }
+RETURN_EXPRESSION : T_RETURN T_IDENTIFIER { $$ = new ast_ReturnExpression(*$2); }
;
%%