mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-18 07:01:31 -07:00
further work on convergence, dead code elimination, and lens (view rule) calls
This commit is contained in:
+22
-32
@@ -1208,7 +1208,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok
|
||||
B32 is_postfix_unary = 0;
|
||||
|
||||
// rjf: dot/arrow operator
|
||||
if(token.kind == E_TokenKind_Symbol &&
|
||||
if(max_precedence >= 1 &&
|
||||
token.kind == E_TokenKind_Symbol &&
|
||||
(str8_match(token_string, str8_lit("."), 0) ||
|
||||
str8_match(token_string, str8_lit("->"), 0)))
|
||||
{
|
||||
@@ -1217,43 +1218,29 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok
|
||||
// rjf: advance past operator
|
||||
it += 1;
|
||||
|
||||
// rjf: expect member name
|
||||
String8 member_name = {0};
|
||||
B32 good_member_name = 0;
|
||||
{
|
||||
E_Token member_name_maybe = e_token_at_it(it, &tokens);
|
||||
String8 member_name_maybe_string = str8_substr(text, member_name_maybe.range);
|
||||
if(member_name_maybe.kind != E_TokenKind_Identifier)
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected member name after `%S`.", token_string);
|
||||
}
|
||||
else
|
||||
{
|
||||
member_name = member_name_maybe_string;
|
||||
good_member_name = 1;
|
||||
}
|
||||
}
|
||||
// rjf: parse right-hand-side
|
||||
E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), 0, 1);
|
||||
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
|
||||
E_Expr *rhs = rhs_expr_parse.exprs.last;
|
||||
it = rhs_expr_parse.last_token;
|
||||
|
||||
// rjf: produce lookup member expr
|
||||
if(good_member_name)
|
||||
// rjf: produce member access expr
|
||||
if(rhs == &e_expr_nil)
|
||||
{
|
||||
E_Expr *member_container = atom;
|
||||
E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafIdentifier, member_name.str);
|
||||
member_expr->string = member_name;
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing right-hand-side of `.`.");
|
||||
}
|
||||
else
|
||||
{
|
||||
E_Expr *lhs = atom;
|
||||
atom = e_push_expr(arena, E_ExprKind_MemberAccess, token_string.str);
|
||||
e_expr_push_child(atom, member_container);
|
||||
e_expr_push_child(atom, member_expr);
|
||||
}
|
||||
|
||||
// rjf: increment past good member names
|
||||
if(good_member_name)
|
||||
{
|
||||
it += 1;
|
||||
e_expr_push_child(atom, lhs);
|
||||
e_expr_push_child(atom, rhs);
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: array index
|
||||
if(token.kind == E_TokenKind_Symbol &&
|
||||
if(max_precedence >= 1 &&
|
||||
token.kind == E_TokenKind_Symbol &&
|
||||
str8_match(token_string, str8_lit("["), 0))
|
||||
{
|
||||
is_postfix_unary = 1;
|
||||
@@ -1292,9 +1279,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok
|
||||
}
|
||||
|
||||
// rjf: calls
|
||||
if(token.kind == E_TokenKind_Symbol &&
|
||||
if(max_precedence >= 0 &&
|
||||
token.kind == E_TokenKind_Symbol &&
|
||||
str8_match(token_string, str8_lit("("), 0))
|
||||
{
|
||||
is_postfix_unary = 1;
|
||||
|
||||
// rjf: skip (
|
||||
it += 1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user