X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=f210673f9162590146229a03021510937ed6cc01;hp=234673f037200042a873b5088f71edc81995c8be;hb=162ac7f4e4c0bdaf4fff995dceb3aa232c0cf8c7;hpb=7ad1e0ae9ef7ee8ba5e3cc1d98b3545b92f48298 diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 234673f..f210673 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -27,32 +27,47 @@ public class MetaGrammar extends ReflectiveWalker { // MetaGrammar ////////////////////////////////////////////////////////////////////////////// - public Object _star_(Element r) { return new Rep(r, null, false, true); } + public Object _star_(Element r) { return new Rep(r, null, false, true).build(); } public Element epsilon(Object o, Object b) { return epsilon; } public Element _rightparen_(Object e) { return SELF; } public PreSequence _amp_(PreSequence p, Object[] o) { return p.and(new PreSequence(o, null, true).buildSequence(null, true, false)); } - public PreSequence _amp__tilde_(PreSequence p, Object[] o) { return p.not(new PreSequence(o, null, true).buildSequence(null, true, false)); } + public PreSequence _amp__tilde_(PreSequence p, Object[] o) { return p.not(new PreSequence(o, null, true).buildSequence(null, true, false)); } public Element _bang_(Element r) { return r; } public Object care(String s) { return new MyLift(s); } public Object _caret_(String s) { return new MyLift(s); } public Object _leftparen__rightparen_() { return epsilon; } - public Union nonTerminal(String s) { return nonTerminalX(s, false, false); } - public Union nonTerminalX(String s, boolean synthetic, boolean dropAll) { - Union n = s.equals(startSymbol) ? g : nt.get(s); - if (n == null) nt.put(s, n = new Union(s, synthetic)); + public Union nonTerminal(String s) { return nonTerminal(s, null, false, false); } + public Union _colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminal(s, p, false, false); } + public Union _bang__colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminal(s, p, false, true); } + public Union _colon__colon__equals_(boolean q, String s, PreSequence[][] p) { return nonTerminal(s, p, false, q); } + public Object _leftparen_(PreSequence[][] p) { return nonTerminal("anon"+(anon++), p, false, false); } + public Union nonTerminal(String str, PreSequence[][] s, boolean synthetic, boolean dropAll) { + Union n = str.equals(startSymbol) ? g : nt.get(str); + if (n == null) nt.put(str, n = new Union(str, synthetic)); if (dropAll) this.dropAll.add(n); + if (s==null) return n; + HashSet seqs = new HashSet(); + for(int i=0; i temp = new HashSet(); + for(PreSequence pre : s[i]) { + pre.not.addAll(seqs); + Sequence seq = pre.buildSequence(n, false, dropAll); + temp.add(seq); + n.add(seq); + } + seqs.addAll(temp); + } return n; } - public Union _colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminalX(s, p, false, false); } - public Union _bang__colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminalX(s, p, false, true); } - public Union _colon__colon__equals_(boolean q, String s, PreSequence[][] p) { return nonTerminalX(s, p, false, q); } - public Object _leftparen_(PreSequence[][] p) { return nonTerminalX("anon"+(anon++), p, false, false); } + + public Object _backslash__leftbrace_(String s) { return SELF; } public Object _leftbrace_(String s) { return SELF; } - public Object _plus_(final Element r) { return new Rep(r, null, false, false); } + public Object _plus_(final Element r) { return new Rep(r, null, false, false).build(); } public Object[] _slash_(Object[] o, Object sep) { if (o.length <= 1) return o; Object[] ret = new Object[o.length * 2 - 1]; @@ -63,10 +78,10 @@ public class MetaGrammar extends ReflectiveWalker { } return ret; } - public Object _plus__slash_(final Element r, Object s) { return new Rep(r, (Element)s, false, false); } - public Object _star__slash_(final Element r, Object s) { return new Rep(r, (Element)s, false, true); } - public Object _star__star_(final Element r) { return new Rep(r, null, true, true); } - public Object _plus__plus_(final Element r) { return new Rep(r, null, true, false); } + public Object _plus__slash_(final Element r, Object s) { return new Rep(r, (Element)s, false, false).build(); } + public Object _star__slash_(final Element r, Object s) { return new Rep(r, (Element)s, false, true).build(); } + public Object _star__star_(final Element r) { return new Rep(r, null, true, true).build(); } + public Object _plus__plus_(final Element r) { return new Rep(r, null, true, false).build(); } public Element _question_(final Element r) { return Repeat.maybe(r); } public MetaGrammar gram(Object o, MetaGrammar g, Object o2) { return g; } public MetaGrammar grammar(Object[] o) { return this; } @@ -110,24 +125,6 @@ public class MetaGrammar extends ReflectiveWalker { return ret; } - public Union nonTerminalX(String str, PreSequence[][] s, boolean synthetic, boolean dropAll) { - Union n = nonTerminalX(str, synthetic, dropAll); - if (s == null || s.length==0) { n.add(Sequence.empty); return n; } - HashSet seqs = new HashSet(); - for(int i=0; i temp = new HashSet(); - for(PreSequence pre : s[i]) { - pre.not.addAll(seqs); - Sequence seq = pre.buildSequence(n, false, dropAll); - temp.add(seq); - n.add(seq); - } - seqs.addAll(temp); - } - return n; - } - public String stringify(String s) { return StringUtil.unescapify(s); } public char unescape(char x, char c) { return unescape(c); } public char unescape(char c) { return StringUtil.unescapify("\\"+c).charAt(0); } @@ -182,11 +179,9 @@ public class MetaGrammar extends ReflectiveWalker { for(int i=0; i