summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/parser.c b/parser.c
index 8166ea5..d7dc3fb 100644
--- a/parser.c
+++ b/parser.c
@@ -90,21 +90,24 @@ static void parse_var_ref(struct var_ref_node* p_node) {
p_node->ident = tok.data.ident;
}
-static void parse_expr_assign(struct expr_node* p_node) {
- peek_or_panic();
- if (tok.type != TK_ASSIGN) return;
-
- switch (p_node->type) {
+static void expr_to_lval(struct lval_node* l_node, struct expr_node* e_node) {
+ switch (e_node->type) {
case EXPR_VAR_REF:
- p_node->as._assign.lval = (struct lval_node) {
+ *l_node = (struct lval_node) {
.type = LVAL_VAR_REF,
- .as._var_ref = p_node->as._var_ref,
+ .as._var_ref = e_node->as._var_ref,
};
- break;
+ return;
default:
PARSER_PANIC("expression is not assignable");
}
+}
+
+static void parse_expr_assign(struct expr_node* p_node) {
+ peek_or_panic();
+ if (tok.type != TK_ASSIGN) return;
+ expr_to_lval(&p_node->as._assign.lval, p_node);
p_node->type = EXPR_ASSIGN;
p_node->as._assign.rval = protected_alloc(sizeof(struct expr_node));