+++ /dev/null
-package org.ibex.util;
-
-import org.ibex.js.*;
-
-public abstract class Grammar extends JS {
-
- public JS action = null;
-
- // means we call()ed a Grammar that hasn't been bound to a scope yet
- public Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn {
- throw new Error("this should never happen");
- }
-
- private static Object NULL = new Object();
-
- public abstract int match(String s, int start, Hash v, JSScope scope) throws JSExn;
- public int matchAndWrite(final String s, final int start, Hash v, JSScope scope, String key) throws JSExn {
- final Hash v2 = new Hash();
- final int ret = match(s, start, v2, scope);
- Object result = ret == -1 ? NULL : action == null ?
- s.substring(start, ret) :
- JS.cloneWithNewParentScope(action, new JSScope(scope) {
- public Object get(Object key) throws JSExn {
- Object val = v2.get(key);
- if (val == NULL) return null;
- if (val != null) return val;
- if (key.equals("whole")) return s.substring(start, ret);
- return super.get(key);
- }
- }).call(null, null, null, null, 0);
- if (key != null) {
- Object old = v.get(key);
- if (old == null || old == NULL) { }
- else if (old instanceof JSArray) { if (result != NULL) { ((JSArray)old).addElement(result); result = old; } }
- else if (result != NULL) { JSArray j = new JSArray(); j.addElement(old); j.addElement(result); result = j; }
- v.put(key, result);
- }
- return ret;
- }
-
- public static class Alternative extends Grammar {
- private Grammar r1, r2;
- public Alternative(Grammar r1, Grammar r2) { this.r1 = r1; this.r2 = r2; }
- public int match(String s, int start, Hash v, JSScope r) throws JSExn {
- int s1 = r1.match(s, start, v, r);
- if (s1 != -1) return s1;
- int s2 = r2.match(s, start, v, r);
- if (s2 != -1) return s2;
- return -1;
- }
- }
-
- public static class Juxtaposition extends Grammar {
- private Grammar r1, r2;
- public Juxtaposition(Grammar r1, Grammar r2) { this.r1 = r1; this.r2 = r2; }
- public int match(String s, int start, Hash v, JSScope r) throws JSExn {
- int s1 = r1.match(s, start, v, r);
- if (s1 == -1) return -1;
- int s2 = r2.match(s, s1, v, r);
- if (s2 == -1) return -1;
- return s2;
- }
- }
-
- public static class Repetition extends Grammar {
- private Grammar r1;
- private int min, max;
- public Repetition(Grammar r1, int min, int max) { this.r1 = r1; this.min = min; this.max = max; }
- public int match(String s, int start, Hash v, JSScope r) throws JSExn {
- int i;
- for(i=0; i<max; i++) {
- start = r1.match(s, start, v, r);
- if (start == -1) return -1;
- }
- if (i < min) return -1;
- return start;
- }
- }
-
- public static class Literal extends Grammar {
- String str;
- public Literal(String str) { this.str = str; }
- public int match(String s, int start, Hash v, JSScope r) {
- if (!s.regionMatches(start, str, 0, str.length())) return -1;
- return start + str.length();
- }
- }
-
- public static class Range extends Grammar {
- char min, max;
- public Range(char min, char max) { this.min = min; this.max = max; }
- public int match(String s, int start, Hash v, JSScope r) throws JSExn {
- if (!(s.charAt(start) >= min && s.charAt(start) <= max)) return -1;
- return start + 1;
- }
- }
-
- public static class Reference extends Grammar {
- String key;
- public Reference(String key) { this.key = key; }
- public int match(String s, int start, Hash v, JSScope scope) throws JSExn {
- return ((Grammar)scope.get(key)).matchAndWrite(s, start, v, scope, key);
- }
- }
-}
// relink clause")
package org.ibex.util;
-import org.ibex.js.*;
import java.io.*;
import java.util.*;
import java.net.*;
logstream.println(classname + colorize(levelcolor, bright, str));
}
- public static void recursiveLog(String indent, String name, Object o) throws JSExn {
- if (!name.equals("")) name += " : ";
-
- if (o == null) {
- JS.log(indent + name + "<null>");
-
- } else if (o instanceof JSArray) {
- JS.log(indent + name + "<array>");
- JSArray na = (JSArray)o;
- for(int i=0; i<na.length(); i++)
- recursiveLog(indent + " ", i + "", na.elementAt(i));
-
- } else if (o instanceof JS) {
- JS.log(indent + name + "<object>");
- JS s = (JS)o;
- Enumeration e = s.keys();
- while(e.hasMoreElements()) {
- Object key = e.nextElement();
- if (key != null)
- recursiveLog(indent + " ", key.toString(),
- (key instanceof Integer) ?
- s.get(((Integer)key)) : s.get(key.toString()));
- }
- } else {
- JS.log(indent + name + o);
-
- }
- }
-
}