aboutsummaryrefslogtreecommitdiffstats
path: root/c_parser/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-01 17:18:54 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-01 17:18:54 +0000
commit9e761324895d098a87f0ba66b7eb1794cd3ed6b4 (patch)
treeb46b0eb0eb91f6784d586acb8611495de81b92e4 /c_parser/src
parent2e5cacc6633a6973f8e96adc6bafa633487fc2a1 (diff)
downloadCompiler-9e761324895d098a87f0ba66b7eb1794cd3ed6b4.tar.gz
Compiler-9e761324895d098a87f0ba66b7eb1794cd3ed6b4.zip
Finished parser
Diffstat (limited to 'c_parser/src')
-rw-r--r--c_parser/src/c_parser.y315
1 files changed, 161 insertions, 154 deletions
diff --git a/c_parser/src/c_parser.y b/c_parser/src/c_parser.y
index 53108ad..1fc4d4a 100644
--- a/c_parser/src/c_parser.y
+++ b/c_parser/src/c_parser.y
@@ -14,159 +14,166 @@ void yyerror(const char *);
// Represents the value associated with any kind of
// AST node.
%union{
- const ast_Base *stmnt;
+ const Base *stmnt;
double number;
std::string *string;
}
%token T_TYPE_SPEC T_TYPE_QUAL T_STRG_SPEC T_IDENTIFIER
-%token T_SC T_CMA T_LRB T_RRB T_LCB T_RCB T_LSB T_RSB T_QU T_COL T_LOG_OR T_LOG_AND T_OR T_XOR T_AND T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_MULT T_DIV T_REM T_TILDE T_NOT T_DOT T_ARROW T_INCDEC T_ADDSUB_OP T_ASSIGN_OPER T_EQ T_SIZEOF
+%token T_SC T_CMA T_LRB T_LCB T_RCB T_LSB T_RSB T_QU T_COL T_LOG_OR T_LOG_AND T_OR T_XOR T_AND T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_MULT T_DIV T_REM T_TILDE T_NOT T_DOT T_ARROW T_INCDEC T_ADDSUB_OP T_ASSIGN_OPER T_EQ T_SIZEOF
%token T_INT_CONST
-%token T_IF T_ELSE T_WHILE T_DO T_FOR T_RETURN
+%token T_IF T_WHILE T_DO T_FOR T_RETURN
+%nonassoc T_RRB
+%nonassoc 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
-%type <stmnt> STATEMENT_LIST STATEMENT COMPOUND_STATEMENT COMPOUND_STATEMENT_2 SELECTION_STATEMENT SELECTION_STATEMENT_2 EXPRESSION_STATEMENT JUMP_STATEMENT ITERATION_STATEMENT
-%type <stmnt> EXPRESSION ASSIGNMENT_EXPRESSION CONDITIONAL_EXPRESSION LOGICAL_OR_EXPRESSION LOGICAL_AND_EXPRESSION INCLUSIVE_OR_EXPRESSION EXCLUSIVE_OR_EXPRESSION AND_EXPRESSION EQUALITY_EXPRESSION RELATIONAL_EXPRESSION SHIFT_EXPRESSION ADDITIVE_EXPRESSION MULTIPLICATIVE_EXPRESSION CAST_EXPRESSION UNARY_EXPRESSION POSTFIX_EXPRESSION POSTFIX_EXPRESSION_2 ARGUMENT_EXPRESSION_LIST PRIMARY_EXPRESSION
-%type <number> CONSTANT T_INT_CONST
-%type <string> T_IDENTIFIER MULTDIVREM_OP UNARY_OPERATOR ASSIGN_OPER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT T_MULT T_DIV T_REM //T_OPERATOR
+%type <stmnt> ExtDef ExtDeclaration
+
+%type <stmnt> FuncDef ParameterList Parameter ParamDeclarator
+
+%type <stmnt> DeclarationList Declaration DeclarationSpec DeclarationSpec_T InitDeclarator InitDeclaratorList Declarator
+
+%type <stmnt> StatementList Statement CompoundStatement CompoundStatement_2 SelectionStatement ExpressionStatement JumpStatement IterationStatement
+
+%type <stmnt> Expression AssignmentExpression ConditionalExpression LogicalOrExpression LogicalAndExpression InclusiveOrExpression ExclusiveOrExpression AndExpression EqualityExpression RelationalExpression ShiftExpression AdditiveExpression MultiplicativeExpression CastExpression UnaryExpression PostfixExpression PostfixExpression2 ArgumentExpressionList PrimaryExpression
+
+
+%type <number> Constant T_INT_CONST
+
+
+%type <string> T_IDENTIFIER MultDivRemOP UnaryOperator ASSIGN_OPER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT T_MULT T_DIV T_REM //T_Operator
%start ROOT
%%
ROOT:
- EXT_DEF { ; }
+ ExtDef { ; }
;
// EXTERNAL DEFINITION
-EXT_DEF:
- EXT_DECLARATION { g_root->push($1); }
- | EXT_DEF EXT_DECLARATION { g_root->push($2); }
+ExtDef:
+ ExtDeclaration { g_root->push($1); }
+ | ExtDef ExtDeclaration { g_root->push($2); }
;
-EXT_DECLARATION:
- DECLARATION { $$ = $1; }
- | FUNC_DEF { $$ = $1; }
+ExtDeclaration:
+ Declaration { $$ = $1; }
+ | FuncDef { $$ = $1; }
;
// FUNCTION DEFINITION
-FUNC_DEF:
- DECLARATION_SPEC T_IDENTIFIER T_LRB PARAMETER_LIST T_RRB COMPOUND_STATEMENT { $$ = new ast_Function(*$2, $4, $6); }
+FuncDef:
+ DeclarationSpec T_IDENTIFIER T_LRB ParameterList T_RRB CompoundStatement { $$ = new Function(*$2, $4, $6); }
;
-PARAMETER_LIST:
- %empty { $$ = new ast_ParamList(); }
- | PARAMETER { $$ = new ast_ParamList($1); }
- | PARAMETER_LIST T_CMA PARAMETER { $$->push($3); }
+ParameterList:
+ %empty { $$ = new ParamList(); }
+ | Parameter { $$ = new ParamList($1); }
+ | ParameterList T_CMA Parameter { $$->push($3); }
;
-PARAMETER:
- DECLARATION_SPEC PARAM_DECLARATOR { $$ = $2; }
+Parameter:
+ DeclarationSpec ParamDeclarator { $$ = $2; }
;
-PARAM_DECLARATOR:
- T_IDENTIFIER { $$ = new ast_Parameter(*$1);}
+ParamDeclarator:
+ T_IDENTIFIER { $$ = new Parameter(*$1);}
;
-// DECLARATION
+// Declaration
-DECLARATION_LIST:
- DECLARATION { $$ = new ast_DeclarationList($1); }
- | DECLARATION_LIST DECLARATION { $$->push($2); }
+DeclarationList:
+ Declaration { $$ = new DeclarationList($1); }
+ | DeclarationList Declaration { $$->push($2); }
;
-DECLARATION:
- DECLARATION_SPEC INIT_DECLARATOR_LIST T_SC { $$ = $2; }
+Declaration:
+ DeclarationSpec InitDeclaratorList T_SC { $$ = $2; }
;
-DECLARATION_SPEC:
- DECLARATION_SPEC_T { ; }
- | DECLARATION_SPEC_T DECLARATION_SPEC { ; }
+DeclarationSpec:
+ DeclarationSpec_T { ; }
+ | DeclarationSpec_T DeclarationSpec { ; }
;
-DECLARATION_SPEC_T:
+DeclarationSpec_T:
T_TYPE_SPEC { ; }
| T_TYPE_QUAL { ; }
| T_STRG_SPEC { ; }
;
-INIT_DECLARATOR_LIST:
- INIT_DECLARATOR { $$ = new ast_VariableDeclaration($1); }
- | INIT_DECLARATOR_LIST T_CMA INIT_DECLARATOR { $$->push($3); }
+InitDeclaratorList:
+ InitDeclarator { $$ = new VariableDeclaration($1); }
+ | InitDeclaratorList T_CMA InitDeclarator { $$->push($3); }
;
-INIT_DECLARATOR:
- DECLARATOR { ; }
- | DECLARATOR T_EQ ASSIGNMENT_EXPRESSION { ; }
+InitDeclarator:
+ Declarator { ; }
+ | Declarator T_EQ AssignmentExpression { ; }
;
-DECLARATOR:
- T_IDENTIFIER {$$ = new ast_Variable(*$1); }
+Declarator:
+ T_IDENTIFIER {$$ = new Variable(*$1); }
;
-// STATEMENT
+// Statement
-STATEMENT_LIST:
- STATEMENT { $$ = new ast_StatementList($1); }
- | STATEMENT_LIST STATEMENT { $$->push($2); }
+StatementList:
+ Statement { $$ = new StatementList($1); }
+ | StatementList Statement { $$->push($2); }
;
-STATEMENT:
- COMPOUND_STATEMENT { $$ = $1; }
- | SELECTION_STATEMENT { $$ = $1; }
- | EXPRESSION_STATEMENT { $$ = $1; }
- | JUMP_STATEMENT { $$ = $1; }
- | ITERATION_STATEMENT { $$ = $1; }
+Statement:
+ CompoundStatement { $$ = $1; }
+ | SelectionStatement { $$ = $1; }
+ | ExpressionStatement { $$ = $1; }
+ | JumpStatement { $$ = $1; }
+ | IterationStatement { $$ = $1; }
;
-COMPOUND_STATEMENT:
- T_LCB COMPOUND_STATEMENT_2 { $$ = $2; }
+CompoundStatement:
+ T_LCB CompoundStatement_2 { $$ = $2; }
;
-COMPOUND_STATEMENT_2:
- T_RCB { $$ = new ast_CompoundStatement; }
- | DECLARATION_LIST T_RCB { $$ = new ast_CompoundStatement($1); }
- | DECLARATION_LIST STATEMENT_LIST T_RCB { $$ = new ast_CompoundStatement($1, $2); }
- | STATEMENT_LIST T_RCB { $$ = new ast_CompoundStatement($1); }
+CompoundStatement_2:
+ T_RCB { $$ = new CompoundStatement; }
+ | DeclarationList T_RCB { $$ = new CompoundStatement($1); }
+ | DeclarationList StatementList T_RCB { $$ = new CompoundStatement($1, $2); }
+ | StatementList T_RCB { $$ = new CompoundStatement($1); }
;
-SELECTION_STATEMENT:
- T_IF T_LRB EXPRESSION T_RRB STATEMENT SELECTION_STATEMENT_2 { $$ = new ast_SelectionStatement($5, $6); }
+SelectionStatement:
+ T_IF T_LRB Expression T_RRB Statement { $$ = new SelectionStatement($5); }
+| T_IF T_LRB Expression T_RRB Statement T_ELSE Statement { $$ = new SelectionStatement($5, $7); }
;
-SELECTION_STATEMENT_2:
- %empty { $$ = new ast_SelectionStatement(); }
- | T_ELSE STATEMENT { $$ = $2; }
+ExpressionStatement:
+ T_SC { $$ = new ExpressionStatement(); }
+ | Expression T_SC { $$ = $1; }
;
-EXPRESSION_STATEMENT:
- T_SC { $$ = new ast_ExpressionStatement(); }
- | EXPRESSION T_SC { $$ = $1; }
+JumpStatement:
+ T_RETURN ExpressionStatement { $$ = $2; }
;
-JUMP_STATEMENT:
- T_RETURN EXPRESSION_STATEMENT { $$ = $2; }
- ;
-
-ITERATION_STATEMENT:
- T_WHILE T_LRB EXPRESSION T_RRB STATEMENT { $$ = $5; }
- | T_DO STATEMENT T_WHILE T_LRB EXPRESSION T_RRB T_SC { $$ = $2; }
- | T_FOR T_LRB EXPRESSION T_SC EXPRESSION T_SC EXPRESSION T_RRB STATEMENT { $$ = $9; }
+IterationStatement:
+ T_WHILE T_LRB Expression T_RRB Statement { $$ = $5; }
+ | T_DO Statement T_WHILE T_LRB Expression T_RRB T_SC { $$ = $2; }
+ | T_FOR T_LRB Expression T_SC Expression T_SC Expression T_RRB Statement { $$ = $9; }
;
// Expressions
-EXPRESSION:
- ASSIGNMENT_EXPRESSION { $$ = $1; }
+Expression:
+ AssignmentExpression { $$ = $1; }
;
-ASSIGNMENT_EXPRESSION:
- CONDITIONAL_EXPRESSION { $$ = $1; }
- | UNARY_EXPRESSION ASSIGN_OPER ASSIGNMENT_EXPRESSION { $$ = $1; }
+AssignmentExpression:
+ ConditionalExpression { $$ = $1; }
+ | UnaryExpression ASSIGN_OPER AssignmentExpression { $$ = $1; }
;
ASSIGN_OPER:
@@ -174,116 +181,116 @@ ASSIGN_OPER:
| T_EQ { ; }
;
-CONDITIONAL_EXPRESSION:
- LOGICAL_OR_EXPRESSION { $$ = $1; }
- | LOGICAL_OR_EXPRESSION T_QU EXPRESSION T_COL CONDITIONAL_EXPRESSION { $$ = $1; }
+ConditionalExpression:
+ LogicalOrExpression { $$ = $1; }
+ | LogicalOrExpression T_QU Expression T_COL ConditionalExpression { $$ = $1; }
;
-LOGICAL_OR_EXPRESSION:
- LOGICAL_AND_EXPRESSION { $$ = $1; }
- | LOGICAL_OR_EXPRESSION T_LOG_OR LOGICAL_AND_EXPRESSION { $$ = $3; }
+LogicalOrExpression:
+ LogicalAndExpression { $$ = $1; }
+ | LogicalOrExpression T_LOG_OR LogicalAndExpression { $$ = $3; }
;
-LOGICAL_AND_EXPRESSION:
- INCLUSIVE_OR_EXPRESSION { $$ = $1; }
- | LOGICAL_AND_EXPRESSION T_LOG_AND INCLUSIVE_OR_EXPRESSION { $$ = $3; }
+LogicalAndExpression:
+ InclusiveOrExpression { $$ = $1; }
+ | LogicalAndExpression T_LOG_AND InclusiveOrExpression { $$ = $3; }
;
-INCLUSIVE_OR_EXPRESSION:
- EXCLUSIVE_OR_EXPRESSION { $$ = $1; }
- | INCLUSIVE_OR_EXPRESSION T_OR EXCLUSIVE_OR_EXPRESSION { $$ = $3; }
+InclusiveOrExpression:
+ ExclusiveOrExpression { $$ = $1; }
+ | InclusiveOrExpression T_OR ExclusiveOrExpression { $$ = $3; }
;
-EXCLUSIVE_OR_EXPRESSION:
- AND_EXPRESSION { $$ = $1; }
- | EXCLUSIVE_OR_EXPRESSION T_XOR AND_EXPRESSION { $$ = $3; }
+ExclusiveOrExpression:
+ AndExpression { $$ = $1; }
+ | ExclusiveOrExpression T_XOR AndExpression { $$ = $3; }
;
-AND_EXPRESSION:
- EQUALITY_EXPRESSION { $$ = $1; }
- | AND_EXPRESSION T_AND EQUALITY_EXPRESSION { $$ = $3; }
+AndExpression:
+ EqualityExpression { $$ = $1; }
+ | AndExpression T_AND EqualityExpression { $$ = $3; }
;
-EQUALITY_EXPRESSION:
- RELATIONAL_EXPRESSION { $$ = $1; }
- | EQUALITY_EXPRESSION T_EQUALITY_OP RELATIONAL_EXPRESSION { $$ = $3; }
+EqualityExpression:
+ RelationalExpression { $$ = $1; }
+ | EqualityExpression T_EQUALITY_OP RelationalExpression { $$ = $3; }
;
-RELATIONAL_EXPRESSION:
- SHIFT_EXPRESSION { $$ = $1; }
- | RELATIONAL_EXPRESSION T_REL_OP SHIFT_EXPRESSION { $$ = $3; }
+RelationalExpression:
+ ShiftExpression { $$ = $1; }
+ | RelationalExpression T_REL_OP ShiftExpression { $$ = $3; }
;
-SHIFT_EXPRESSION:
- ADDITIVE_EXPRESSION { $$ = $1; }
- | SHIFT_EXPRESSION T_SHIFT_OP ADDITIVE_EXPRESSION { $$ = $3; }
+ShiftExpression:
+ AdditiveExpression { $$ = $1; }
+ | ShiftExpression T_SHIFT_OP AdditiveExpression { $$ = $3; }
;
-ADDITIVE_EXPRESSION:
- MULTIPLICATIVE_EXPRESSION { $$ = $1; }
- | ADDITIVE_EXPRESSION T_ADDSUB_OP MULTIPLICATIVE_EXPRESSION { $$ = $3; }
+AdditiveExpression:
+ MultiplicativeExpression { $$ = $1; }
+ | AdditiveExpression T_ADDSUB_OP MultiplicativeExpression { $$ = $3; }
;
-MULTIPLICATIVE_EXPRESSION:
- CAST_EXPRESSION { $$ = $1; }
- | MULTIPLICATIVE_EXPRESSION MULTDIVREM_OP CAST_EXPRESSION { $$ = $3; }
+MultiplicativeExpression:
+ CastExpression { $$ = $1; }
+ | MultiplicativeExpression MultDivRemOP CastExpression { $$ = $3; }
;
-MULTDIVREM_OP:
+MultDivRemOP:
T_MULT { $$ = $1; }
| T_DIV { $$ = $1; }
| T_REM { $$ = $1; }
- ;
+ ;
-CAST_EXPRESSION:
- UNARY_EXPRESSION { $$ = $1; }
- | T_LRB T_TYPE_SPEC T_RRB CAST_EXPRESSION { $$ = $4; }
- ;
+CastExpression:
+ UnaryExpression { $$ = $1; }
+ | T_LRB T_TYPE_SPEC T_RRB CastExpression { $$ = $4; }
+ ;
-UNARY_EXPRESSION:
- POSTFIX_EXPRESSION { $$ = $1; }
- | T_INCDEC UNARY_EXPRESSION { $$ = $2; }
- | UNARY_OPERATOR CAST_EXPRESSION { $$ = $2; }
- | T_SIZEOF UNARY_EXPRESSION { $$ = $2; }
- | T_SIZEOF T_LRB T_TYPE_SPEC T_RRB { $$ = new ast_Expression(); }
- ;
+UnaryExpression:
+ PostfixExpression { $$ = $1; }
+ | T_INCDEC UnaryExpression { $$ = $2; }
+ | UnaryOperator CastExpression { $$ = $2; }
+ | T_SIZEOF UnaryExpression { $$ = $2; }
+ | T_SIZEOF T_LRB T_TYPE_SPEC T_RRB { $$ = new Expression(); }
+ ;
-UNARY_OPERATOR:
+UnaryOperator:
T_AND { $$ = $1; }
| T_ADDSUB_OP { $$ = $1; }
| T_MULT { $$ = $1; }
| T_TILDE { $$ = $1; }
| T_NOT { $$ = $1; }
- ;
+ ;
-POSTFIX_EXPRESSION:
- PRIMARY_EXPRESSION { $$ = $1; }
- | POSTFIX_EXPRESSION T_LSB EXPRESSION T_RSB { $$ = $3; }
- | POSTFIX_EXPRESSION T_LRB POSTFIX_EXPRESSION_2 { $$ = $3; }
- | POSTFIX_EXPRESSION T_DOT T_IDENTIFIER { $$ = new ast_Expression(); }
- | POSTFIX_EXPRESSION T_ARROW T_IDENTIFIER { $$ = new ast_Expression(); }
- | POSTFIX_EXPRESSION T_INCDEC { $$ = new ast_Expression(); }
- ;
+PostfixExpression:
+ PrimaryExpression { $$ = $1; }
+ | PostfixExpression T_LSB Expression T_RSB { $$ = $3; }
+ | PostfixExpression T_LRB PostfixExpression2 { $$ = $3; }
+ | PostfixExpression T_DOT T_IDENTIFIER { $$ = new Expression(); }
+ | PostfixExpression T_ARROW T_IDENTIFIER { $$ = new Expression(); }
+ | PostfixExpression T_INCDEC { $$ = new Expression(); }
+ ;
-POSTFIX_EXPRESSION_2:
- T_RRB { $$ = new ast_Expression(); }
- | ARGUMENT_EXPRESSION_LIST T_RRB { $$ = $1; }
- ;
+PostfixExpression2:
+ T_RRB { $$ = new Expression(); }
+ | ArgumentExpressionList T_RRB { $$ = $1; }
+ ;
-ARGUMENT_EXPRESSION_LIST:
- ASSIGNMENT_EXPRESSION { $$ = $1; }
- | ARGUMENT_EXPRESSION_LIST T_CMA ASSIGNMENT_EXPRESSION { $$ = $3; }
- ;
+ArgumentExpressionList:
+ AssignmentExpression { $$ = $1; }
+ | ArgumentExpressionList T_CMA AssignmentExpression { $$ = $3; }
+ ;
-PRIMARY_EXPRESSION:
- T_IDENTIFIER { $$ = new ast_Expression(); }
- | CONSTANT { $$ = new ast_Expression(); }
- | T_LRB EXPRESSION T_RRB { $$ = $2; }
- ;
+PrimaryExpression:
+ T_IDENTIFIER { $$ = new Expression(); }
+ | Constant { $$ = new Expression(); }
+ | T_LRB Expression T_RRB { $$ = $2; }
+ ;
-CONSTANT:
+Constant:
T_INT_CONST { $$ = $1; }
- ;
+ ;
%%