From: NeilBrown <neil@brown.name>
Date: Sun, 9 Jun 2019 22:49:08 +0000 (+1000)
Subject: oceani: use 'bracket' printing for expressions.
X-Git-Url: https://ocean-lang.org/code/?a=commitdiff_plain;h=d8c3a8ef69e0c14c23f7175b60deef3f14e6a88b;p=ocean

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 <neil@brown.name>
---

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;