nooc

nooc programming language compiler
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit ef5ac4a6e8831874b370529cd530e2207a750a61
parent 7d764e57584acb74f6895bb809d79d5593c74078
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Thu, 27 Jan 2022 19:18:03 -0600

parse: enforce that if conditions are booleans with new class

Diffstat:
Mnooc.h | 1+
Mparse.c | 14++++++++++++--
Atest/if_nobool.fail.nooc | 5+++++
3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/nooc.h b/nooc.h @@ -222,6 +222,7 @@ enum exprkind { enum class { C_INT = 1, + C_BOOL, C_REF, C_STR, C_PROC, diff --git a/parse.c b/parse.c @@ -144,6 +144,8 @@ parseexpr(struct block *block) expr.kind = EXPR_COND; tok = tok->next; expr.d.cond.cond = parseexpr(block); + if (exprs.data[expr.d.cond.cond].class != C_BOOL) + error(expr.start->line, expr.start->col, "expected boolean expression for if condition"); parseblock(&expr.d.cond.bif); if (tok->type == TOK_ELSE) { tok = tok->next; @@ -238,11 +240,19 @@ parseexpr(struct block *block) case TOK_EQUAL: expr.kind = EXPR_BINARY; expr.d.bop.kind = BOP_EQUAL; - goto binary_common; + goto bool_common; case TOK_GREATER: expr.kind = EXPR_BINARY; expr.d.bop.kind = BOP_GREATER; - goto binary_common; +bool_common: + expr.start = tok; + tok = tok->next; + expr.d.bop.left = parseexpr(block); + expr.d.bop.right = parseexpr(block); + if (exprs.data[expr.d.bop.left].class != exprs.data[expr.d.bop.right].class) + error(tok->line, tok->col, "expected boolean expression operands to be of same class"); + expr.class = C_BOOL; + break; case TOK_PLUS: expr.kind = EXPR_BINARY; expr.d.bop.kind = BOP_PLUS; diff --git a/test/if_nobool.fail.nooc b/test/if_nobool.fail.nooc @@ -0,0 +1,4 @@ +let main proc() = proc () { + if + 1 2 { + } +}+ \ No newline at end of file