X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2Futil%2FGrammar.java;fp=src%2Forg%2Fxwt%2Futil%2FGrammar.java;h=48018c77b1d9cc150fc152dc442032ec4abcc8e5;hb=772b947b9b23de711953d0a1e33cef5f356c442a;hp=678a63a851f0dad2caf6f62c7e27fce4ef4ea9d3;hpb=434205ebc29c9da561a6c1cd4f869cc6d2b9bec4;p=org.ibex.core.git diff --git a/src/org/xwt/util/Grammar.java b/src/org/xwt/util/Grammar.java index 678a63a..48018c7 100644 --- a/src/org/xwt/util/Grammar.java +++ b/src/org/xwt/util/Grammar.java @@ -14,25 +14,28 @@ public abstract class Grammar extends JS { 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); - if (ret == -1) return -1; - Object result = action == null ? + Object result = ret == -1 ? NULL : action == null ? s.substring(start, ret) : action.cloneWithNewParentScope(new JSScope(scope) { public Object get(Object key) throws JSExn { - if (v2.get(key) != null) return v2.get(key); + 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) { } - else if (old instanceof JSArray) { ((JSArray)old).addElement(result); result = old; } - else { JSArray j = new JSArray(); j.addElement(old); j.addElement(result); result = j; } + 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;