projects
/
sbp.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
c1a7dcf
)
add some commenting to GrammarAST
author
adam
<adam@megacz.com>
Tue, 4 Mar 2008 05:09:43 +0000
(
00:09
-0500)
committer
adam
<adam@megacz.com>
Tue, 4 Mar 2008 05:09:43 +0000
(
00:09
-0500)
darcs-hash:
20080304050943
-5007d-
7a4d08ef6bf06a8cdd06dc21bb85edbcf8b06629
.gz
src/edu/berkeley/sbp/meta/GrammarAST.java
patch
|
blob
|
history
diff --git
a/src/edu/berkeley/sbp/meta/GrammarAST.java
b/src/edu/berkeley/sbp/meta/GrammarAST.java
index
ed8fe94
..
e039b37
100644
(file)
--- a/
src/edu/berkeley/sbp/meta/GrammarAST.java
+++ b/
src/edu/berkeley/sbp/meta/GrammarAST.java
@@
-221,10
+221,18
@@
public class GrammarAST {
public abstract Element build(Context cx, NonTerminalNode cnt, boolean dropall);
}
public abstract Element build(Context cx, NonTerminalNode cnt, boolean dropall);
}
+ /** a union, produced by a ( .. | .. | .. ) construct */
private class UnionNode extends ElementNode {
private class UnionNode extends ElementNode {
+
+ /** each component of a union is a sequence */
public Seq[][] sequences;
public Seq[][] sequences;
- public String sep = null;
+
+ /** if the union is a NonTerminal specified as Foo*=..., this is true */
public boolean rep;
public boolean rep;
+
+ /** if the union is a NonTerminal specified as Foo* /ws=..., then this is "ws" */
+ public String sep = null;
+
public UnionNode(Seq seq) { this(new Seq[][] { new Seq[] { seq } }); }
public UnionNode(Seq[][] sequences) { this(sequences, false, null); }
public UnionNode(Seq[][] sequences, boolean rep, String sep) {
public UnionNode(Seq seq) { this(new Seq[][] { new Seq[] { seq } }); }
public UnionNode(Seq[][] sequences) { this(sequences, false, null); }
public UnionNode(Seq[][] sequences, boolean rep, String sep) {
@@
-284,6
+292,7
@@
public class GrammarAST {
}
}
}
}
+ /** a NonTerminal is always a union at the top level */
private class NonTerminalNode extends UnionNode {
public boolean alwaysDrop;
public String name = null;
private class NonTerminalNode extends UnionNode {
public boolean alwaysDrop;
public String name = null;
@@
-296,7
+305,18
@@
public class GrammarAST {
public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return cx.get(name); }
}
public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return cx.get(name); }
}
+ /** a sequence */
private class Seq {
private class Seq {
+ /** elements of the sequence */
+ ElementNode[] elements;
+ /** follow-set, if explicit */
+ ElementNode follow;
+ /** tag to add when building the AST */
+ String tag = null;
+ /** positive conjuncts */
+ HashSet<Seq> and = new HashSet<Seq>();
+ /** negative conjuncts */
+ HashSet<Seq> not = new HashSet<Seq>();
public boolean alwaysDrop = false;
public boolean isDropped(Context cx) {
if (alwaysDrop) return true;
public boolean alwaysDrop = false;
public boolean isDropped(Context cx) {
if (alwaysDrop) return true;
@@
-306,11
+326,6
@@
public class GrammarAST {
return false;
return true;
}
return false;
return true;
}
- HashSet<Seq> and = new HashSet<Seq>();
- HashSet<Seq> not = new HashSet<Seq>();
- ElementNode[] elements;
- ElementNode follow;
- String tag = null;
public Seq(ElementNode e) { this(new ElementNode[] { e }); }
public Seq(ElementNode[] elements) { this(elements, true); }
public Seq(ElementNode[] el, boolean check) {
public Seq(ElementNode e) { this(new ElementNode[] { e }); }
public Seq(ElementNode[] elements) { this(elements, true); }
public Seq(ElementNode[] el, boolean check) {
@@
-413,6
+428,7
@@
public class GrammarAST {
}
}
}
}
+ /** reference to a NonTerminal by name */
private class ReferenceNode extends ElementNode {
public String nonTerminal;
public boolean parenthesized;
private class ReferenceNode extends ElementNode {
public String nonTerminal;
public boolean parenthesized;
@@
-440,6
+456,7
@@
public class GrammarAST {
}
}
}
}
+ /** a literal string */
private class LiteralNode extends ElementNode {
private String string;
private final String thePrefix = prefix;
private class LiteralNode extends ElementNode {
private String string;
private final String thePrefix = prefix;
@@
-461,6
+478,7
@@
public class GrammarAST {
public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return CharAtom.string(string); }
}
public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return CharAtom.string(string); }
}
+ /** an atom (usually a character class) */
private class AtomNode extends ElementNode {
char[][] ranges;
public AtomNode() { this(new char[0][]); }
private class AtomNode extends ElementNode {
char[][] ranges;
public AtomNode() { this(new char[0][]); }
@@
-474,6
+492,7
@@
public class GrammarAST {
}
}
}
}
+ /** a repetition */
private class RepeatNode extends ElementNode {
public ElementNode e, sep;
public final boolean zero, many, max;
private class RepeatNode extends ElementNode {
public ElementNode e, sep;
public final boolean zero, many, max;
@@
-500,6
+519,7
@@
public class GrammarAST {
}
}
}
}
+ /** helper class for syntactic constructs that wrap another construct */
private abstract class ElementNodeWrapper extends ElementNode {
protected ElementNode _e;
public ElementNodeWrapper(ElementNode e) { this._e = e; }
private abstract class ElementNodeWrapper extends ElementNode {
protected ElementNode _e;
public ElementNodeWrapper(ElementNode e) { this._e = e; }
@@
-508,11
+528,13
@@
public class GrammarAST {
public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return _e.build(cx, cnt, dropall); }
}
public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return _e.build(cx, cnt, dropall); }
}
+ /** a backtick node indicating that, when building the AST, the node's children should be inserted here */
private class BacktickNode extends ElementNodeWrapper {
public BacktickNode(ElementNode e) { super(e); }
public boolean isLifted() { return true; }
}
private class BacktickNode extends ElementNodeWrapper {
public BacktickNode(ElementNode e) { super(e); }
public boolean isLifted() { return true; }
}
+ /** negation */
private class TildeNode extends ElementNodeWrapper {
public TildeNode(ElementNode e) { super(e); }
public Atom toAtom(Context cx) { return (Atom)((Topology<Character>)_e.toAtom(cx).complement()); }
private class TildeNode extends ElementNodeWrapper {
public TildeNode(ElementNode e) { super(e); }
public Atom toAtom(Context cx) { return (Atom)((Topology<Character>)_e.toAtom(cx).complement()); }