X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammar.java;h=f8d9aea44ad7e9541d3c09baeacab9ec32c7bc65;hb=0620c2d97d6df986d74dbe13160afb1435096431;hp=2340de21b89829fe7c43fe02d89ee74d54958361;hpb=a7ed3694a03bf9fe30e3274775c0646554e99bd4;p=sbp.git
diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java
index 2340de2..f8d9aea 100644
--- a/src/edu/berkeley/sbp/meta/MetaGrammar.java
+++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java
@@ -1,3 +1,5 @@
+// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license
+
package edu.berkeley.sbp.meta;
import edu.berkeley.sbp.util.*;
import edu.berkeley.sbp.*;
@@ -10,7 +12,13 @@ import java.lang.reflect.*;
import java.io.*;
public class MetaGrammar {
-
+
+ /** create a grammar corresponding to the SBP metagrammar (meta.g) */
+ public static Union newInstance() {
+ return Grammar.create(MetaGrammar.meta, "s", new MetaGrammarBindings());
+ }
+
+ /** Used to rebuild MetaGrammar.java, and not for much else */
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("usage: java " + MetaGrammar.class.getName() + " grammarfile.g com.yourdomain.package.ClassName");
@@ -32,13 +40,10 @@ public class MetaGrammar {
out.append("\n // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED\n");
- Tree t = MetaGrammarTree.meta;
- Union u = MetaGrammar.make(t, "s");
+ Tree t = MetaGrammar.meta;
+ Union u = Grammar.create(t, "s", new MetaGrammarBindings());
- System.err.println();
- System.err.println("== parsing with parsed grammar =================================================================================");
t = new CharParser((Union)u).parse(new FileInputStream(args[0])).expand1();
- System.out.println(t.toPrettyString());
t.toJava(out);
out.append("\n // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED\n");
@@ -52,144 +57,755 @@ public class MetaGrammar {
p.flush();
os.close();
}
-
- public static class TreeBindable {
- private Bindable _bindable;
- public TreeBindable(Object o) { this(Bindable.create(o)); }
- public TreeBindable(Bindable b) { this._bindable = b; }
+ static final Tree meta;
- private int[] buildSequence(Production p) {
- return p.buildSequence(_bindable);
- }
+ static {
+ Tree t = null;
+ try {
+ t =
- public String getName() { return _bindable.getSimpleName(); }
- public bind getBind() { return (bind)_bindable.getAnnotation(bind.class); }
- public bind.as getBindAs() { return (bind.as)_bindable.getAnnotation(bind.as.class); }
- public String toString() { return _bindable.getSimpleName(); }
- public boolean isRaw() { return _bindable.isAnnotationPresent(bind.raw.class); }
-
- public boolean isCompatible(Production p) {
- bind.as t = getBindAs();
- bind b = getBind();
-
- if (t != null &&
- (t.value().equals(p.tag)))
- return buildSequence(p)!=null;
-
- if (t != null &&
- ((t.value().equals("") && getName().equals(p.tag))))
- return buildSequence(p)!=null;
- if (b != null && getName().equals(p.tag))
- return buildSequence(p)!=null;
-
- if (t != null &&
- (t.value().equals(p.tag)))
- return buildSequence(p)!=null;
- if (t != null &&
- ((t.value().equals("") && getName().equals(p.tag))))
- return buildSequence(p)!=null;
- if (b != null && getName().equals(p.tag))
- return buildSequence(p)!=null;
-
- return false;
- }
- public Sequence makeSequence(final Production p) {
-
- if (_bindable.getArgTypes().length > 0 &&
- _bindable.getArgTypes()[0] == Input.Region.class) {
- Functor func = new Functor() {
- public Object invoke(final Input.Region region) {
- return
- new TreeBindableReducer(buildSequence(p),
- _bindable,
- isRaw()) {
- public Object invoke(Iterable> t) {
- if (_israw) return _bindable.impose(new Object[] { t });
- ArrayList ret = new ArrayList();
- ret.add(region);
- for(Tree tc : t) {
- if (tc.head() != null && tc.head() instanceof Functor)
- ret.add(((Tree.TreeFunctor