Fix 960317 NetBSD merge error. Merge caused local OpenBSD mod lossage.
authoretheisen <etheisen@openbsd.org>
Sun, 31 Mar 1996 04:56:00 +0000 (04:56 +0000)
committeretheisen <etheisen@openbsd.org>
Sun, 31 Mar 1996 04:56:00 +0000 (04:56 +0000)
NetBSD's byacc %expect mods are buggy and don't handle syntax or semantic
errors.  Additionally, they do not mimic the BISON behavior they try to
emulate.  Our local OpenBSD %expect mods are much better.

usr.bin/yacc/defs.h
usr.bin/yacc/mkpar.c
usr.bin/yacc/reader.c

index 440f820..57e2e28 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: defs.h,v 1.3 1996/03/27 19:33:18 niklas Exp $ */
+/*     $OpenBSD: defs.h,v 1.4 1996/03/31 04:56:00 etheisen Exp $       */
 
 #include <assert.h>
 #include <ctype.h>
index b66784b..34df17a 100644 (file)
@@ -1,5 +1,7 @@
+/*     $OpenBSD: mkpar.c,v 1.3 1996/03/31 04:56:02 etheisen Exp $      */
+
 #ifndef lint
-static char rcsid[] = "$Id: mkpar.c,v 1.2 1996/02/04 08:37:01 etheisen Exp $";
+static char rcsid[] = "$Id: mkpar.c,v 1.3 1996/03/31 04:56:02 etheisen Exp $";
 #endif /* not lint */
 
 #include "defs.h"
index e3367fa..f0504e3 100644 (file)
@@ -1,7 +1,7 @@
-/*     $OpenBSD: reader.c,v 1.3 1996/03/27 19:33:19 niklas Exp $       */
+/*     $OpenBSD: reader.c,v 1.4 1996/03/31 04:56:01 etheisen Exp $     */
 
 #ifndef lint
-static char rcsid[] = "$OpenBSD: reader.c,v 1.3 1996/03/27 19:33:19 niklas Exp $";
+static char rcsid[] = "$Id: reader.c,v 1.4 1996/03/31 04:56:01 etheisen Exp $";
 #endif /* not lint */
 
 #include "defs.h"
@@ -894,6 +894,50 @@ int assoc;
 }
 
 
+/*
+ * %expect requires special handling
+ * as it really isn't part of the yacc
+ * grammar only a flag for yacc proper.
+ */
+declare_expect(assoc)
+int assoc;
+{
+    register int c;
+
+    if (assoc != EXPECT) ++prec;
+
+    /*
+     * Stay away from nextc - doesn't
+     * detect EOL and will read to EOF.
+     */
+    c = *++cptr;
+    if (c == EOF) unexpected_EOF();
+
+    for(;;)
+    {
+        if (isdigit(c))
+        {
+           SRexpect = get_number();
+            break;
+        }
+        /*
+         * Looking for number before EOL.
+         * Spaces, tabs, and numbers are ok,
+         * words, punc., etc. are syntax errors.
+         */
+        else if (c == '\n' || isalpha(c) || !isspace(c))
+        {
+            syntax_error(lineno, line, cptr);
+        }
+        else
+        {
+            c = *++cptr;
+            if (c == EOF) unexpected_EOF();
+        }
+    }
+}
+
+
 declare_types()
 {
     register int c;
@@ -939,23 +983,6 @@ declare_start()
     goal = bp;
 }
 
-handle_expect()
-{
-    register int c;
-    register int num;
-
-    c = nextc();
-    if (c == EOF) unexpected_EOF();
-    if (!isdigit(c))
-       syntax_error(lineno, line, cptr);
-    num = get_number();
-    if (num == 1)
-       fprintf (stderr, "%s: Expect 1 shift/reduce conflict.\n", myname);
-    else
-       fprintf (stderr, "%s: Expect %d shift/reduce conflicts.\n", myname,
-           num);
-}
-
 
 read_declarations()
 {
@@ -994,6 +1021,10 @@ read_declarations()
            declare_tokens(k);
            break;
 
+       case EXPECT:
+           declare_expect(k);
+            break;
+
        case TYPE:
            declare_types();
            break;
@@ -1001,10 +1032,6 @@ read_declarations()
        case START:
            declare_start();
            break;
-
-       case EXPECT:
-           handle_expect();
-           break;
        }
     }
 }