From 612c17991b232b3f0e87b35e92ffadd936bdad9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Thu, 12 Nov 1998 20:45:45 +0100
Subject: [PATCH] Some more optimizations.

Rev: lib/modules/LR.pmod/item.pike:1.4
Rev: lib/modules/LR.pmod/kernel.pike:1.4
Rev: lib/modules/LR.pmod/parser.pike:1.6
Rev: lib/modules/LR.pmod/rule.pike:1.4
---
 lib/modules/LR.pmod/item.pike   | 27 +++++++++++----------------
 lib/modules/LR.pmod/kernel.pike | 11 ++++++-----
 lib/modules/LR.pmod/parser.pike | 21 +++++++++++++++------
 lib/modules/LR.pmod/rule.pike   | 18 +++---------------
 4 files changed, 35 insertions(+), 42 deletions(-)

diff --git a/lib/modules/LR.pmod/item.pike b/lib/modules/LR.pmod/item.pike
index ae927a2c57..176759e140 100644
--- a/lib/modules/LR.pmod/item.pike
+++ b/lib/modules/LR.pmod/item.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: item.pike,v 1.3 1998/11/12 01:31:21 grubba Exp $
+ * $Id: item.pike,v 1.4 1998/11/12 19:45:41 grubba Exp $
  *
  * An LR(0) item
  *
@@ -8,7 +8,7 @@
 
 //.
 //. File:	item.pike
-//. RCSID:	$Id: item.pike,v 1.3 1998/11/12 01:31:21 grubba Exp $
+//. RCSID:	$Id: item.pike,v 1.4 1998/11/12 19:45:41 grubba Exp $
 //. Author:	Henrik Grubbström (grubba@infovav.se)
 //.
 //. Synopsis:	An LR(0) item
@@ -37,7 +37,7 @@ object /* (kernel) */ next_state;
 
 //. + master_item
 //.   Item representing this one (used for shifts).
-object /* (item) */ master_item = 0;
+object /* (item) */ master_item;
 
 //. + direct_lookahead
 //.   Look-ahead set for this item.
@@ -50,18 +50,13 @@ multiset(string) error_lookahead = (<>);
 multiset(object /* (item) */ ) relation = (<>);
 //. + counter
 //.   Depth counter (used when compiling).
-int counter = 0;
+int counter;
 
-//. + item_hash
-//.   Hash used to compare items.
-string item_hash;
+//. + number
+//.   Item identification number (used when compiling).
+int number;
 
-//. - make_item_hash
-//.   Calculate the item hash.
-void make_item_hash()
-{
-  r->make_rule_hash();
-  if (!item_hash) {
-    item_hash = r->rule_hash + "·" + offset;
-  }
-}
+//. + item_id
+//.   Used to identify the item.
+//.   Equal to r->number + offset.
+int item_id;
diff --git a/lib/modules/LR.pmod/kernel.pike b/lib/modules/LR.pmod/kernel.pike
index ecb005aef8..e67d62ab2f 100644
--- a/lib/modules/LR.pmod/kernel.pike
+++ b/lib/modules/LR.pmod/kernel.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: kernel.pike,v 1.3 1998/11/12 01:31:24 grubba Exp $
+ * $Id: kernel.pike,v 1.4 1998/11/12 19:45:42 grubba Exp $
  *
  * Implements a LR(1) state;
  *
@@ -8,7 +8,7 @@
 
 //.
 //. File:	kernel.pike
-//. RCSID:	$Id: kernel.pike,v 1.3 1998/11/12 01:31:24 grubba Exp $
+//. RCSID:	$Id: kernel.pike,v 1.4 1998/11/12 19:45:42 grubba Exp $
 //. Author:	Henrik Grubbström
 //.
 //. Synopsis:	Implements an LR(1) state.
@@ -73,13 +73,14 @@ void add_item(object(item) i)
 void make_kernel_hash()
 {
   if (!kernel_hash) {
-    items->make_item_hash();
-    kernel_hash = sort(items->item_hash) * ":";
+    kernel_hash = (string)sort(items->item_id);
+    // kernel_hash = sprintf("%4c:%@4c", sizeof(items), sort(items->item_id));
+    // werror("Kernel hash:%O\n", kernel_hash);
   }
 }
 
 //. - equalp
-//.   Compare with another state.
+//.   Compare with another state. (OBSOLETE)
 //. > state
 //.   State to compare with.
 int equalp(object /* (kernel) */ state)
