[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