X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;h=da0204a157a8642b9588cb3609f18fe1cacebd47;hp=ca3b7fefe5376de900393bccf1c816bd55af1b04;hb=df76fcb56242a90011500ab89092d2108350a8ab;hpb=fa49c4e86eaabb1fad07bcfdfb004aa1fc0dea8a diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index ca3b7fe..da0204a 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -9,20 +9,20 @@ import java.lang.annotation.*; import java.lang.reflect.*; import java.io.*; +/** The java classes typically used to represent a parsed grammar AST */ public class MetaGrammarBindings { - public static @bind class Grammar { - public NonTerminal get(String s) { - for(NonTerminal nt : nonterminals) - if (nt.name.equals(s)) return nt; - return null; - } - public @bind.arg NonTerminal[] nonterminals; + + /** A grammar (a set of nonterminals) */ + public static class Grammar extends HashMap { + public @bind Grammar(NonTerminal[] nonterminals) { + for(NonTerminal nt : nonterminals) this.put(nt.name, nt); } public String toString() { String ret = "[ "; - for(NonTerminal nt : nonterminals) ret += nt + ", "; + for(NonTerminal nt : values()) ret += nt + ", "; return ret + " ]"; } } + public abstract static class Un extends El { public Seq[][] sequences; public void build(MetaGrammar.Context cx, Union u) { @@ -45,15 +45,25 @@ public class MetaGrammarBindings { } } } + public static class NonTerminal extends Un { + public boolean rep; public String name = null; - public @bind NonTerminal(@bind.arg String name, - @bind.arg Seq[][] sequences) { + public String sep = null; + public @bind NonTerminal(@bind.arg String name, @bind.arg Seq[][] sequences) { this(name, sequences, false); } + public NonTerminal(String name, Seq[][] sequences, boolean rep) { this(name, sequences, rep, null); } + public NonTerminal(String name, Seq[][] sequences, boolean rep, String sep) { this.name = name; this.sequences = sequences; + this.rep = rep; + this.sep = sep; } public Element build(MetaGrammar.Context cx) { return cx.get(name); } } + public static @bind.as("=") NonTerminal go(@bind.arg String name, @bind.arg Seq[][] sequences) { return new NonTerminal(name, sequences, true); } + public static @bind.as("=") NonTerminal go(@bind.arg String name, @bind.arg String sep, @bind.arg Seq[][] sequences) { + return new NonTerminal(name, sequences, true, sep); + } public static class AnonUn extends Un { public @bind.as("(") AnonUn(Seq[][] sequences) { @@ -66,10 +76,9 @@ public class MetaGrammarBindings { } } - //public static @bind.as void range(char c) { } public static class Range { - public @bind.as("range") Range(char only) { first = only; last = only; } - public @bind.as("-") Range(char first, char last) { this.first = first; this.last = last; } + public @bind Range(char only) { first = only; last = only; } + public @bind Range(char first, char last) { this.first = first; this.last = last; } public char first; public char last; } @@ -172,27 +181,26 @@ public class MetaGrammarBindings { return ret; } } - public static @bind.as("&") Seq and(Seq s, El[] elements) { return s.and(seq(elements)); } - public static @bind.as("&~") Seq andnot(Seq s, El[] elements) { return s.andnot(seq(elements)); } + public static @bind.as("&") Seq and2(Seq s, Seq a) { return s.and(a); } + public static @bind.as("&~") Seq andnot2(Seq s, Seq a) { return s.andnot(a); } public static @bind.as("->") Seq arrow(Seq s, El e) { return s.follow(e); } public static @bind.as("::") Seq tag(String tagname, Seq s) { return s.tag(tagname); } public static @bind.as("/") Seq slash(Seq s, El e) { return s.separate(e); } - public static @bind.as("ps") Seq seq(El[] elements) { return new Seq(elements); } + public static Seq seq(El[] elements) { return new Seq(elements); } + public static @bind.as("Elements") Seq seq2(El[] elements) { return new Seq(elements); } public static @bind.as Seq psx(Seq s) { return s; } public static @bind.as(":") El colon(String s, El e) { return new Label(s, e); } public static @bind.as(")") void close(String foo) { throw new Error("not supported"); } public static @bind.as("()") El epsilon() { return new Constant(Union.epsilon); } - public static @bind.as("nonTerminal") class NonTerminalReference extends El { + public static @bind class NonTerminalReference extends El { public @bind.arg String nonTerminal; - public Element build(MetaGrammar.Context cx) { - return cx.get(nonTerminal); - } + public Element build(MetaGrammar.Context cx) { return cx.get(nonTerminal); } } - public static class StringLiteral extends Constant { - public @bind.as("literal") StringLiteral(String string) { super(CharRange.string(string)); } + public static class Literal extends Constant { + public @bind Literal(@bind.arg String string) { super(CharRange.string(string)); } public boolean drop() { return true; } } @@ -210,7 +218,17 @@ public class MetaGrammarBindings { public static @bind.as("{") class XTree extends El { public @bind.arg Seq body; public Element build(MetaGrammar.Context cx) { - throw new Error(); + Union u = new Union(); + Sequence s = body.build(cx, u, false); + Union u2 = new Union(); + u2.add(Sequence.singleton(new Element[] { + CharRange.leftBrace, + cx.get("ws"), + u, + cx.get("ws"), + CharRange.rightBrace + }, 2)); + return u2; } } @@ -268,12 +286,12 @@ public class MetaGrammarBindings { //public static @bind.as("(") El subexpression(Seq[][] rhs) { return new NonTerminal(rhs); } - public static @bind.as("Word") String word(String s) { return s; } - public static @bind.as("Quoted") String quoted(String s) { return s; } - public static @bind.as("escaped") String c(char c) { return c+""; } - public static @bind.as("\"\"") String emptystring() { return ""; } - public static @bind.as("\n") String retur() { return "\n"; } - public static @bind.as("\r") String lf() { return "\r"; } + public static @bind.as("Word") String word(String s) { return s; } + public static @bind.as("Quoted") String quoted(String s) { return s; } + public static @bind.as("escaped") String c(char c) { return c+""; } + public static @bind.as("EmptyString") String emptystring() { return ""; } + public static @bind.as("\n") String retur() { return "\n"; } + public static @bind.as("\r") String lf() { return "\r"; } static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } static Atom infer(Topology t) { return new CharRange(new CharTopology(t)); }