From bdc4806f5ddc90aea8840225fd8993e305b7ad10 Mon Sep 17 00:00:00 2001 From: iamcheeseman Date: Fri, 17 Apr 2026 20:05:38 -0400 Subject: microscript: add and and or --- uscript/parser.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'uscript/parser.c') diff --git a/uscript/parser.c b/uscript/parser.c index 9fd4e27..7909f98 100644 --- a/uscript/parser.c +++ b/uscript/parser.c @@ -15,6 +15,8 @@ enum precedence { PREC_NONE, PREC_ASSIGN, // = + PREC_OR, // or + PREC_AND, // and PREC_EQL, // == != PREC_COMP, // < <= > >= PREC_CONCAT, @@ -462,6 +464,26 @@ void parse_ident(struct parser *p) #undef compound_op } +static +void parse_and(struct parser *p) +{ + int jmp = begin_jump(p, BC_FALSEY_JMP); + parser_add_byte(p, BC_POP); + parse_expr(p, PREC_AND + 1); + end_jump(p, jmp); +} + +static +void parse_or(struct parser *p) +{ + int jmp = begin_jump(p, BC_FALSEY_JMP); + int else_jmp = begin_jump(p, BC_JMP); + end_jump(p, jmp); + parser_add_byte(p, BC_POP); + parse_expr(p, PREC_OR + 1); + end_jump(p, else_jmp); +} + static void parse_binary(struct parser *p) { @@ -580,13 +602,14 @@ struct expr expressions[] = { ['>'] = {NULL, parse_binary, PREC_COMP}, ['='] = {NULL, NULL, PREC_NONE}, ['!'] = {parse_unary, NULL, PREC_NONE}, - [TOKEN_EOF] = {NULL, NULL, PREC_NONE}, + [TOKEN_AND] = {NULL, parse_and, PREC_AND}, [TOKEN_BREAK] = {NULL, NULL, PREC_NONE}, [TOKEN_DIV_EQL] = {NULL, NULL, PREC_NONE}, [TOKEN_DOT_DOT] = {NULL, parse_binary, PREC_CONCAT}, [TOKEN_DO] = {NULL, NULL, PREC_NONE}, [TOKEN_ELSE] = {NULL, NULL, PREC_NONE}, [TOKEN_END] = {NULL, NULL, PREC_NONE}, + [TOKEN_EOF] = {NULL, NULL, PREC_NONE}, [TOKEN_EQL] = {NULL, parse_binary, PREC_EQL}, [TOKEN_ERR] = {NULL, NULL, PREC_NONE}, [TOKEN_FALSE] = {parse_literal, NULL, PREC_NONE}, @@ -605,6 +628,7 @@ struct expr expressions[] = { [TOKEN_NEQL] = {NULL, parse_binary, PREC_EQL}, [TOKEN_NEXT] = {NULL, NULL, PREC_NONE}, [TOKEN_NUM] = {parse_number, NULL, PREC_NONE}, + [TOKEN_OR] = {NULL, parse_or, PREC_OR}, [TOKEN_PLUS_EQL] = {NULL, NULL, PREC_NONE}, [TOKEN_RET] = {NULL, NULL, PREC_NONE}, [TOKEN_STR] = {parse_string, NULL, PREC_NONE}, -- cgit v1.3-2-g0d8e