Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 27 additions & 27 deletions src/summoner.c → src/create.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,76 +2,76 @@
#include <stdlib.h>
#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;
expr->u.binary_expression = binary;
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;
Expand All @@ -81,44 +81,44 @@ 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;
elseif->block = block;
return elseif;
}

Elseif *chainElseifList(Elseif *list, Elseif *elseif)
Elseif *chain_else_if_list(Elseif *list, Elseif *elseif)
{
if (list == NULL)
{
Expand All @@ -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;
Expand Down
69 changes: 35 additions & 34 deletions src/grammar.y
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
%{
#include <stdio.h>
#include <stdlib.h>
#include "src/ast.h"
#include "src/summoner.h"
#include "src/interpreter.h"

Expand Down Expand Up @@ -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:
Expand Down
32 changes: 16 additions & 16 deletions src/summoner.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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