fixed a subtle bug: in some obscure cases involving conflict resolvers and
authorceriel <none@none>
Wed, 5 Aug 1987 12:52:15 +0000 (12:52 +0000)
committerceriel <none@none>
Wed, 5 Aug 1987 12:52:15 +0000 (12:52 +0000)
defaults, wrong code was generated

util/LLgen/src/gencode.c

index e67b284..59ff778 100644 (file)
@@ -526,12 +526,6 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
        fputs("switch(LLcsymb) {\n", f);
        while (g_gettype(p) != EORULE) {
                l = g_getlink(p);
-               if (unsafe && (l->l_flag & DEF)) {
-                       haddefault = 1;
-                       fprintf(f,
-"default: if (LLskip()) goto L_%d;\ngoto L_%d;\n",
-                       lb, hulp2);
-               }
                if (l->l_flag & COND) {
                        if (l->l_flag & NOCONF) {
                                fputs("#ifdef ___NOCONFLICT___\n", f);
@@ -551,7 +545,7 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
                                free((p_mem) set);
                        }
                }
-               if (!haddefault && (l->l_flag & DEF)) {
+               if (!unsafe && (l->l_flag & DEF)) {
                        haddefault = 1;
                        fputs("default:\n", f);
                }
@@ -565,6 +559,12 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
                }
                rulecode(l->l_rule, nsafe, mustscan, mustpop);
                fputs(c_break,f);
+               if (unsafe && (l->l_flag & DEF)) {
+                       haddefault = 1;
+                       fprintf(f,
+"default: if (LLskip()) goto L_%d;\ngoto L_%d;\n",
+                       lb, hulp2);
+               }
                if ((l->l_flag & COND) && !(l->l_flag & NOCONF)) {
                        p++;
                        fprintf(f,"L_%d : ;\n",hulp);