Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added multiply,divide-assignment operators #42

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
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
28 changes: 28 additions & 0 deletions include/ast.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#define AST_NODE_DECLARATION 6
#define AST_NODE_ARRAY_DECLARATION 2000
#define AST_NODE_ASSIGNMENT 7
#define AST_NODE_MUL_ASSIGNMENT 6007
#define AST_NODE_DIV_ASSIGNMENT 6008
#define AST_NODE_ARRAY_ASSIGNMENT 2001
#define AST_NODE_ARRAY_ACCESS 2002
#define AST_NODE_ARITHMETIC_EXP 8
Expand Down Expand Up @@ -59,6 +61,8 @@
#define AST_OPR_LGL_OR 43 // or

#define AST_OPR_ASSIGNMENT 44 // :=
#define AST_OPR_MUL_ASSIGNMENT 6009 // *=
#define AST_OPR_DIV_ASSIGNMENT 6010 // /=

#define AST_CONST_INT 45 // INT CONSTANT
#define AST_CONST_BOOL 46 // BOOL CONSTANT
Expand Down Expand Up @@ -100,6 +104,8 @@ struct ast_node_compound_statement;
struct ast_node_declaration;
struct ast_node_array_declaration;
struct ast_node_assignment;
struct ast_node_mul_assignment;
struct ast_node_div_assignment;
struct ast_node_array_assignment;
struct ast_node_array_access;
struct ast_node_expression;
Expand All @@ -125,6 +131,8 @@ typedef struct ast_node_compound_statement ast_node_compound_statement;
typedef struct ast_node_declaration ast_node_declaration;
typedef struct ast_node_array_declaration ast_node_array_declaration;
typedef struct ast_node_assignment ast_node_assignment;
typedef struct ast_node_mul_assignment ast_node_mul_assignment;
typedef struct ast_node_div_assignment ast_node_div_assignment;
typedef struct ast_node_array_assignment ast_node_array_assignment;
typedef struct ast_node_array_access ast_node_array_access;
typedef struct ast_node_expression ast_node_expression;
Expand Down Expand Up @@ -160,6 +168,8 @@ struct ast_node
ast_node_declaration *declaration;
ast_node_array_declaration *array_declaration;
ast_node_assignment *assignment;
ast_node_mul_assignment *mul_assignment;
ast_node_div_assignment *div_assignment;
ast_node_array_assignment *array_assignment;
ast_node_conditional_if *if_else;
ast_node_loop_for *loop_for;
Expand Down Expand Up @@ -205,6 +215,22 @@ struct ast_node_array_declaration
ast_node_expression *expression;
};

struct ast_node_mul_assignment
{
int node_type;

sym_ptr symbol_entry;
ast_node_expression *expression;
};

struct ast_node_div_assignment
{
int node_type;

sym_ptr symbol_entry;
ast_node_expression *expression;
};

