Skip to content

Commit

Permalink
Implemented MODASN
Browse files Browse the repository at this point in the history
  • Loading branch information
SolindekDev committed Apr 17, 2024
1 parent ea48002 commit 16a9423
Show file tree
Hide file tree
Showing 12 changed files with 55 additions and 1 deletion.
2 changes: 1 addition & 1 deletion TODO
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
- [ ] Implement array
- [ ] Implement pointers
- [ ] Implement match
- [ ] Implement modulus (forgot about it)
- [X] Implement modulus (forgot about it)

BUGS:
- [X] Make args parser finally work...
Expand Down
1 change: 1 addition & 0 deletions include/barn_nodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ typedef enum __barn_node_kind_t {
BARN_NODE_VARIABLE_ASNPLUS,
BARN_NODE_VARIABLE_ASNMINUS,
BARN_NODE_VARIABLE_ASNMUL,
BARN_NODE_VARIABLE_ASNMOD,
BARN_NODE_VARIABLE_ASNDIV,
BARN_NODE_VARIABLE_INCREMENTATION,
BARN_NODE_VARIABLE_DECREMENTATION,
Expand Down
1 change: 1 addition & 0 deletions include/barn_tokens.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ typedef enum __barn_token_kind_t {
BARN_TOKEN_MINUSASN, // "-="
BARN_TOKEN_MULASN, // "*="
BARN_TOKEN_DIVASN, // "/="
BARN_TOKEN_MODASN, // "%="
BARN_TOKEN_INCREMENTATION, // "++"
BARN_TOKEN_DECREMENTATION, // "--"

Expand Down
1 change: 1 addition & 0 deletions include/barn_variable_modification.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ void barn_parser_variable_plusasn (barn_parser_t* parser, barn_parser_access_ele
void barn_parser_variable_minusasn(barn_parser_t* parser, barn_parser_access_element_t* element); // -=
void barn_parser_variable_mulasn (barn_parser_t* parser, barn_parser_access_element_t* element); // *=
void barn_parser_variable_divasn (barn_parser_t* parser, barn_parser_access_element_t* element); // /=
void barn_parser_variable_modasn (barn_parser_t* parser, barn_parser_access_element_t* element); // /=

void barn_parser_variable_incrementation(barn_parser_t* parser, barn_parser_access_element_t* element); // ++
void barn_parser_variable_decrementation(barn_parser_t* parser, barn_parser_access_element_t* element); // --
Expand Down
9 changes: 9 additions & 0 deletions main.ba
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@import "std.ba"

fun main() -> i32 {
let xdd: i32 = 10

xdd %= 2

return 2 % 2
}
4 changes: 4 additions & 0 deletions src/barn_codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,9 @@ barn_codegen_variable_modification(barn_codegen_t* codegen, barn_node_t* curr_no
case BARN_NODE_VARIABLE_ASNPLUS:
fprintf(codegen->c_file, "+= ");
break;
case BARN_NODE_VARIABLE_ASNMOD:
fprintf(codegen->c_file, "%= ");
break;
case BARN_NODE_VARIABLE_ASNMUL:
fprintf(codegen->c_file, "*= ");
break;
Expand Down Expand Up @@ -477,6 +480,7 @@ barn_codegen_generate_function_body(barn_codegen_t* codegen, barn_node_t* curr_n
case BARN_NODE_VARIABLE_ASNDIV:
case BARN_NODE_VARIABLE_ASNMINUS:
case BARN_NODE_VARIABLE_ASNPLUS:
case BARN_NODE_VARIABLE_ASNMOD:
case BARN_NODE_VARIABLE_ASNMUL:
case BARN_NODE_VARIABLE_INCREMENTATION:
case BARN_NODE_VARIABLE_DECREMENTATION:
Expand Down
8 changes: 8 additions & 0 deletions src/barn_lexer.c
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,14 @@ barn_lexer_create_symbol(barn_lexer_t* lexer)
}
case '%':
{
if (lexer->next_char == '=')
{
barn_lexer_advance(lexer, 1);
symbol.symbol_value = "%=";
symbol.symbol_kind = BARN_TOKEN_MODASN;
return symbol;
}

symbol.symbol_value = "%";
symbol.symbol_kind = BARN_TOKEN_MOD;
return symbol;
Expand Down
2 changes: 2 additions & 0 deletions src/barn_nodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ barn_node_kind_show(barn_node_kind_t kind)
return "VariableAssignmentDivide";
case BARN_NODE_VARIABLE_ASNPLUS:
return "VariableAssignmentPlus";
case BARN_NODE_VARIABLE_ASNMOD:
return "VariableAssignmentMod";
case BARN_NODE_VARIABLE_ASNMINUS:
return "VariableAssignmentMinus";
case BARN_NODE_VARIABLE_ASNMUL:
Expand Down
2 changes: 2 additions & 0 deletions src/barn_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ barn_parser_identifier(barn_parser_t* parser)
barn_parser_variable_asn(parser, element);
else if (barn_parser_is_next_token(parser, BARN_TOKEN_PLUSASN))
barn_parser_variable_plusasn(parser, element);
else if (barn_parser_is_next_token(parser, BARN_TOKEN_MODASN))
barn_parser_variable_modasn(parser, element);
else if (barn_parser_is_next_token(parser, BARN_TOKEN_MINUSASN))
barn_parser_variable_minusasn(parser, element);
else if (barn_parser_is_next_token(parser, BARN_TOKEN_MULASN))
Expand Down
2 changes: 2 additions & 0 deletions src/barn_tokens.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ barn_token_kind_to_string(barn_token_kind_t kind)
return "MULASN";
case BARN_TOKEN_DIVASN:
return "DIVASN";
case BARN_TOKEN_MODASN:
return "MODASN";
case BARN_TOKEN_BANG:
return "BANG";
case BARN_TOKEN_GT:
Expand Down
2 changes: 2 additions & 0 deletions src/barn_type_checker.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ barn_tc_value_modification(barn_type_checker_t* tc, barn_node_t* value_mod)
curr_node->node_kind == BARN_NODE_VARIABLE_ASNMINUS ||
curr_node->node_kind == BARN_NODE_VARIABLE_ASNDIV ||
curr_node->node_kind == BARN_NODE_VARIABLE_ASNMUL ||
curr_node->node_kind == BARN_NODE_VARIABLE_ASNMOD ||
curr_node->node_kind == BARN_NODE_VARIABLE_INCREMENTATION ||
curr_node->node_kind == BARN_NODE_VARIABLE_DECREMENTATION)
{
Expand Down Expand Up @@ -446,6 +447,7 @@ barn_type_checker_main_loop(barn_type_checker_t* tc, barn_parser_t* parser)
tc->curr_node->node_kind == BARN_NODE_VARIABLE_ASNMINUS ||
tc->curr_node->node_kind == BARN_NODE_VARIABLE_ASNDIV ||
tc->curr_node->node_kind == BARN_NODE_VARIABLE_ASNMUL ||
tc->curr_node->node_kind == BARN_NODE_VARIABLE_ASNMOD ||
tc->curr_node->node_kind == BARN_NODE_VARIABLE_INCREMENTATION ||
tc->curr_node->node_kind == BARN_NODE_VARIABLE_DECREMENTATION)
barn_tc_value_modification(tc, NULL);
Expand Down
22 changes: 22 additions & 0 deletions src/barn_variable_modification.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,28 @@ barn_parser_variable_plusasn(barn_parser_t* parser, barn_parser_access_element_t
barn_parser_append_node(parser, node);
}

void
barn_parser_variable_modasn(barn_parser_t* parser, barn_parser_access_element_t* element)
{
barn_token_t* start_token = parser->curr_token;
barn_parser_skip(parser, 1);

if (element->variable.variable->is_const == true)
BARN_PARSER_ERR(parser, BARN_PARSER_ERROR, "'%s' is a constant variable that can't be modified",
parser->curr_token->value);

barn_parser_skip(parser, 1);
element->variable.variable->is_used = true;

barn_node_t* new_var_value = barn_parse_expression(parser, BARN_TOKEN_NEWLINE, BARN_TOKEN_SEMICOL, true);
barn_node_t* node = barn_create_empty_node(BARN_NODE_VARIABLE_ASNMOD);
node->variable_modification.variable_value = new_var_value;
node->variable_modification.access_element = element;
node->variable_modification.variable_token = start_token;

barn_parser_append_node(parser, node);
}

void
barn_parser_variable_minusasn(barn_parser_t* parser, barn_parser_access_element_t* element)
{
Expand Down

0 comments on commit 16a9423

Please sign in to comment.