]> ocean-lang.org Git - ocean/commitdiff
oceani: use 'bracket' printing for expressions.
authorNeilBrown <neil@brown.name>
Sun, 9 Jun 2019 22:49:08 +0000 (08:49 +1000)
committerNeilBrown <neil@brown.name>
Sun, 9 Jun 2019 22:59:49 +0000 (08:59 +1000)
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>
csrc/oceani.mdc

index f5983440c25ea87ef0dcae5489b70012f40d3e12..7f71eccc43fef1deb45106b3456048cc9d574b89 100644 (file)
@@ -1744,9 +1744,9 @@ make a copy of an array with controllable depth.
 
 ###### print binode cases
        case Index:
 
 ###### print binode cases
        case Index:
-               print_exec(b->left, -1, 0);
+               print_exec(b->left, -1, bracket);
                printf("[");
                printf("[");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
                printf("]");
                break;
 
                printf("]");
                break;
 
@@ -1930,7 +1930,7 @@ function will be needed.
        case Xfieldref:
        {
                struct fieldref *f = cast(fieldref, e);
        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;
        }
                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);
 
        case CondExpr:
                b2 = cast(binode, b->right);
-               print_exec(b2->left, -1, 0);
+               if (bracket) printf("(");
+               print_exec(b2->left, -1, bracket);
                printf(" if ");
                printf(" if ");
-               print_exec(b->left, -1, 0);
+               print_exec(b->left, -1, bracket);
                printf(" else ");
                printf(" else ");
-               print_exec(b2->right, -1, 0);
+               print_exec(b2->right, -1, bracket);
+               if (bracket) printf(")");
                break;
 
 ###### propagate binode cases
                break;
 
 ###### propagate binode cases
@@ -2585,28 +2587,38 @@ if the result would make a difference.
 
 ###### print binode cases
        case And:
 
 ###### print binode cases
        case And:
-               print_exec(b->left, -1, 0);
+               if (bracket) printf("(");
+               print_exec(b->left, -1, bracket);
                printf(" and ");
                printf(" and ");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
+               if (bracket) printf(")");
                break;
        case AndThen:
                break;
        case AndThen:
-               print_exec(b->left, -1, 0);
+               if (bracket) printf("(");
+               print_exec(b->left, -1, bracket);
                printf(" and then ");
                printf(" and then ");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
+               if (bracket) printf(")");
                break;
        case Or:
                break;
        case Or:
-               print_exec(b->left, -1, 0);
+               if (bracket) printf("(");
+               print_exec(b->left, -1, bracket);
                printf(" or ");
                printf(" or ");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
+               if (bracket) printf(")");
                break;
        case OrElse:
                break;
        case OrElse:
-               print_exec(b->left, -1, 0);
+               if (bracket) printf("(");
+               print_exec(b->left, -1, bracket);
                printf(" or else ");
                printf(" or else ");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
+               if (bracket) printf(")");
                break;
        case Not:
                break;
        case Not:
+               if (bracket) printf("(");
                printf("not ");
                printf("not ");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
+               if (bracket) printf(")");
                break;
 
 ###### propagate binode cases
                break;
 
 ###### propagate binode cases
@@ -2707,7 +2719,8 @@ expression operator.
        case GtrEq:
        case Eql:
        case NEql:
        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;
                switch(b->op) {
                case Less:   printf(" < "); break;
                case LessEq: printf(" <= "); break;
@@ -2717,7 +2730,8 @@ expression operator.
                case NEql:   printf(" != "); break;
                default: abort();               // NOTEST
                }
                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
                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:
        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;
                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
                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:
                break;
        case Absolute:
+               if (bracket) printf("(");
                printf("+");
                printf("+");
-               print_exec(b->right, indent, 0);
+               print_exec(b->right, indent, bracket);
+               if (bracket) printf(")");
                break;
        case Negate:
                break;
        case Negate:
+               if (bracket) printf("(");
                printf("-");
                printf("-");
-               print_exec(b->right, indent, 0);
+               print_exec(b->right, indent, bracket);
+               if (bracket) printf(")");
                break;
        case Bracket:
                printf("(");
                break;
        case Bracket:
                printf("(");
-               print_exec(b->right, indent, 0);
+               print_exec(b->right, indent, bracket);
                printf(")");
                break;
 
                printf(")");
                break;
 
@@ -3088,10 +3108,10 @@ is in-place.
                        if (b->left == NULL)
                                printf("pass");
                        else
                        if (b->left == NULL)
                                printf("pass");
                        else
-                               print_exec(b->left, indent, 0);
+                               print_exec(b->left, indent, bracket);
                        if (b->right) {
                                printf("; ");
                        if (b->right) {
                                printf("; ");
-                               print_exec(b->right, indent, 0);
+                               print_exec(b->right, indent, bracket);
                        }
                } else {
                        // block, one per line
                        }
                } else {
                        // block, one per line
@@ -3194,7 +3214,7 @@ same solution.
                while (b) {
                        if (b->left) {
                                printf(" ");
                while (b) {
                        if (b->left) {
                                printf(" ");
-                               print_exec(b->left, -1, 0);
+                               print_exec(b->left, -1, bracket);
                                if (b->right)
                                        printf(",");
                        }
                                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, "");
 
        case Assign:
                do_indent(indent, "");
-               print_exec(b->left, indent, 0);
+               print_exec(b->left, indent, bracket);
                printf(" = ");
                printf(" = ");
-               print_exec(b->right, indent, 0);
+               print_exec(b->right, indent, bracket);
                if (indent >= 0)
                        printf("\n");
                break;
                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, "");
                {
                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("::");
                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("= ");
                }
                if (b->right) {
                        printf("= ");
-                       print_exec(b->right, indent, 0);
+                       print_exec(b->right, indent, bracket);
                }
                if (indent >= 0)
                        printf("\n");
                }
                if (indent >= 0)
                        printf("\n");
@@ -3404,7 +3424,7 @@ function.
 
        case Use:
                do_indent(indent, "use ");
 
        case Use:
                do_indent(indent, "use ");
-               print_exec(b->right, -1, 0);
+               print_exec(b->right, -1, bracket);
                if (indent >= 0)
                        printf("\n");
                break;
                if (indent >= 0)
                        printf("\n");
                break;