From 46c70f9c2dca832ba84472dbbe09064b57710b45 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Fri, 3 Mar 2017 22:19:32 +0000 Subject: Kind of working --- c_compiler/src/c_parser.y | 235 ++++------------------------------------------ 1 file changed, 16 insertions(+), 219 deletions(-) (limited to 'c_compiler/src/c_parser.y') diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y index 39bc13c..7a3899b 100644 --- a/c_compiler/src/c_parser.y +++ b/c_compiler/src/c_parser.y @@ -2,7 +2,7 @@ #include "ast.hpp" -extern const TranslationUnit* g_root; // A way of getting the AST out +extern TranslationUnit* g_root; // A way of getting the AST out //! This is to fix problems when generating C++ // We are declaring the functions provided by Flex, so @@ -19,6 +19,7 @@ void yyerror(const char *); TranslationUnit* trans_unit; Function* function; Type* type; + Initializer* initializer; Declaration* declaration; double number; std::string* string; @@ -33,40 +34,24 @@ void yyerror(const char *); %nonassoc T_RRB %nonassoc T_ELSE - -%type ExtDef DeclarationList InitDeclaratorList IdentifierList - StatementList ArgumentExpressionList - %type ExternalDeclaration %type TranslationUnit %type FunctionDefinition -%type Parameter ParamDeclarator Declaration - -%type ParameterList +%type Parameter Declaration InitDeclaratorList InitDeclarator ParameterList %type DeclarationSpec %type Declarator DirectDeclarator - -%type ExtDeclaration Declaration DeclarationSpec DeclarationSpec_T - Statement CompoundStatement CompoundStatement_2 PrimaryExpression - SelectionStatement ExpressionStatement JumpStatement IterationStatement - Expression AssignmentExpression ConditionalExpression LogicalOrExpression - LogicalAndExpression InclusiveOrExpression ExclusiveOrExpression - AndExpression EqualityExpression RelationalExpression ShiftExpression - AdditiveExpression MultiplicativeExpression CastExpression UnaryExpression - PostfixExpression PostfixExpression2 - -%type Declarator DirectDeclarator InitDeclarator Constant %type T_INT_CONST +%type Initializer -%type T_IDENTIFIER ASSIGN_OPER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT - T_MULT T_DIV T_REM MultDivRemOP UnaryOperator +%type T_IDENTIFIER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT + T_MULT T_DIV T_REM %start ROOT @@ -91,28 +76,23 @@ ExternalDeclaration: // FUNCTION DEFINITION FunctionDefinition: - DeclarationSpec T_IDENTIFIER T_LRB ParameterList T_RRB CompoundStatement { $$ = new Function($1, $2, $4, $6); } + DeclarationSpec T_IDENTIFIER T_LRB ParameterList T_RRB T_SC { $$ = new Function(*$2, $4); } ; ParameterList: - %empty { $$ = new DeclarationList(); } - | Parameter { $$ = new DeclarationList($1); } - | ParameterList T_CMA Parameter { $$->push($3); } + %empty { $$ = new Declaration(); } + | Parameter { $$ = $1; } + | ParameterList T_CMA Parameter { $3->addDeclaration($$); $$ = $3; } ; Parameter: - DeclarationSpec T_IDENTIFIER { $$ = new Declaration($1, *$2); } + DeclarationSpec T_IDENTIFIER { $$ = new Declaration(*$2); } ; // Declaration -DeclarationList: - Declaration { $$ = new DeclarationList($1); } - | DeclarationList Declaration { $$->push($2); } - ; - Declaration: - DeclarationSpec InitDeclaratorList T_SC { $$ = new Declaration($2); } + DeclarationSpec InitDeclaratorList T_SC { $$ = $2; } ; DeclarationSpec: @@ -128,12 +108,12 @@ DeclarationSpec_T: InitDeclaratorList: InitDeclarator { $$ = $1; } - | InitDeclarator T_CMA InitDeclaratorList { $1->addDeclaration($$); $$ = $1; } + | InitDeclaratorList T_CMA InitDeclarator { $3->addDeclaration($$); $$ = $3; } ; InitDeclarator: Declarator { $$ = new Declaration(*$1); } - | Declarator T_EQ Initializer { $$ = new Declaration(*$1, $3); } + | Declarator T_EQ Initializer { $$ = new Declaration(*$1); } ; Initializer: @@ -147,196 +127,13 @@ Declarator: DirectDeclarator: T_IDENTIFIER { $$ = $1; } - | T_LRB Declarator T_RRB { $$ = $2; } - | DirectDeclarator T_LSB ConditionalExpression T_RSB { $$ = $1; } - | DirectDeclarator T_LSB T_RSB { $$ = $1; } - | DirectDeclarator T_LRB ParameterList T_RRB { $$ = $1; } - | DirectDeclarator T_LRB IdentifierList T_RRB { $$ = $1; } - ; - -IdentifierList: - T_IDENTIFIER { $$ = new BaseList(); } - | IdentifierList T_CMA T_IDENTIFIER { $$ = new BaseList(); } - ; - -// Statement - -StatementList: - Statement { $$ = new StatementList($1); } - | StatementList Statement { $$->push($2); } - ; - -Statement: - CompoundStatement { $$ = $1; } - | SelectionStatement { $$ = $1; } - | ExpressionStatement { $$ = $1; } - | JumpStatement { $$ = $1; } - | IterationStatement { $$ = $1; } - ; - -CompoundStatement: - T_LCB CompoundStatement_2 { $$ = $2; } - ; - -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); } - ; - -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); } - ; - -ExpressionStatement: - T_SC { $$ = new ExpressionStatement(); } - | Expression T_SC { $$ = $1; } - ; - -JumpStatement: - T_RETURN ExpressionStatement { $$ = new JumpStatement($2); } - ; - -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: - AssignmentExpression { $$ = $1; } - ; - -AssignmentExpression: - ConditionalExpression { $$ = $1; } - | UnaryExpression ASSIGN_OPER AssignmentExpression { $$ = $1; } - ; - -ASSIGN_OPER: - T_ASSIGN_OPER { ; } - | T_EQ { ; } - ; - -ConditionalExpression: - LogicalOrExpression { $$ = $1; } - | LogicalOrExpression T_QU Expression T_COL ConditionalExpression { $$ = $1; } - ; - -LogicalOrExpression: - LogicalAndExpression { $$ = $1; } - | LogicalOrExpression T_LOG_OR LogicalAndExpression { $$ = $3; } - ; - -LogicalAndExpression: - InclusiveOrExpression { $$ = $1; } - | LogicalAndExpression T_LOG_AND InclusiveOrExpression { $$ = $3; } - ; - -InclusiveOrExpression: - ExclusiveOrExpression { $$ = $1; } - | InclusiveOrExpression T_OR ExclusiveOrExpression { $$ = $3; } - ; - -ExclusiveOrExpression: - AndExpression { $$ = $1; } - | ExclusiveOrExpression T_XOR AndExpression { $$ = $3; } - ; - -AndExpression: - EqualityExpression { $$ = $1; } - | AndExpression T_AND EqualityExpression { $$ = $3; } - ; - -EqualityExpression: - RelationalExpression { $$ = $1; } - | EqualityExpression T_EQUALITY_OP RelationalExpression { $$ = $3; } - ; - -RelationalExpression: - ShiftExpression { $$ = $1; } - | RelationalExpression T_REL_OP ShiftExpression { $$ = $3; } - ; - -ShiftExpression: - AdditiveExpression { $$ = $1; } - | ShiftExpression T_SHIFT_OP AdditiveExpression { $$ = $3; } - ; - -AdditiveExpression: - MultiplicativeExpression { $$ = $1; } - | AdditiveExpression T_ADDSUB_OP MultiplicativeExpression { $$ = $3; } - ; - -MultiplicativeExpression: - CastExpression { $$ = $1; } - | MultiplicativeExpression MultDivRemOP CastExpression { $$ = $3; } - ; - -MultDivRemOP: - T_MULT { $$ = $1; } - | T_DIV { $$ = $1; } - | T_REM { $$ = $1; } - ; - -CastExpression: - UnaryExpression { $$ = $1; } - | T_LRB T_TYPE_SPEC T_RRB CastExpression { $$ = $4; } - ; - -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(); } - ; - -UnaryOperator: - T_AND { $$ = $1; } - | T_ADDSUB_OP { $$ = $1; } - | T_MULT { $$ = $1; } - | T_TILDE { $$ = $1; } - | T_NOT { $$ = $1; } - ; - -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(); } - ; - -PostfixExpression2: - T_RRB { $$ = new Expression(); } - | ArgumentExpressionList T_RRB { $$ = new BaseNode; } - ; - -ArgumentExpressionList: - AssignmentExpression { $$ = new BaseList; } - | ArgumentExpressionList T_CMA AssignmentExpression { $$ = new BaseList; } - ; - -PrimaryExpression: - T_IDENTIFIER { $$ = new Expression(); } - | Constant { $$ = new Expression($1); } - | T_LRB Expression T_RRB { $$ = $2; } - ; - -Constant: - T_INT_CONST { $$ = new Immediate($1); } ; %% -const TranslationUnit* g_root; // Definition of variable (to match declaration earlier) +TranslationUnit* g_root; // Definition of variable (to match declaration earlier) -const TranslationUnit* parseAST() { +TranslationUnit* parseAST() { g_root = 0; yyparse(); return g_root; -- cgit