bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

lalr: add assertions


From: Akim Demaille
Subject: lalr: add assertions
Date: Sun, 8 Nov 2020 08:27:38 +0100

An old commit that was sitting in one of my WIP branches.  This proved useful 
when hacking the construction of the LALR automaton.

commit 0328cbad6408af68a2dd9bd3cbda37d63bcf68e3
Author: Akim Demaille <akim.demaille@gmail.com>
Date:   Tue Jun 23 07:33:03 2020 +0200

    lalr: add assertions
    
    * src/lalr.c: Remove incorrect comment (subsumed anyway by the
    (correct) one in the header.
    (set_goto_map): More debug traces.
    (map_goto): Add an assertion.

diff --git a/src/lalr.c b/src/lalr.c
index 0f5d7147..941a1d68 100644
--- a/src/lalr.c
+++ b/src/lalr.c
@@ -40,7 +40,6 @@
 #include "relation.h"
 #include "symtab.h"
 
-/* goto_map[nterm - NTOKENS] -> number of gotos.  */
 goto_number *goto_map = NULL;
 goto_number ngotos = 0;
 state_number *from_state = NULL;
@@ -99,6 +98,8 @@ void
 set_goto_map (void)
 {
   /* Count the number of gotos (ngotos) per nterm (goto_map). */
+  if (trace_flag & trace_automaton)
+    fprintf (stderr, "nnterms: %d\n", nnterms);
   goto_map = xcalloc (nnterms + 1, sizeof *goto_map);
   ngotos = 0;
   for (state_number s = 0; s < nstates; ++s)
@@ -146,11 +147,17 @@ set_goto_map (void)
   free (temp_map);
 
   if (trace_flag & trace_automaton)
-    for (int i = 0; i < ngotos; ++i)
-      {
-        goto_print (i, stderr);
-        fputc ('\n', stderr);
-      }
+    {
+      for (int i = 0; i < nnterms; ++i)
+        fprintf (stderr, "goto_map[%d (%s)] = %ld .. %ld\n",
+                 i, symbols[ntokens + i]->tag,
+                 goto_map[i], goto_map[i+1] - 1);
+      for (int i = 0; i < ngotos; ++i)
+        {
+          goto_print (i, stderr);
+          fputc ('\n', stderr);
+        }
+    }
 }
 
 
@@ -158,6 +165,7 @@ goto_number
 map_goto (state_number src, symbol_number sym)
 {
   goto_number low = goto_map[sym - ntokens];
+  assert (goto_map[sym - ntokens] != goto_map[sym - ntokens + 1]);
   goto_number high = goto_map[sym - ntokens + 1] - 1;
 
   for (;;)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]