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