diff --git a/lib/modules/LR.pmod/parser.pike b/lib/modules/LR.pmod/parser.pike
index 1a43289138..3dad1c535e 100644
--- a/lib/modules/LR.pmod/parser.pike
+++ b/lib/modules/LR.pmod/parser.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: parser.pike,v 1.5 1998/11/12 02:22:07 grubba Exp $
+ * $Id: parser.pike,v 1.6 1998/11/12 19:45:44 grubba Exp $
  *
  * A BNF-grammar in Pike.
  * Compiles to a LALR(1) state-machine.
@@ -9,7 +9,7 @@
 
 //.
 //. File:	parser.pike
-//. RCSID:	$Id: parser.pike,v 1.5 1998/11/12 02:22:07 grubba Exp $
+//. RCSID:	$Id: parser.pike,v 1.6 1998/11/12 19:45:44 grubba Exp $
 //. Author:	Henrik Grubbström (grubba@infovav.se)
 //.
 //. Synopsis:	LALR(1) parser and compiler.
@@ -162,7 +162,7 @@ int verbose=1;
 int error=0;
 
 /* Number of next rule (used only for conflict resolving) */
-static private int next_rule_number = 0;
+static private int next_rule_number = 1;
 
 /*
  * Functions
@@ -341,7 +341,9 @@ void add_rule(object(rule) r)
 
   /* !DEBUG */
 
-  r->number = next_rule_number++;
+  r->number = next_rule_number;
+  /* Reserve space for the items generatable from this rule. */
+  next_rule_number += sizeof(r->symbols) + 1;
 
   /* First add the rule to the grammar */
   if (grammar[r->nonterminal]) {
@@ -482,11 +484,15 @@ static private void make_closure(object(kernel) state, int nonterminal)
   if (grammar[nonterminal]) {
     foreach (grammar[nonterminal], object(rule) r) {
       if (!(state->rules[r])) {
+
 	object(item) new_item = item();
 	
 	new_item->r = r;
-	new_item->offset = 0;
+	new_item->item_id = r->number;
 
+	// Not needed, since 0 is the default.
+	// new_item->offset = 0;
+	// state->rules[r] is set by the post-increment above.
 	state->rules[r] = 1;
 
 	state->add_item(new_item);
@@ -512,7 +518,9 @@ static private object(kernel) first_state()
       object(item) i = item();
 
       i->r = r;
-      i->offset = 0;
+      // Not needed since 0 is the default.
+      // i->offset = 0;
+      i->item_id = r->number;
 
       state->add_item(i);
       state->rules[r] = 1;	/* Since this is an item with offset 0 */
@@ -555,6 +563,7 @@ static private object(kernel) do_goto(object(kernel) state, int|string symbol)
 
       new_item->offset = ++offset;
       new_item->r = r = i->r;
+      new_item->item_id = r->number + offset;
 
       new_state->add_item(new_item);
 
diff --git a/lib/modules/LR.pmod/rule.pike b/lib/modules/LR.pmod/rule.pike
index 9a3f7f03ed..0f8c436678 100644
--- a/lib/modules/LR.pmod/rule.pike
+++ b/lib/modules/LR.pmod/rule.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: rule.pike,v 1.3 1998/11/12 01:31:26 grubba Exp $
+ * $Id: rule.pike,v 1.4 1998/11/12 19:45:45 grubba Exp $
  *
  * A BNF-rule.
  *
@@ -8,7 +8,7 @@
 
 //.
 //. File:	rule.pike
-//. RCSID:	$Id: rule.pike,v 1.3 1998/11/12 01:31:26 grubba Exp $
+//. RCSID:	$Id: rule.pike,v 1.4 1998/11/12 19:45:45 grubba Exp $
 //. Author:	Henrik Grubbström (grubba@infovav.se)
 //.
 //. Synopsis:	Implements a BNF rule.
@@ -57,21 +57,9 @@ multiset(string) prefix_tokens = (<>);
 
 //. + number
 //.   Sequence number of this rule (used for conflict resolving)
+//.   Also used to identify the rule.
 int number = 0;
 
-//. + rule_hash
-//.   Hash value used to compare rules.
-string rule_hash;
-
-//. - make_rule_hash
-//.   Compute the rule_hash.
-void make_rule_hash()
-{
-  if (!rule_hash) {
-    rule_hash = sprintf("%O:%O:%O", nonterminal, symbols, action);
-  }
-}
-
 /*
  * Functions
  */
-- 
GitLab