[Commit] mint/src parser_generator.5c,1.1,1.2
James LaMar
commit at keithp.com
Wed Dec 1 10:19:29 PST 2004
Committed by: jlamar
Update of /local/src/CVS/mint/src
In directory home.keithp.com:/tmp/cvs-serv22982
Modified Files:
parser_generator.5c
Log Message:
Memoized inner loop of closure.
Index: parser_generator.5c
===================================================================
RCS file: /local/src/CVS/mint/src/parser_generator.5c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- parser_generator.5c 29 Nov 2004 14:53:28 -0000 1.1
+++ parser_generator.5c 1 Dec 2004 18:19:27 -0000 1.2
@@ -244,30 +244,42 @@
int[int][int] goto_memo;
+ int[int] gema_gema = {};
+ int gema(int i) {
+ if(hash_test(gema_gema, i)) {
+ return gema_gema[i];
+ } else {
+ int items = i;
+ item itm = imap_rmap(&item_map, i);
+ if(dim(itm.r.production) > itm.dot &&
+ ((g.nonterminals & itm.r.production[itm.dot]) != 0)) {
+ rule[*] rules = g.rules[itm.r.production[itm.dot]];
+ int[*] prtmp = last(itm.r.production, itm.dot + 1);
+ int[*] pr = push(prtmp, itm.next);
+ int[*] first_list = first(&g, pr);
+ for(int j = 0; j < dim(rules); j++) {
+ for(int k = 0; k < dim(first_list); k++) {
+ item it = {
+ r = rules[j],
+ dot = 0,
+ next = first_list[k],
+ };
+ items = items | imap_get(&item_map, it);
+ }
+ }
+ }
+ gema_gema[i] = items;
+ return items;
+ }
+ }
+
int closure(int items) {
int last_items = items;
do {
last_items = items;
int[*] item_list = bset_elements(items);
for(int i = 0; i < dim(item_list); i++) {
- item itm = imap_rmap(&item_map, item_list[i]);
- if(dim(itm.r.production) > itm.dot &&
- ((g.nonterminals & itm.r.production[itm.dot]) != 0)) {
- rule[*] rules = g.rules[itm.r.production[itm.dot]];
- int[*] prtmp = last(itm.r.production, itm.dot + 1);
- int[*] pr = push(prtmp, itm.next);
- int[*] first_list = first(&g, pr);
- for(int j = 0; j < dim(rules); j++) {
- for(int k = 0; k < dim(first_list); k++) {
- item it = {
- r = rules[j],
- dot = 0,
- next = first_list[k],
- };
- items = items | imap_get(&item_map, it);
- }
- }
- }
+ items |= gema(item_list[i]);
}
} while(items != last_items);
return items;
More information about the Commit
mailing list