fix: variable sets were handled wrong
authorceriel <none@none>
Mon, 3 Aug 1987 18:20:55 +0000 (18:20 +0000)
committerceriel <none@none>
Mon, 3 Aug 1987 18:20:55 +0000 (18:20 +0000)
lang/m2/comp/chk_expr.c
lang/m2/comp/statement.g

index 6529c5f..8541a6e 100644 (file)
@@ -425,11 +425,12 @@ ChkSet(expp)
        register struct def *df;
        unsigned size;
        int retval = 1;
+       int SetIsConstant = 1;
 
        assert(expp->nd_symb == SET);
 
-       expp->nd_class = Set;
        expp->nd_type = error_type;
+       expp->nd_class = Set;
 
        /* First determine the type of the set
        */
@@ -472,10 +473,11 @@ ChkSet(expp)
                                                expp->nd_set)) {
                        retval = 0;
                }
+               if (nd->nd_left) SetIsConstant = 0;
                nd = nd->nd_right;
        }
 
-       if (expp->nd_class == Set) {
+       if (SetIsConstant) {
                FreeNode(expp->nd_right);
                expp->nd_right = 0;
        }
index 3720301..3c60938 100644 (file)
@@ -57,12 +57,21 @@ statement(register struct node **pnd;)
 |
        CaseStatement(pnd)
 |
-       WhileStatement(pnd)
+       WHILE           { *pnd = nd = MkLeaf(Stat, &dot); }
+       expression(&(nd->nd_left))
+       DO
+       StatementSequence(&(nd->nd_right))
+       END
 |
-       RepeatStatement(pnd)
+       REPEAT          { *pnd = nd = MkLeaf(Stat, &dot); }
+       StatementSequence(&(nd->nd_left))
+       UNTIL
+       expression(&(nd->nd_right))
 |
                        { loopcount++; }
-       LoopStatement(pnd)
+       LOOP            { *pnd = nd = MkLeaf(Stat, &dot); }
+       StatementSequence(&((*pnd)->nd_right))
+       END
                        { loopcount--; }
 |
        ForStatement(pnd)
@@ -176,6 +185,7 @@ case(struct node **pnd; struct type **ptp;) :
                        }
 ;
 
+/* inline in statement; lack of space 
 WhileStatement(struct node **pnd;)
 {
        register struct node *nd;
@@ -196,6 +206,7 @@ RepeatStatement(struct node **pnd;)
        UNTIL
        expression(&(nd->nd_right))
 ;
+*/
 
 ForStatement(struct node **pnd;)
 {
@@ -225,11 +236,13 @@ ForStatement(struct node **pnd;)
        END
 ;
 
+/* inline in Statement; lack of space
 LoopStatement(struct node **pnd;):
        LOOP            { *pnd = MkLeaf(Stat, &dot); }
        StatementSequence(&((*pnd)->nd_right))
        END
 ;
+*/
 
 WithStatement(struct node **pnd;)
 {