struct ast_node_array_assignment
{
int node_type;
Expand Down Expand Up @@ -363,6 +389,8 @@ ast_node_compound_statement *add_compound_statement_node(ast_node_compound_state
ast_node_declaration *create_declaration_node(sym_ptr symbol, ast_node_expression *exp);
ast_node_array_declaration *create_array_declaration_node(sym_ptr symbol, ast_node_expression *size, char *initial_string);
ast_node_assignment *create_assignment_node(sym_ptr symbol, ast_node_expression *exp);
ast_node_mul_assignment *create_mul_assignment_node(sym_ptr symbol, ast_node_expression *exp);
ast_node_div_assignment *create_div_assignment_node(sym_ptr symbol, ast_node_expression *exp);
ast_node_array_assignment *create_array_assignment_node(sym_ptr symbol, ast_node_expression *index, ast_node_expression *exp);
ast_node_array_access *create_array_access_node(sym_ptr symbol, ast_node_expression *index);
ast_node_expression *create_expression_node(int node_type, int opt, int value, ast_node *left, ast_node *right);
Expand Down
4 changes: 4 additions & 0 deletions include/code_printer.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#define _OPR_LGL_OR " | "

#define _OPR_ASSIGNMENT " = "
#define _OPR_MUL_ASSIGNMENT " *= "
#define _OPR_DIV_ASSIGNMENT " /= "

#define _DT_INT_ "int"
#define _DT_VOID_ "void"
Expand All @@ -54,6 +56,8 @@ void ast_compound_statement_printer(ast_node_compound_statement *cmpd_stmt, FILE
void ast_declaration_printer(ast_node_declaration *decl, FILE* handle);
void ast_array_declaration_printer(ast_node_array_declaration *decl, FILE* handle);
void ast_assignment_printer(ast_node_assignment *assg, FILE* handle);
void ast_mul_assignment_printer(ast_node_mul_assignment *mul_assg, FILE* handle);
void ast_div_assignment_printer(ast_node_div_assignment *div_assg, FILE* handle);
void ast_array_assignment_printer(ast_node_array_assignment *assign, FILE *handle);
void ast_array_access_printer(ast_node_array_access *access, FILE* handle);
void ast_expression_printer(ast_node_expression *node, FILE* handle);
Expand Down
38 changes: 38 additions & 0 deletions src/ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ ast_node_statements *create_statement_node(int node_type, void *child)
stmt->child_nodes.assignment = child;
break;

case AST_NODE_MUL_ASSIGNMENT:
stmt->child_nodes.mul_assignment = child;
break;

case AST_NODE_DIV_ASSIGNMENT:
stmt->child_nodes.div_assignment = child;
break;

case AST_NODE_ARRAY_ASSIGNMENT:
stmt->child_nodes.array_assignment = child;
break;
Expand Down Expand Up @@ -144,6 +152,28 @@ ast_node_assignment *create_assignment_node(sym_ptr symbol, ast_node_expression
return assgn;
}

ast_node_mul_assignment *create_mul_assignment_node(sym_ptr symbol, ast_node_expression *exp)
{
ast_node_mul_assignment *mul_assgn = (ast_node_mul_assignment*)malloc(sizeof(ast_node_mul_assignment));

mul_assgn->node_type = AST_NODE_MUL_ASSIGNMENT;
mul_assgn->expression = exp;
mul_assgn->symbol_entry = symbol;

return mul_assgn;
}

ast_node_div_assignment *create_div_assignment_node(sym_ptr symbol, ast_node_expression *exp)
{
ast_node_div_assignment *div_assgn = (ast_node_div_assignment*)malloc(sizeof(ast_node_div_assignment));

div_assgn->node_type = AST_NODE_DIV_ASSIGNMENT;
div_assgn->expression = exp;
div_assgn->symbol_entry = symbol;

return div_assgn;
}

ast_node_array_assignment *create_array_assignment_node(sym_ptr symbol, ast_node_expression *index, ast_node_expression *exp)
{
ast_node_array_assignment *assign = (ast_node_array_assignment*)malloc(sizeof(ast_node_array_assignment));
Expand Down Expand Up @@ -601,6 +631,14 @@ void ast_node_type(int node_type)
case AST_NODE_ASSIGNMENT:
printf("ast assignment");
break;

case AST_NODE_DIV_ASSIGNMENT:
printf("ast division assignment");
break;

case AST_NODE_MUL_ASSIGNMENT:
printf("ast multiplication assignment");
break;

case AST_NODE_ARRAY_ASSIGNMENT:
printf("ast array assignment");
Expand Down
40 changes: 39 additions & 1 deletion src/code_printer.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ void ast_compound_statement_printer(ast_node_compound_statement *cmpd_stmt, FILE
ast_assignment_printer(((ast_node_statements*)temp)->child_nodes.assignment, handle);
break;

case AST_NODE_MUL_ASSIGNMENT:
ast_mul_assignment_printer(((ast_node_statements*)temp)->child_nodes.mul_assignment, handle);
break;

case AST_NODE_DIV_ASSIGNMENT:
ast_div_assignment_printer(((ast_node_statements*)temp)->child_nodes.div_assignment, handle);
break;

case AST_NODE_ARRAY_ASSIGNMENT:
ast_array_assignment_printer(((ast_node_statements*)temp)->child_nodes.array_assignment, handle);
break;
Expand Down Expand Up @@ -174,6 +182,28 @@ void ast_assignment_printer(ast_node_assignment *assg, FILE* handle)

}

void ast_mul_assignment_printer(ast_node_mul_assignment *assg, FILE* handle)
{
if (assg != NULL && handle != NULL)
{
fprintf(handle, "\t%s *= ", assg->symbol_entry->identifier);
ast_expression_printer(assg->expression, handle);
fprintf(handle, "%s", ";\n");
}

}

void ast_div_assignment_printer(ast_node_div_assignment *assg, FILE* handle)
{
if (assg != NULL && handle != NULL)
{
fprintf(handle, "\t%s /= ", assg->symbol_entry->identifier);
ast_expression_printer(assg->expression, handle);
fprintf(handle, "%s", ";\n");
}

}

void ast_array_assignment_printer(ast_node_array_assignment *assign, FILE* handle)
{
if (assign != NULL && handle != NULL)
Expand Down Expand Up @@ -696,7 +726,15 @@ int code_printer(ast_node* ast, int pru_id, int test)
case AST_NODE_ASSIGNMENT:
ast_assignment_printer(((ast_node_statements*)temp)->child_nodes.assignment, handle);
break;


case AST_NODE_MUL_ASSIGNMENT:
ast_mul_assignment_printer(((ast_node_statements*)temp)->child_nodes.mul_assignment, handle);
break;

case AST_NODE_DIV_ASSIGNMENT:
ast_div_assignment_printer(((ast_node_statements*)temp)->child_nodes.div_assignment, handle);
break;

case AST_NODE_ARRAY_ASSIGNMENT:
ast_array_assignment_printer(((ast_node_statements*)temp)->child_nodes.array_assignment, handle);
break;
Expand Down
10 changes: 10 additions & 0 deletions src/lexer.l
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ bitwise_operators ("~"|"&"|"|"|">>"|"<<")
logical_operators ("not"|"and"|"or")
function ("return"|"void"|"def")
assignment_operator ([:][=])
mul_assignment_operator ([*][=])
div_assignment_operator ([/][=])
io ("digital_read"|"digital_write"|"delay"|"pwm"|"start_counter"|"stop_counter"|"read_counter"|"init_message_channel"|"receive_message"|"send_message"|"send_int"|"send_char"|"send_bool"|"send_ints"|"send_chars"|"send_bools")
print ("print"|"println")
identifier ([a-zA-Z_][a-zA-Z0-9_]*)
Expand Down Expand Up @@ -323,6 +325,14 @@ comma ([,])
return OPR_ASSIGNMENT;
}

{mul_assignment_operator} {
return OPR_MUL_ASSIGNMENT;
}

{div_assignment_operator} {
return OPR_DIV_ASSIGNMENT;
}

{io} {
if (!strcmp(yytext, "digital_write"))
{
Expand Down
Loading