From d8c3a8ef69e0c14c23f7175b60deef3f14e6a88b Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 10 Jun 2019 08:49:08 +1000 Subject: [PATCH] oceani: use 'bracket' printing for expressions. Adding brackets to expression printing removes and ambiguity. As I'm about to change expression parsing, I want to be able to see that the result is correct. Signed-off-by: NeilBrown --- csrc/oceani.mdc | 80 ++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index f598344..7f71ecc 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -1744,9 +1744,9 @@ make a copy of an array with controllable depth. ###### print binode cases case Index: - print_exec(b->left, -1, 0); + print_exec(b->left, -1, bracket); printf("["); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); printf("]"); break; @@ -1930,7 +1930,7 @@ function will be needed. case Xfieldref: { struct fieldref *f = cast(fieldref, e); - print_exec(f->left, -1, 0); + print_exec(f->left, -1, bracket); printf(".%.*s", f->name.len, f->name.txt); break; } @@ -2490,11 +2490,13 @@ room for ambiguity, so a full conditional expression is allowed in there. case CondExpr: b2 = cast(binode, b->right); - print_exec(b2->left, -1, 0); + if (bracket) printf("("); + print_exec(b2->left, -1, bracket); printf(" if "); - print_exec(b->left, -1, 0); + print_exec(b->left, -1, bracket); printf(" else "); - print_exec(b2->right, -1, 0); + print_exec(b2->right, -1, bracket); + if (bracket) printf(")"); break; ###### propagate binode cases @@ -2585,28 +2587,38 @@ if the result would make a difference. ###### print binode cases case And: - print_exec(b->left, -1, 0); + if (bracket) printf("("); + print_exec(b->left, -1, bracket); printf(" and "); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); + if (bracket) printf(")"); break; case AndThen: - print_exec(b->left, -1, 0); + if (bracket) printf("("); + print_exec(b->left, -1, bracket); printf(" and then "); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); + if (bracket) printf(")"); break; case Or: - print_exec(b->left, -1, 0); + if (bracket) printf("("); + print_exec(b->left, -1, bracket); printf(" or "); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); + if (bracket) printf(")"); break; case OrElse: - print_exec(b->left, -1, 0); + if (bracket) printf("("); + print_exec(b->left, -1, bracket); printf(" or else "); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); + if (bracket) printf(")"); break; case Not: + if (bracket) printf("("); printf("not "); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); + if (bracket) printf(")"); break; ###### propagate binode cases @@ -2707,7 +2719,8 @@ expression operator. case GtrEq: case Eql: case NEql: - print_exec(b->left, -1, 0); + if (bracket) printf("("); + print_exec(b->left, -1, bracket); switch(b->op) { case Less: printf(" < "); break; case LessEq: printf(" <= "); break; @@ -2717,7 +2730,8 @@ expression operator. case NEql: printf(" != "); break; default: abort(); // NOTEST } - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); + if (bracket) printf(")"); break; ###### propagate binode cases @@ -2842,7 +2856,8 @@ precedence is handled better I might be able to discard this. case Divide: case Concat: case Rem: - print_exec(b->left, indent, 0); + if (bracket) printf("("); + print_exec(b->left, indent, bracket); switch(b->op) { case Plus: fputs(" + ", stdout); break; case Minus: fputs(" - ", stdout); break; @@ -2852,19 +2867,24 @@ precedence is handled better I might be able to discard this. case Concat: fputs(" ++ ", stdout); break; default: abort(); // NOTEST } // NOTEST - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); + if (bracket) printf(")"); break; case Absolute: + if (bracket) printf("("); printf("+"); - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); + if (bracket) printf(")"); break; case Negate: + if (bracket) printf("("); printf("-"); - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); + if (bracket) printf(")"); break; case Bracket: printf("("); - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); printf(")"); break; @@ -3088,10 +3108,10 @@ is in-place. if (b->left == NULL) printf("pass"); else - print_exec(b->left, indent, 0); + print_exec(b->left, indent, bracket); if (b->right) { printf("; "); - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); } } else { // block, one per line @@ -3194,7 +3214,7 @@ same solution. while (b) { if (b->left) { printf(" "); - print_exec(b->left, -1, 0); + print_exec(b->left, -1, bracket); if (b->right) printf(","); } @@ -3280,9 +3300,9 @@ it is declared, and error will be raised as the name is created as case Assign: do_indent(indent, ""); - print_exec(b->left, indent, 0); + print_exec(b->left, indent, bracket); printf(" = "); - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); if (indent >= 0) printf("\n"); break; @@ -3291,7 +3311,7 @@ it is declared, and error will be raised as the name is created as { struct variable *v = cast(var, b->left)->var; do_indent(indent, ""); - print_exec(b->left, indent, 0); + print_exec(b->left, indent, bracket); if (cast(var, b->left)->var->constant) { if (v->where_decl == v->where_set) { printf("::"); @@ -3309,7 +3329,7 @@ it is declared, and error will be raised as the name is created as } if (b->right) { printf("= "); - print_exec(b->right, indent, 0); + print_exec(b->right, indent, bracket); } if (indent >= 0) printf("\n"); @@ -3404,7 +3424,7 @@ function. case Use: do_indent(indent, "use "); - print_exec(b->right, -1, 0); + print_exec(b->right, -1, bracket); if (indent >= 0) printf("\n"); break; -- 2.43.0