diff --git a/src/summoner.c b/src/create.c similarity index 53% rename from src/summoner.c rename to src/create.c index 27f774f..1b3829b 100644 --- a/src/summoner.c +++ b/src/create.c @@ -2,51 +2,51 @@ #include #include "summoner.h" -Expression *allocExpression(ExpressionKind kind) +Expression *alloc_expression(ExpressionKind kind) { Expression *expr = malloc(sizeof(Expression)); expr->kind = kind; return expr; } -Expression *allocIntExpression(int value) +Expression *alloc_int_expression(int value) { - Expression *expr = allocExpression(INT_EXPRESSION); + Expression *expr = alloc_expression(INT_EXPRESSION); expr->u.int_value = value; return expr; } -Expression *allocDoubleExpression(double value) +Expression *alloc_double_expression(double value) { - Expression *expr = allocExpression(DOUBLE_EXPRESSION); + Expression *expr = alloc_expression(DOUBLE_EXPRESSION); expr->u.double_value = value; return expr; } -Expression *allocIdentifierExpression(char *identifier) +Expression *alloc_identifier_expression(char *identifier) { - Expression *expr = allocExpression(IDENTIFIER_EXPRESSION); + Expression *expr = alloc_expression(IDENTIFIER_EXPRESSION); expr->u.identifier = identifier; return expr; } -Expression *allocBoolExpression(bool value) +Expression *alloc_bool_expression(bool value) { - Expression *expr = allocExpression(BOOL_EXPRESSION); + Expression *expr = alloc_expression(BOOL_EXPRESSION); expr->u.boolean_value = value; return expr; } -Expression *allocUnaryExpression(ExpressionKind kind, Expression *unaryExpr) +Expression *alloc_unary_expression(ExpressionKind kind, Expression *unaryExpr) { - Expression *expr = allocExpression(kind); + Expression *expr = alloc_expression(kind); expr->u.unary_expression = unaryExpr; return expr; } -Expression *allocBinaryExpression(ExpressionKind kind, Expression *left, Expression *right) +Expression *alloc_binary_expression(ExpressionKind kind, Expression *left, Expression *right) { - Expression *expr = allocExpression(kind); + Expression *expr = alloc_expression(kind); BinaryExpression *binary = malloc(sizeof(BinaryExpression)); binary->left = left; binary->right = right; @@ -54,24 +54,24 @@ Expression *allocBinaryExpression(ExpressionKind kind, Expression *left, Express return expr; } -Statement *allocStatement(StatementKind kind) +Statement *alloc_statement(StatementKind kind) { Statement *stmt = malloc(sizeof(Statement)); stmt->kind = kind; return stmt; } -Statement *allocAssignStatement(char *variable, Expression *operand) +Statement *alloc_assign_statement(char *variable, Expression *operand) { - Statement *stmt = allocStatement(ASSIGN_STATEMENT); + Statement *stmt = alloc_statement(ASSIGN_STATEMENT); AssignStatement *assign_s = malloc(sizeof(AssignStatement)); stmt->u.assign_s = assign_s; return stmt; } -Statement *allocIfStatement(Expression *condition, Block *then_block, Elseif *elseif_list, Block *else_block) +Statement *alloc_if_statement(Expression *condition, Block *then_block, Elseif *elseif_list, Block *else_block) { - Statement *stmt = allocStatement(IF_STATEMENT); + Statement *stmt = alloc_statement(IF_STATEMENT); IfStatement *if_s = malloc(sizeof(IfStatement)); if_s->condition = condition; if_s->then_block = then_block; @@ -81,36 +81,36 @@ Statement *allocIfStatement(Expression *condition, Block *then_block, Elseif *el return stmt; } -Statement *allocBlockStatement(Block *block) +Statement *alloc_block_statement(Block *block) { - Statement *stmt = allocStatement(BLOCK_STATEMENT); + Statement *stmt = alloc_statement(BLOCK_STATEMENT); stmt->u.block_s = block; return stmt; } -StatementList *allocStatementList(Statement *statement) +StatementList *alloc_statement_list(Statement *statement) { StatementList *stmt_list = malloc(sizeof(StatementList)); stmt_list->statement = statement; return stmt_list; } -StatementList *chainStatementList(StatementList *list, Statement *statement) +StatementList *chain_statement_list(StatementList *list, Statement *statement) { if (list == NULL) { - return allocStatementList(statement); + return alloc_statement_list(statement); } StatementList *pos; for (pos = list; pos->next; pos = pos->next) ; - pos->next = allocStatementList(statement); + pos->next = alloc_statement_list(statement); return list; } -Elseif *allocElseif(Expression *condition, Block *block) +Elseif *alloc_else_if(Expression *condition, Block *block) { Elseif *elseif = malloc(sizeof(Elseif)); elseif->condition = condition; @@ -118,7 +118,7 @@ Elseif *allocElseif(Expression *condition, Block *block) return elseif; } -Elseif *chainElseifList(Elseif *list, Elseif *elseif) +Elseif *chain_else_if_list(Elseif *list, Elseif *elseif) { if (list == NULL) { @@ -133,7 +133,7 @@ Elseif *chainElseifList(Elseif *list, Elseif *elseif) return list; } -Block *allocBlock(StatementList *list) +Block *alloc_block(StatementList *list) { Block *block = malloc(sizeof(Block)); block->statemen_list = list; diff --git a/src/grammar.y b/src/grammar.y index cfd6831..b9a9200 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -1,6 +1,7 @@ %{ #include #include +#include "src/ast.h" #include "src/summoner.h" #include "src/interpreter.h" @@ -43,66 +44,66 @@ int yyerror(const char *s); %% stmt_list: - stmt {$$ = allocStatementList($1); } - | stmt_list new_line stmt {$$ = chainStatementList($1, $3); } + stmt {$$ = alloc_statement_list($1); } + | stmt_list new_line stmt {$$ = chain_statement_list($1, $3); } ; stmt: expr { printExprValue(evalExpression($1)); } - | IDENTIFIER '=' expr { $$ = allocAssignStatement($1, $3); } - | block { $$ = allocBlockStatement($1); } + | IDENTIFIER '=' expr { $$ = alloc_assign_statement($1, $3); } + | block { $$ = alloc_block_statement($1); } | if_stmt ; if_stmt: - IF '(' bool_expr ')' block { $$ = allocIfStatement($3, $5, NULL, NULL); } - | IF '(' bool_expr ')' block ELSE block { $$ = allocIfStatement($3, $5, NULL, $7); } - | IF '(' bool_expr ')' block elseif_list { $$ = allocIfStatement($3, $5, $6, NULL); } - | IF '(' bool_expr ')' block elseif_list ELSE block { $$ = allocIfStatement($3, $5, $6, $8); } + IF bool_expr block { $$ = alloc_if_statement($2, $3, NULL, NULL); } + | IF bool_expr block ELSE block { $$ = alloc_if_statement($2, $3, NULL, $5); } + | IF bool_expr block elseif_list { $$ = alloc_if_statement($2, $3, $4, NULL); } + | IF bool_expr block elseif_list ELSE block { $$ = alloc_if_statement($2, $3, $4, $6); } ; elseif_list: elseif - | elseif_list elseif { $$ = chainElseifList($1, $2); } + | elseif_list elseif { $$ = chain_else_if_list($1, $2); } ; elseif: - ELSE IF '(' bool_expr ')' block { $$ = allocElseif($4, $6); } + ELSE IF bool_expr block { $$ = alloc_else_if($3, $4); } ; block: - '{' stmt_list '}' { $$ = allocBlock($2); } - | '{' new_line stmt_list '}' { $$ = allocBlock($3); } - | '{' stmt_list new_line '}' { $$ = allocBlock($2); } - | '{' new_line stmt_list new_line '}' { $$ = allocBlock($3); } - | '{' new_line '}' { $$ = allocBlock(NULL); } - | '{' '}' { $$ = allocBlock(NULL); } + '{' stmt_list '}' { $$ = alloc_block($2); } + | '{' new_line stmt_list '}' { $$ = alloc_block($3); } + | '{' stmt_list new_line '}' { $$ = alloc_block($2); } + | '{' new_line stmt_list new_line '}' { $$ = alloc_block($3); } + | '{' new_line '}' { $$ = alloc_block(NULL); } + | '{' '}' { $$ = alloc_block(NULL); } ; expr: - INT_LITERAL { $$ = allocIntExpression($1); } - | DOUBLE_LITERAL { $$ = allocDoubleExpression($1); } - | BOOL_LITERAL { $$ = allocBoolExpression($1); } - | IDENTIFIER { $$ = allocIdentifierExpression($1); } - | expr '+' expr { $$ = allocBinaryExpression(ADD_EXPRESSION, $1, $3); } - | expr '-' expr { $$ = allocBinaryExpression(SUB_EXPRESSION, $1, $3); } - | expr '*' expr { $$ = allocBinaryExpression(MUL_EXPRESSION, $1, $3); } - | expr '/' expr { $$ = allocBinaryExpression(DIV_EXPRESSION, $1, $3); } - | '-' expr %prec MINUS { $$ = allocUnaryExpression(MINUS_EXPRESSION, $2); } + INT_LITERAL { $$ = alloc_int_expression($1); } + | DOUBLE_LITERAL { $$ = alloc_double_expression($1); } + | BOOL_LITERAL { $$ = alloc_bool_expression($1); } + | IDENTIFIER { $$ = alloc_identifier_expression($1); } + | expr '+' expr { $$ = alloc_binary_expression(ADD_EXPRESSION, $1, $3); } + | expr '-' expr { $$ = alloc_binary_expression(SUB_EXPRESSION, $1, $3); } + | expr '*' expr { $$ = alloc_binary_expression(MUL_EXPRESSION, $1, $3); } + | expr '/' expr { $$ = alloc_binary_expression(DIV_EXPRESSION, $1, $3); } + | '-' expr %prec MINUS { $$ = alloc_unary_expression(MINUS_EXPRESSION, $2); } | '(' expr ')' { $$ = $2; } | bool_expr ; bool_expr: - expr '>' expr { $$ = allocBinaryExpression(GT_EXPRESSION, $1, $3); } - | expr GE expr { $$ = allocBinaryExpression(GE_EXPRESSION, $1, $3); } - | expr '<' expr { $$ = allocBinaryExpression(LT_EXPRESSION, $1, $3); } - | expr LE expr { $$ = allocBinaryExpression(LE_EXPRESSION, $1, $3); } - | expr EQ expr { $$ = allocBinaryExpression(EQ_EXPRESSION, $1, $3); } - | expr NE expr { $$ = allocBinaryExpression(NE_EXPRESSION, $1, $3); } - | expr AND expr { $$ = allocBinaryExpression(AND_EXPRESSION, $1, $3); } - | expr OR expr { $$ = allocBinaryExpression(OR_EXPRESSION, $1, $3); } - | '!' expr %prec NOT { $$ = allocUnaryExpression(NOT_EXPRESSION, $2); } + expr '>' expr { $$ = alloc_binary_expression(GT_EXPRESSION, $1, $3); } + | expr GE expr { $$ = alloc_binary_expression(GE_EXPRESSION, $1, $3); } + | expr '<' expr { $$ = alloc_binary_expression(LT_EXPRESSION, $1, $3); } + | expr LE expr { $$ = alloc_binary_expression(LE_EXPRESSION, $1, $3); } + | expr EQ expr { $$ = alloc_binary_expression(EQ_EXPRESSION, $1, $3); } + | expr NE expr { $$ = alloc_binary_expression(NE_EXPRESSION, $1, $3); } + | expr AND expr { $$ = alloc_binary_expression(AND_EXPRESSION, $1, $3); } + | expr OR expr { $$ = alloc_binary_expression(OR_EXPRESSION, $1, $3); } + | '!' expr %prec NOT { $$ = alloc_unary_expression(NOT_EXPRESSION, $2); } ; new_line: diff --git a/src/summoner.h b/src/summoner.h index 4c60d0e..46a3f3f 100644 --- a/src/summoner.h +++ b/src/summoner.h @@ -66,13 +66,13 @@ typedef struct BinaryExpression Expression *right; } BinaryExpression; -Expression *allocExpression(ExpressionKind kind); -Expression *allocIntExpression(int value); -Expression *allocDoubleExpression(double value); -Expression *allocBoolExpression(bool value); -Expression *allocIdentifierExpression(char *identifier); -Expression *allocUnaryExpression(ExpressionKind kind, Expression *unaryExpr); -Expression *allocBinaryExpression(ExpressionKind kind, Expression *left, Expression *right); +Expression *alloc_expression(ExpressionKind kind); +Expression *alloc_int_expression(int value); +Expression *alloc_double_expression(double value); +Expression *alloc_bool_expression(bool value); +Expression *alloc_identifier_expression(char *identifier); +Expression *alloc_unary_expression(ExpressionKind kind, Expression *unaryExpr); +Expression *alloc_binary_expression(ExpressionKind kind, Expression *left, Expression *right); typedef enum { @@ -128,14 +128,14 @@ typedef struct IfStatement Block *else_block; } IfStatement; -Statement *allocStatement(StatementKind kind); -Statement *allocAssignStatement(char *variable, Expression *operand); -Statement *allocBlockStatement(Block *block); -Statement *allocIfStatement(Expression *condition, Block *then_block, Elseif *elseif_list, Block *else_block); -StatementList *allocStatementList(Statement *statement); -StatementList *chainStatementList(StatementList *list, Statement *statement); -Elseif *allocElseif(Expression *condition, Block *block); -Elseif *chainElseifList(Elseif *list, Elseif *elseif); -Block *allocBlock(StatementList *list); +Statement *alloc_statement(StatementKind kind); +Statement *alloc_assign_statement(char *variable, Expression *operand); +Statement *alloc_block_statement(Block *block); +Statement *alloc_if_statement(Expression *condition, Block *then_block, Elseif *elseif_list, Block *else_block); +StatementList *alloc_statement_list(Statement *statement); +StatementList *chain_statement_list(StatementList *list, Statement *statement); +Elseif *alloc_else_if(Expression *condition, Block *block); +Elseif *chain_else_if_list(Elseif *list, Elseif *elseif); +Block *alloc_block(StatementList *list); #endif