return new CharRange(new IntegerTopology<CharToken>(new Range.Set(new Range((int)start, (int)end)).complement().intersect(all)));
}
- public static final CharToken left = new CharToken((char)-3, 0, 0);
- public static final CharToken right = new CharToken((char)-4, 0, 0);
- public static final Atom leftBrace = new Atom(new IntegerTopology<CharToken>(-3)) { public String toString() { return "{"; } };
- public static final Atom rightBrace = new Atom(new IntegerTopology<CharToken>(-4)) { public String toString() { return "}"; } };
+ public static CharToken left(int row, int col) { return new CharToken((char)9998, 0, 0) { public String toString() { return "{"; } }; }
+ public static CharToken right(int row, int col) { return new CharToken((char)9999, 0, 0) { public String toString() { return "}"; } }; }
+ public static final Atom leftBrace = new Atom(new IntegerTopology<CharToken>(9998)) { public String toString() { return "{"; } };
+ public static final Atom rightBrace = new Atom(new IntegerTopology<CharToken>(9999)) { public String toString() { return "}"; } };
private static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE));
public static final Atom any = new CharRange(new IntegerTopology<CharToken>(all));
return nonTerminal("braced"+(anon++),
new PreSequence[][] {
new PreSequence[] {
- new PreSequence(leftBrace()),
- p,
- new PreSequence(rightBrace())
+ new PreSequence(new Element[] { leftBrace(),
+ p.buildUnion(),
+ rightBrace() })
}
},
false,
public TestCase testcase(String input, Union grammar) throws IOException {
return new TestCase(input, new String[0], grammar, false); }
public TestCase tibcase(String input, Union grammar) throws IOException {
- return new TestCase(input, new String[0], grammar, false); }
+ return new TestCase(input, new String[0], grammar, true); }
public MetaGrammar grammar(Object[] o) { return this; }
public Object walk(String tag, Object[] args) {
- if ("grammar".equals(tag)) return done("s");
+ if ("grammar".equals(tag)) {
+ System.out.println("\n" + this + "\n");
+ return done("s");
+ }
else return super.walk(tag, args);
}
}
public Tib(String s) throws IOException, Invalid { this(new StringReader(s)); }
public Tib(Reader r) throws IOException, Invalid { this(new BufferedReader(r)); }
public Tib(InputStream is) throws IOException, Invalid { this(new BufferedReader(new InputStreamReader(is))); }
- public Tib(BufferedReader br) throws IOException, Invalid { cur = parse(br); }
+ public Tib(BufferedReader br) throws IOException, Invalid {
+ cur = parse(br);
+ System.out.println("\rparsing: \"" + cur.toString(0, -1) + "\"");
+ }
private Block cur;
private String s = null;
int pos = 0;
int spos = 0;
+ int _row = 0;
+ int _col = 0;
public CharToken next() throws IOException {
+ if (cur==null) return null;
+ if (s != null) {
+ if (spos < s.length()) {
+ char c = s.charAt(spos++);
+ if (c=='\n') { _row++; _col = 0; }
+ else _col++;
+ return new CharToken(c, _row, _col);
+ }
+ s = null;
+ }
if (pos >= cur.size()) {
pos = cur.iip+1;
cur = cur.parent;
- return CharToken.right;
- }
-
- if (s != null) {
- if (spos < s.length())
- return new CharToken(s.charAt(spos++), 0, 0);
- s = null;
+ if (cur==null) return null;
+ return CharToken.right(_row, _col);
}
Object o = cur.child(pos++);
if (o instanceof String) {
s = (String)o;
return next();
}
+ if (o instanceof Block) {
+ Block b = (Block)o;
+ _row = b.row;
+ _col = b.col;
+ }
if (((Block)o).isLiteral()) {
spos = 0;
s = ((Block.Literal)o).text();
}
cur = (Block)o;
pos = 0;
- return CharToken.left;
+ return CharToken.left(_row, _col);
}
public static Block parse(BufferedReader br) throws Invalid, IOException {
// s ::= () => s0
//}
-//tibcase {
-// input "
-// hello
-// there
-// how
-// { are }
-//";
-//
-// s ::= ws S ws
-// ws !::= w*
-// S ::= { Hello }
-// Hello ::= "hello" { "there" "how" { "are" } }
-//}
+tibcase {
+ input
+"
+ hello
+ there
+ how
+ { are }
+";
+
+ s ::= { Hello }
+ w ::= " " | "\n"
+ ws !::= w**
+ Hello ::= "hello" ws { "there" ws "how" ws { { "are" } ws } }
+}
testcase {
input "ab c";