fixed operator precedence issue

This commit is contained in:
Zander Thannhauser 2025-08-03 23:13:33 -05:00
parent dbd3ff2acd
commit 8e5675a53f

239
main.c
View file

@ -766,133 +766,182 @@ struct expression* parse(const char* text)
{
struct expression* parse_comparision(void)
{
struct expression* parse_arithmetic(void)
struct expression* parse_additive(void)
{
struct expression* parse_prefix(void)
struct expression* parse_multiplicative(void)
{
struct expression* parse_primary(void)
struct expression* parse_prefix(void)
{
struct expression* retval;
switch (tokenkind)
struct expression* parse_primary(void)
{
case tk_identifier:
struct expression* retval;
switch (tokenkind)
{
struct string* name =
new_string(buffer.data);
case tk_identifier:
{
struct string* name =
new_string(buffer.data);
retval = new_variable_expression(name);
next_token();
retval = new_variable_expression(name);
next_token();
free_string(name);
break;
}
free_string(name);
break;
}
case tk_literal:
{
struct value* value =
scan(buffer.data);
case tk_literal:
{
struct value* value =
scan(buffer.data);
retval = new_literal_expression(value);
retval = new_literal_expression(value);
next_token();
next_token();
free_value(value);
break;
}
free_value(value);
break;
}
case tk_oparen:
{
next_token();
case tk_oparen:
{
next_token();
retval = parse_root();
retval = parse_root();
if (tokenkind != tk_cparen)
if (tokenkind != tk_cparen)
{
struct string* message =
new_string_from_fmt(
"unexpected '%s'",
tokennames[tokenkind]);
retval = new_syntax_error_expression(message, retval);
free_string(message);
}
next_token();
break;
}
default:
{
struct string* message =
new_string_from_fmt(
"unexpected '%s'",
tokennames[tokenkind]);
retval = new_syntax_error_expression(message, retval);
retval = new_syntax_error_expression(message, NULL);
free_string(message);
break;
}
}
return retval;
}
switch (tokenkind)
{
case tk_emark:
{
next_token();
break;
struct expression* sub =
parse_prefix();
struct expression* retval =
new_logical_not_expression(sub);
free_expression(sub);
return retval;
}
case tk_plus:
{
next_token();
struct expression* sub =
parse_prefix();
struct expression* retval =
new_positive_expression(sub);
free_expression(sub);
return retval;
}
case tk_minus:
{
next_token();
struct expression* sub =
parse_prefix();
struct expression* retval =
new_negative_expression(sub);
free_expression(sub);
return retval;
}
default:
{
struct string* message =
new_string_from_fmt(
"unexpected '%s'",
tokennames[tokenkind]);
retval = new_syntax_error_expression(message, NULL);
free_string(message);
break;
}
return parse_primary();
}
return retval;
}
switch (tokenkind)
struct expression* left = parse_prefix();
again: switch (tokenkind)
{
case tk_emark:
case tk_asterisk:
{
next_token();
struct expression* sub =
struct expression* right =
parse_prefix();
struct expression* retval =
new_logical_not_expression(sub);
new_binary_expression(ek_multiply, left, right);
free_expression(sub);
free_expression(left);
free_expression(right);
return retval;
left = retval;
goto again;
}
case tk_plus:
case tk_slash:
{
next_token();
struct expression* sub =
struct expression* right =
parse_prefix();
struct expression* retval =
new_positive_expression(sub);
new_binary_expression(ek_divide, left, right);
free_expression(sub);
free_expression(left);
free_expression(right);
return retval;
}
left = retval;
case tk_minus:
{
next_token();
struct expression* sub =
parse_prefix();
struct expression* retval =
new_negative_expression(sub);
free_expression(sub);
return retval;
goto again;
}
default:
return parse_primary();
break;
}
return left;
}
struct expression* left = parse_prefix();
struct expression* left = parse_multiplicative();
again: switch (tokenkind)
{
@ -901,7 +950,7 @@ struct expression* parse(const char* text)
next_token();
struct expression* right =
parse_prefix();
parse_multiplicative();
struct expression* retval =
new_binary_expression(ek_add, left, right);
@ -919,7 +968,7 @@ struct expression* parse(const char* text)
next_token();
struct expression* right =
parse_prefix();
parse_multiplicative();
struct expression* retval =
new_binary_expression(ek_subtract, left, right);
@ -932,42 +981,6 @@ struct expression* parse(const char* text)
goto again;
}
case tk_asterisk:
{
next_token();
struct expression* right =
parse_prefix();
struct expression* retval =
new_binary_expression(ek_multiply, left, right);
free_expression(left);
free_expression(right);
left = retval;
goto again;
}
case tk_slash:
{
next_token();
struct expression* right =
parse_prefix();
struct expression* retval =
new_binary_expression(ek_divide, left, right);
free_expression(left);
free_expression(right);
left = retval;
goto again;
}
default:
break;
}
@ -975,7 +988,7 @@ struct expression* parse(const char* text)
return left;
}
struct expression* left = parse_arithmetic();
struct expression* left = parse_additive();
again: switch (tokenkind)
{
@ -984,7 +997,7 @@ struct expression* parse(const char* text)
next_token();
struct expression* right =
parse_arithmetic();
parse_additive();
struct expression* retval =
new_binary_expression(ek_less_than, left, right);
@ -1002,7 +1015,7 @@ struct expression* parse(const char* text)
next_token();
struct expression* right =
parse_arithmetic();
parse_additive();
struct expression* retval =
new_binary_expression(ek_less_than_equal_to, left, right);
@ -1020,7 +1033,7 @@ struct expression* parse(const char* text)
next_token();
struct expression* right =
parse_arithmetic();
parse_additive();
struct expression* retval =
new_binary_expression(ek_greater_than, left, right);
@ -1038,7 +1051,7 @@ struct expression* parse(const char* text)
next_token();
struct expression* right =
parse_arithmetic();
parse_additive();
struct expression* retval =
new_binary_expression(ek_greater_than_equal_to, left, right);