You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by mr...@apache.org on 2005/08/26 07:46:58 UTC

svn commit: r240168 [20/30] - in /struts/sandbox/trunk/ti: ./ core/src/java/org/apache/ti/ core/src/java/org/apache/ti/config/ core/src/java/org/apache/ti/config/mapper/ core/src/java/org/apache/ti/core/ core/src/java/org/apache/ti/core/factory/ core/s...

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/ParsedExpression.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/ParsedExpression.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/ParsedExpression.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/ParsedExpression.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el;
+
+import org.apache.ti.util.internal.InternalStringBuilder;
+import org.apache.ti.util.logging.Logger;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ *
+ */
+public class ParsedExpression {
+
+    private static Logger LOGGER = Logger.getInstance(ParsedExpression.class);
+
+    /* cache the debug status; this needs to be _fast_ */
+    private static final boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
+    private static final String EMPTY_STRING = "";
+
+    private ArrayList/*<Term>*/ _terms = new ArrayList/*<Term>*/(3);
+    private boolean _isExpression = false;
+    private boolean _containsExpression = false;
+    private ExpressionTerm _atomicExpression = null;
+    private Term[] _termArray = null;
+    private String _exprStr;
+
+    public void seal() {
+        _termArray = new Term[_terms.size()];
+
+        InternalStringBuilder buf = new InternalStringBuilder();
+        for (int i = 0; i < _terms.size(); i++) {
+            Term t = (Term) _terms.get(i);
+            t.seal();
+
+            if (t instanceof ExpressionTerm) {
+                if (_terms.size() == 1) {
+                    _atomicExpression = (ExpressionTerm) _terms.get(0);
+                    _isExpression = true;
+                }
+                _containsExpression = true;
+            } else if (t instanceof LiteralTerm) {
+                String lit = t.getExpressionString();
+                if (lit != null && lit.indexOf("{") > -1)
+                    _containsExpression = true;
+            }
+
+            _termArray[i] = (Term) _terms.get(i);
+            buf.append(t.getExpressionString());
+        }
+        _exprStr = buf.toString();
+    }
+
+    public boolean isExpression() {
+        return _isExpression;
+    }
+
+    public boolean containsExpression() {
+        return _containsExpression;
+    }
+
+    public void addTerm(Term term) {
+        _terms.add(term);
+    }
+
+    public int getTokenCount() {
+        return _terms.size();
+    }
+
+    public Term getTerm(int i) {
+        assert _termArray != null;
+        assert i > 0 && i < _termArray.length;
+
+        return _termArray[i];
+    }
+
+    public ExpressionTerm getAtomicExpressionTerm() {
+        return _atomicExpression;
+    }
+
+    public Object evaluate(NetUIVariableResolver vr) {
+        if (DEBUG_ENABLED)
+            LOGGER.debug("evaluate expression: " + _exprStr);
+
+        if (_isExpression) {
+            if (DEBUG_ENABLED)
+                LOGGER.debug("atoimc expression");
+
+            return _atomicExpression.evaluate(vr);
+        } else {
+            InternalStringBuilder buf = new InternalStringBuilder();
+
+            for (int i = 0; i < _terms.size(); i++) {
+                if (DEBUG_ENABLED)
+                    LOGGER.debug("term[" + i + "]: " + _termArray[i].getClass().getName() +
+                            " expression string: " + _termArray[i].getExpressionString());
+
+                Object result = _termArray[i].evaluate(vr);
+
+                buf.append(result != null ? result.toString() : EMPTY_STRING);
+            }
+
+            return buf.toString();
+        }
+    }
+
+    public void update(Object value, NetUIVariableResolver vr) {
+        if (!_isExpression) {
+            String msg = "The expression can not be updated because it is not atomic.";
+            if (LOGGER.isErrorEnabled())
+                LOGGER.error(msg);
+            throw new RuntimeException(msg);
+        }
+
+        _atomicExpression.update(value, vr);
+    }
+
+    public String changeContext(String oldContext, String newContext, Object index) {
+        if (!_isExpression) {
+            String msg = "The expression can not change context because it is not atomic.";
+
+            if (LOGGER.isErrorEnabled())
+                LOGGER.error(msg);
+
+            throw new RuntimeException(msg);
+        }
+
+        return _atomicExpression.changeContext(oldContext, newContext, index);
+    }
+
+    public String qualify(String contextName) {
+        /* todo: could check to see if first term is literal */
+
+        return "{" + contextName + "." + getExpressionString() + "}";
+    }
+
+    // only call on atomic expressions
+    public String getExpressionString() {
+        if (_isExpression)
+            return _atomicExpression.getExpressionString();
+        else
+            return _exprStr;
+    }
+
+    public String toString() {
+        InternalStringBuilder builder = new InternalStringBuilder();
+        for (Iterator i = _terms.iterator(); i.hasNext();) {
+            Term term = (Term) i.next();
+            builder.append(term.toString());
+        }
+        return builder.toString();
+    }
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/Term.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/Term.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/Term.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/Term.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el;
+
+/**
+ *
+ */
+public interface Term {
+
+    public Object evaluate(NetUIVariableResolver vr);
+
+    public String getExpressionString();
+
+    public void seal();
+}
+   

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParser.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParser.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParser.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParser.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,497 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+import org.apache.ti.script.el.ExpressionTerm;
+import org.apache.ti.script.el.LiteralTerm;
+import org.apache.ti.script.el.ParsedExpression;
+import org.apache.ti.script.el.Term;
+import org.apache.ti.script.el.tokens.ArrayIndexToken;
+import org.apache.ti.script.el.tokens.ContextToken;
+import org.apache.ti.script.el.tokens.ExpressionToken;
+import org.apache.ti.script.el.tokens.IdentifierToken;
+import org.apache.ti.script.el.tokens.MapKeyToken;
+
+public class NetUIELParser
+        implements NetUIELParserConstants {
+
+    public static void main(String[] args)
+            throws Exception {
+        NetUIELParser parser = new NetUIELParser(System.in);
+        parser.parse();
+    }
+
+// 3.
+    final public ParsedExpression parse() throws ParseException {
+        Token t = null;
+        ParsedExpression pe = new ParsedExpression();
+        Term term = null;
+        label_1:
+        while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case NON_EXPRESSION_TEXT:
+                case START_EXPRESSION:
+                case ESCAPED_START_EXPRESSION:
+                    ;
+                    break;
+                default:
+                    jj_la1[0] = jj_gen;
+                    break label_1;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case NON_EXPRESSION_TEXT:
+                    term = parseLiteralTerm();
+                    pe.addTerm(term);
+                    break;
+                case START_EXPRESSION:
+                    jj_consume_token(START_EXPRESSION);
+                    term = parseExpression();
+                    jj_consume_token(END_EXPRESSION);
+                    pe.addTerm(term);
+                    break;
+                case ESCAPED_START_EXPRESSION:
+                    jj_consume_token(ESCAPED_START_EXPRESSION);
+                    term = parseExpression();
+                    jj_consume_token(END_EXPRESSION);
+                    pe.addTerm(new LiteralTerm("\\"));
+                    pe.addTerm(term);
+                    break;
+                default:
+                    jj_la1[1] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+            }
+        }
+        jj_consume_token(0);
+        {
+            if (true) return pe;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public LiteralTerm parseLiteralTerm() throws ParseException {
+        Token t = null;
+        LiteralTerm ls = null;
+        t = jj_consume_token(NON_EXPRESSION_TEXT);
+        ls = new LiteralTerm(t.image);
+        {
+            if (true) return ls;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public ExpressionTerm parseExpression() throws ParseException {
+        ExpressionTerm expr = new ExpressionTerm();
+        ExpressionToken eTok = null;
+        eTok = Context();
+        expr.addToken(eTok);
+        label_2:
+        while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case DOT:
+                case LBRACKET:
+                    ;
+                    break;
+                default:
+                    jj_la1[2] = jj_gen;
+                    break label_2;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case DOT:
+                    jj_consume_token(DOT);
+                    eTok = ExprIdentifier();
+                    break;
+                default:
+                    jj_la1[3] = jj_gen;
+                    if (jj_2_1(2)) {
+                        eTok = MapKey();
+                    } else {
+                        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                            case LBRACKET:
+                                eTok = ArrayIndex();
+                                break;
+                            default:
+                                jj_la1[4] = jj_gen;
+                                jj_consume_token(-1);
+                                throw new ParseException();
+                        }
+                    }
+            }
+            {
+                expr.addToken(eTok);
+            }
+        }
+        expr.seal();
+        {
+            if (true) return expr;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public ExpressionToken Context() throws ParseException {
+        Token t = null;
+        ExpressionToken eTok = null;
+        t = jj_consume_token(IDENTIFIER);
+//System.out.println("** Parser found context: " + t.image);
+        eTok = new ContextToken(t.image);
+        {
+            if (true) return eTok;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public ExpressionToken ExprIdentifier() throws ParseException {
+        Token t = null;
+        ExpressionToken eTok = null;
+        t = jj_consume_token(IDENTIFIER);
+//System.out.println("** Parser found identifier: " + t.image);
+        eTok = new IdentifierToken(t.image);
+        {
+            if (true) return eTok;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+// handle text inside of map braces as ["..."] or ['...']
+    final public ExpressionToken MapKey() throws ParseException {
+        Token t = null;
+        ExpressionToken eTok = null;
+        jj_consume_token(LBRACKET);
+        t = jj_consume_token(STRING_LITERAL);
+        jj_consume_token(RBRACKET);
+        eTok = new MapKeyToken(t.image);
+        {
+            if (true) return eTok;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public ExpressionToken ArrayIndex() throws ParseException {
+        Token t = null;
+        ExpressionToken eTok = null;
+        jj_consume_token(LBRACKET);
+        t = jj_consume_token(INTEGER);
+        jj_consume_token(RBRACKET);
+//System.out.println("** Parser found array index: " + t.image);
+        eTok = new ArrayIndexToken(t.image);
+        {
+            if (true) return eTok;
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final private boolean jj_2_1(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        boolean retval = !jj_3_1();
+        jj_save(0, xla);
+        return retval;
+    }
+
+    final private boolean jj_3_1() {
+        if (jj_3R_3()) return true;
+        if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+        return false;
+    }
+
+    final private boolean jj_3R_3() {
+        if (jj_scan_token(LBRACKET)) return true;
+        if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+        if (jj_scan_token(STRING_LITERAL)) return true;
+        if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+        return false;
+    }
+
+    public NetUIELParserTokenManager token_source;
+    SimpleCharStream jj_input_stream;
+    public Token token, jj_nt;
+    private int jj_ntk;
+    private Token jj_scanpos, jj_lastpos;
+    private int jj_la;
+    public boolean lookingAhead = false;
+    private boolean jj_semLA;
+    private int jj_gen;
+    final private int[] jj_la1 = new int[5];
+    static private int[] jj_la1_0;
+
+    static {
+        jj_la1_0();
+    }
+
+    private static void jj_la1_0() {
+        jj_la1_0 = new int[]{0xe, 0xe, 0x12000, 0x2000, 0x10000, };
+    }
+
+    final private JJCalls[] jj_2_rtns = new JJCalls[1];
+    private boolean jj_rescan = false;
+    private int jj_gc = 0;
+
+    public NetUIELParser(java.io.InputStream stream) {
+        jj_input_stream = new SimpleCharStream(stream, 1, 1);
+        token_source = new NetUIELParserTokenManager(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+        for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+    }
+
+    public void ReInit(java.io.InputStream stream) {
+        jj_input_stream.ReInit(stream, 1, 1);
+        token_source.ReInit(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+        for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+    }
+
+    public NetUIELParser(java.io.Reader stream) {
+        jj_input_stream = new SimpleCharStream(stream, 1, 1);
+        token_source = new NetUIELParserTokenManager(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+        for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+    }
+
+    public void ReInit(java.io.Reader stream) {
+        jj_input_stream.ReInit(stream, 1, 1);
+        token_source.ReInit(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+        for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+    }
+
+    public NetUIELParser(NetUIELParserTokenManager tm) {
+        token_source = tm;
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+        for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+    }
+
+    public void ReInit(NetUIELParserTokenManager tm) {
+        token_source = tm;
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+        for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+    }
+
+    final private Token jj_consume_token(int kind) throws ParseException {
+        Token oldToken;
+        if ((oldToken = token).next != null)
+            token = token.next;
+        else
+            token = token.next = token_source.getNextToken();
+        jj_ntk = -1;
+        if (token.kind == kind) {
+            jj_gen++;
+            if (++jj_gc > 100) {
+                jj_gc = 0;
+                for (int i = 0; i < jj_2_rtns.length; i++) {
+                    JJCalls c = jj_2_rtns[i];
+                    while (c != null) {
+                        if (c.gen < jj_gen) c.first = null;
+                        c = c.next;
+                    }
+                }
+            }
+            return token;
+        }
+        token = oldToken;
+        jj_kind = kind;
+        throw generateParseException();
+    }
+
+    final private boolean jj_scan_token(int kind) {
+        if (jj_scanpos == jj_lastpos) {
+            jj_la--;
+            if (jj_scanpos.next == null) {
+                jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
+            } else {
+                jj_lastpos = jj_scanpos = jj_scanpos.next;
+            }
+        } else {
+            jj_scanpos = jj_scanpos.next;
+        }
+        if (jj_rescan) {
+            int i = 0;
+            Token tok = token;
+            while (tok != null && tok != jj_scanpos) {
+                i++;
+                tok = tok.next;
+            }
+            if (tok != null) jj_add_error_token(kind, i);
+        }
+        return (jj_scanpos.kind != kind);
+    }
+
+    final public Token getNextToken() {
+        if (token.next != null)
+            token = token.next;
+        else
+            token = token.next = token_source.getNextToken();
+        jj_ntk = -1;
+        jj_gen++;
+        return token;
+    }
+
+    final public Token getToken(int index) {
+        Token t = lookingAhead ? jj_scanpos : token;
+        for (int i = 0; i < index; i++) {
+            if (t.next != null)
+                t = t.next;
+            else
+                t = t.next = token_source.getNextToken();
+        }
+        return t;
+    }
+
+    final private int jj_ntk() {
+        if ((jj_nt = token.next) == null)
+            return (jj_ntk = (token.next = token_source.getNextToken()).kind);
+        else
+            return (jj_ntk = jj_nt.kind);
+    }
+
+    private java.util.Vector jj_expentries = new java.util.Vector();
+    private int[] jj_expentry;
+    private int jj_kind = -1;
+    private int[] jj_lasttokens = new int[100];
+    private int jj_endpos;
+
+    private void jj_add_error_token(int kind, int pos) {
+        if (pos >= 100) return;
+        if (pos == jj_endpos + 1) {
+            jj_lasttokens[jj_endpos++] = kind;
+        } else if (jj_endpos != 0) {
+            jj_expentry = new int[jj_endpos];
+            for (int i = 0; i < jj_endpos; i++) {
+                jj_expentry[i] = jj_lasttokens[i];
+            }
+            boolean exists = false;
+            for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {
+                int[] oldentry = (int[]) (e.nextElement());
+                if (oldentry.length == jj_expentry.length) {
+                    exists = true;
+                    for (int i = 0; i < jj_expentry.length; i++) {
+                        if (oldentry[i] != jj_expentry[i]) {
+                            exists = false;
+                            break;
+                        }
+                    }
+                    if (exists) break;
+                }
+            }
+            if (!exists) jj_expentries.addElement(jj_expentry);
+            if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
+        }
+    }
+
+    public ParseException generateParseException() {
+        jj_expentries.removeAllElements();
+        boolean[] la1tokens = new boolean[18];
+        for (int i = 0; i < 18; i++) {
+            la1tokens[i] = false;
+        }
+        if (jj_kind >= 0) {
+            la1tokens[jj_kind] = true;
+            jj_kind = -1;
+        }
+        for (int i = 0; i < 5; i++) {
+            if (jj_la1[i] == jj_gen) {
+                for (int j = 0; j < 32; j++) {
+                    if ((jj_la1_0[i] & (1 << j)) != 0) {
+                        la1tokens[j] = true;
+                    }
+                }
+            }
+        }
+        for (int i = 0; i < 18; i++) {
+            if (la1tokens[i]) {
+                jj_expentry = new int[1];
+                jj_expentry[0] = i;
+                jj_expentries.addElement(jj_expentry);
+            }
+        }
+        jj_endpos = 0;
+        jj_rescan_token();
+        jj_add_error_token(0, 0);
+        int[][] exptokseq = new int[jj_expentries.size()][];
+        for (int i = 0; i < jj_expentries.size(); i++) {
+            exptokseq[i] = (int[]) jj_expentries.elementAt(i);
+        }
+        return new ParseException(token, exptokseq, tokenImage);
+    }
+
+    final public void enable_tracing() {
+    }
+
+    final public void disable_tracing() {
+    }
+
+    final private void jj_rescan_token() {
+        jj_rescan = true;
+        for (int i = 0; i < 1; i++) {
+            JJCalls p = jj_2_rtns[i];
+            do {
+                if (p.gen > jj_gen) {
+                    jj_la = p.arg;
+                    jj_lastpos = jj_scanpos = p.first;
+                    switch (i) {
+                        case 0:
+                            jj_3_1();
+                            break;
+                    }
+                }
+                p = p.next;
+            } while (p != null);
+        }
+        jj_rescan = false;
+    }
+
+    final private void jj_save(int index, int xla) {
+        JJCalls p = jj_2_rtns[index];
+        while (p.gen > jj_gen) {
+            if (p.next == null) {
+                p = p.next = new JJCalls();
+                break;
+            }
+            p = p.next;
+        }
+        p.gen = jj_gen + xla - jj_la;
+        p.first = token;
+        p.arg = xla;
+    }
+
+    static final class JJCalls {
+
+        int gen;
+        Token first;
+        int arg;
+        JJCalls next;
+    }
+
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserConstants.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserConstants.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserConstants.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserConstants.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+public interface NetUIELParserConstants {
+
+    int EOF = 0;
+    int NON_EXPRESSION_TEXT = 1;
+    int START_EXPRESSION = 2;
+    int ESCAPED_START_EXPRESSION = 3;
+    int END_EXPRESSION = 4;
+    int STRING_LITERAL = 5;
+    int ECMA_ESCAPE_SEQUENCE = 6;
+    int HIT = 7;
+    int IDENTIFIER = 8;
+    int IMPL_OBJ_START = 9;
+    int LETTER = 10;
+    int DIGIT = 11;
+    int INTEGER = 12;
+    int DOT = 13;
+    int DQUOTE = 14;
+    int SQUOTE = 15;
+    int LBRACKET = 16;
+    int RBRACKET = 17;
+
+    int DEFAULT = 0;
+    int IN_EXPRESSION = 1;
+
+    String[] tokenImage = {
+        "<EOF>",
+        "<NON_EXPRESSION_TEXT>",
+        "\"{\"",
+        "\"\\\\\\\\{\"",
+        "\"}\"",
+        "<STRING_LITERAL>",
+        "<ECMA_ESCAPE_SEQUENCE>",
+        "<HIT>",
+        "<IDENTIFIER>",
+        "\"#\"",
+        "<LETTER>",
+        "<DIGIT>",
+        "<INTEGER>",
+        "\".\"",
+        "\"\\\"\"",
+        "\"\\\'\"",
+        "\"[\"",
+        "\"]\"",
+    };
+
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserTokenManager.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserTokenManager.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserTokenManager.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/NetUIELParserTokenManager.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,782 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+
+
+public class NetUIELParserTokenManager
+        implements NetUIELParserConstants {
+
+    public java.io.PrintStream debugStream = System.out;
+
+    public void setDebugStream(java.io.PrintStream ds) {
+        debugStream = ds;
+    }
+
+    private final int jjStopStringLiteralDfa_0(int pos, long active0) {
+        switch (pos) {
+            case 0:
+                if ((active0 & 0x8L) != 0L) {
+                    jjmatchedKind = 1;
+                    return 1;
+                }
+                return -1;
+            case 1:
+                if ((active0 & 0x8L) != 0L) {
+                    if (jjmatchedPos == 0) {
+                        jjmatchedKind = 1;
+                        jjmatchedPos = 0;
+                    }
+                    return -1;
+                }
+                return -1;
+            default :
+                return -1;
+        }
+    }
+
+    private final int jjStartNfa_0(int pos, long active0) {
+        return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+    }
+
+    private final int jjStopAtPos(int pos, int kind) {
+        jjmatchedKind = kind;
+        jjmatchedPos = pos;
+        return pos + 1;
+    }
+
+    private final int jjStartNfaWithStates_0(int pos, int kind, int state) {
+        jjmatchedKind = kind;
+        jjmatchedPos = pos;
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            return pos + 1;
+        }
+        return jjMoveNfa_0(state, pos + 1);
+    }
+
+    private final int jjMoveStringLiteralDfa0_0() {
+        switch (curChar) {
+            case 92:
+                return jjMoveStringLiteralDfa1_0(0x8L);
+            case 123:
+                return jjStopAtPos(0, 2);
+            default :
+                return jjMoveNfa_0(2, 0);
+        }
+    }
+
+    private final int jjMoveStringLiteralDfa1_0(long active0) {
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            jjStopStringLiteralDfa_0(0, active0);
+            return 1;
+        }
+        switch (curChar) {
+            case 92:
+                return jjMoveStringLiteralDfa2_0(active0, 0x8L);
+            default :
+                break;
+        }
+        return jjStartNfa_0(0, active0);
+    }
+
+    private final int jjMoveStringLiteralDfa2_0(long old0, long active0) {
+        if (((active0 &= old0)) == 0L)
+            return jjStartNfa_0(0, old0);
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            jjStopStringLiteralDfa_0(1, active0);
+            return 2;
+        }
+        switch (curChar) {
+            case 123:
+                if ((active0 & 0x8L) != 0L)
+                    return jjStopAtPos(2, 3);
+                break;
+            default :
+                break;
+        }
+        return jjStartNfa_0(1, active0);
+    }
+
+    private final void jjCheckNAdd(int state) {
+        if (jjrounds[state] != jjround) {
+            jjstateSet[jjnewStateCnt++] = state;
+            jjrounds[state] = jjround;
+        }
+    }
+
+    private final void jjAddStates(int start, int end) {
+        do {
+            jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+        } while (start++ != end);
+    }
+
+    private final void jjCheckNAddTwoStates(int state1, int state2) {
+        jjCheckNAdd(state1);
+        jjCheckNAdd(state2);
+    }
+
+    private final void jjCheckNAddStates(int start, int end) {
+        do {
+            jjCheckNAdd(jjnextStates[start]);
+        } while (start++ != end);
+    }
+
+    private final void jjCheckNAddStates(int start) {
+        jjCheckNAdd(jjnextStates[start]);
+        jjCheckNAdd(jjnextStates[start + 1]);
+    }
+
+    static final long[] jjbitVec0 = {
+        0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+    };
+    static final long[] jjbitVec2 = {
+        0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+    };
+
+    private final int jjMoveNfa_0(int startState, int curPos) {
+        int[] nextStates;
+        int startsAt = 0;
+        jjnewStateCnt = 4;
+        int i = 1;
+        jjstateSet[0] = startState;
+        int j, kind = 0x7fffffff;
+        for (; ;) {
+            if (++jjround == 0x7fffffff)
+                ReInitRounds();
+            if (curChar < 64) {
+                long l = 1L << curChar;
+                MatchLoop: do {
+                    switch (jjstateSet[--i]) {
+                        case 2:
+                        case 0:
+                            kind = 1;
+                            jjCheckNAdd(0);
+                            break;
+                        default :
+                            break;
+                    }
+                } while (i != startsAt);
+            } else if (curChar < 128) {
+                long l = 1L << (curChar & 077);
+                MatchLoop: do {
+                    switch (jjstateSet[--i]) {
+                        case 2:
+                            if ((0xf7ffffffefffffffL & l) != 0L) {
+                                if (kind > 1)
+                                    kind = 1;
+                                jjCheckNAdd(0);
+                            } else if (curChar == 92) {
+                                if (kind > 1)
+                                    kind = 1;
+                            }
+                            if (curChar == 92)
+                                jjstateSet[jjnewStateCnt++] = 1;
+                            break;
+                        case 0:
+                            if ((0xf7ffffffefffffffL & l) == 0L)
+                                break;
+                            kind = 1;
+                            jjCheckNAdd(0);
+                            break;
+                        case 1:
+                            if (curChar == 123)
+                                kind = 1;
+                            break;
+                        case 3:
+                            if (curChar == 92 && kind > 1)
+                                kind = 1;
+                            break;
+                        default :
+                            break;
+                    }
+                } while (i != startsAt);
+            } else {
+                int hiByte = (int) (curChar >> 8);
+                int i1 = hiByte >> 6;
+                long l1 = 1L << (hiByte & 077);
+                int i2 = (curChar & 0xff) >> 6;
+                long l2 = 1L << (curChar & 077);
+                MatchLoop: do {
+                    switch (jjstateSet[--i]) {
+                        case 2:
+                        case 0:
+                            if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
+                                break;
+                            if (kind > 1)
+                                kind = 1;
+                            jjCheckNAdd(0);
+                            break;
+                        default :
+                            break;
+                    }
+                } while (i != startsAt);
+            }
+            if (kind != 0x7fffffff) {
+                jjmatchedKind = kind;
+                jjmatchedPos = curPos;
+                kind = 0x7fffffff;
+            }
+            ++curPos;
+            if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
+                return curPos;
+            try {
+                curChar = input_stream.readChar();
+            } catch (java.io.IOException e) {
+                return curPos;
+            }
+        }
+    }
+
+    private final int jjStopStringLiteralDfa_1(int pos, long active0) {
+        switch (pos) {
+            default :
+                return -1;
+        }
+    }
+
+    private final int jjStartNfa_1(int pos, long active0) {
+        return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
+    }
+
+    private final int jjStartNfaWithStates_1(int pos, int kind, int state) {
+        jjmatchedKind = kind;
+        jjmatchedPos = pos;
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            return pos + 1;
+        }
+        return jjMoveNfa_1(state, pos + 1);
+    }
+
+    private final int jjMoveStringLiteralDfa0_1() {
+        switch (curChar) {
+            case 34:
+                return jjStartNfaWithStates_1(0, 14, 33);
+            case 39:
+                return jjStartNfaWithStates_1(0, 15, 34);
+            case 46:
+                return jjStopAtPos(0, 13);
+            case 91:
+                return jjStopAtPos(0, 16);
+            case 93:
+                return jjStopAtPos(0, 17);
+            case 125:
+                return jjStopAtPos(0, 4);
+            default :
+                return jjMoveNfa_1(0, 0);
+        }
+    }
+
+    static final long[] jjbitVec3 = {
+        0x1ff00000fffffffeL, 0xffffffffffffc000L, 0xffffffffL, 0x600000000000000L
+    };
+    static final long[] jjbitVec4 = {
+        0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL
+    };
+    static final long[] jjbitVec5 = {
+        0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+    };
+    static final long[] jjbitVec6 = {
+        0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffL, 0x0L
+    };
+    static final long[] jjbitVec7 = {
+        0xffffffffffffffffL, 0xffffffffffffffffL, 0x0L, 0x0L
+    };
+    static final long[] jjbitVec8 = {
+        0x3fffffffffffL, 0x0L, 0x0L, 0x0L
+    };
+
+    private final int jjMoveNfa_1(int startState, int curPos) {
+        int[] nextStates;
+        int startsAt = 0;
+        jjnewStateCnt = 33;
+        int i = 1;
+        jjstateSet[0] = startState;
+        int j, kind = 0x7fffffff;
+        for (; ;) {
+            if (++jjround == 0x7fffffff)
+                ReInitRounds();
+            if (curChar < 64) {
+                long l = 1L << curChar;
+                MatchLoop: do {
+                    switch (jjstateSet[--i]) {
+                        case 33:
+                            if ((0xffffffffffffdbffL & l) != 0L)
+                                jjCheckNAddStates(0, 5);
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(6, 11);
+                            else if (curChar == 34) {
+                                if (kind > 5)
+                                    kind = 5;
+                            }
+                            if ((0xf000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 10;
+                            break;
+                        case 34:
+                            if ((0xffffffffffffdbffL & l) != 0L)
+                                jjCheckNAddStates(12, 17);
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(18, 23);
+                            else if (curChar == 39) {
+                                if (kind > 5)
+                                    kind = 5;
+                            }
+                            if ((0xf000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 25;
+                            break;
+                        case 0:
+                            if ((0x3ff000000000000L & l) != 0L) {
+                                if (kind > 12)
+                                    kind = 12;
+                                jjCheckNAdd(32);
+                            } else if ((0x1800000000L & l) != 0L) {
+                                if (kind > 8)
+                                    kind = 8;
+                                jjCheckNAdd(31);
+                            } else if (curChar == 39)
+                                jjCheckNAddStates(12, 17);
+                            else if (curChar == 34)
+                                jjCheckNAddStates(0, 5);
+                            break;
+                        case 1:
+                            if ((0xffffffffffffdbffL & l) != 0L)
+                                jjCheckNAddStates(0, 5);
+                            break;
+                        case 3:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 4;
+                            break;
+                        case 4:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 5;
+                            break;
+                        case 5:
+                        case 8:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjCheckNAdd(6);
+                            break;
+                        case 6:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjCheckNAddStates(0, 5);
+                            break;
+                        case 9:
+                            if ((0xf000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 10;
+                            break;
+                        case 10:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 11;
+                            break;
+                        case 11:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(0, 5);
+                            break;
+                        case 12:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(6, 11);
+                            break;
+                        case 13:
+                            if (curChar == 34 && kind > 5)
+                                kind = 5;
+                            break;
+                        case 14:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(24, 30);
+                            break;
+                        case 15:
+                            if (curChar == 39)
+                                jjCheckNAddStates(12, 17);
+                            break;
+                        case 16:
+                            if ((0xffffffffffffdbffL & l) != 0L)
+                                jjCheckNAddStates(12, 17);
+                            break;
+                        case 18:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 19;
+                            break;
+                        case 19:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 20;
+                            break;
+                        case 20:
+                        case 23:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjCheckNAdd(21);
+                            break;
+                        case 21:
+                            if ((0x3ff000000000000L & l) != 0L)
+                                jjCheckNAddStates(12, 17);
+                            break;
+                        case 24:
+                            if ((0xf000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 25;
+                            break;
+                        case 25:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 26;
+                            break;
+                        case 26:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(12, 17);
+                            break;
+                        case 27:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(18, 23);
+                            break;
+                        case 28:
+                            if (curChar == 39 && kind > 5)
+                                kind = 5;
+                            break;
+                        case 29:
+                            if ((0xff000000000000L & l) != 0L)
+                                jjCheckNAddStates(31, 37);
+                            break;
+                        case 30:
+                            if ((0x1800000000L & l) == 0L)
+                                break;
+                            if (kind > 8)
+                                kind = 8;
+                            jjCheckNAdd(31);
+                            break;
+                        case 31:
+                            if ((0x3ff001000000000L & l) == 0L)
+                                break;
+                            if (kind > 8)
+                                kind = 8;
+                            jjCheckNAdd(31);
+                            break;
+                        case 32:
+                            if ((0x3ff000000000000L & l) == 0L)
+                                break;
+                            if (kind > 12)
+                                kind = 12;
+                            jjCheckNAdd(32);
+                            break;
+                        default :
+                            break;
+                    }
+                } while (i != startsAt);
+            } else if (curChar < 128) {
+                long l = 1L << (curChar & 077);
+                MatchLoop: do {
+                    switch (jjstateSet[--i]) {
+                        case 33:
+                            jjCheckNAddStates(0, 5);
+                            if ((0x100000001000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 8;
+                            else if ((0x20000000200000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 3;
+                            break;
+                        case 34:
+                            jjCheckNAddStates(12, 17);
+                            if ((0x100000001000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 23;
+                            else if ((0x20000000200000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 18;
+                            break;
+                        case 0:
+                        case 31:
+                            if ((0x7fffffe87fffffeL & l) == 0L)
+                                break;
+                            if (kind > 8)
+                                kind = 8;
+                            jjCheckNAdd(31);
+                            break;
+                        case 1:
+                            jjCheckNAddStates(0, 5);
+                            break;
+                        case 2:
+                            if ((0x20000000200000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 3;
+                            break;
+                        case 3:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 4;
+                            break;
+                        case 4:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 5;
+                            break;
+                        case 5:
+                        case 8:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjCheckNAdd(6);
+                            break;
+                        case 6:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjCheckNAddStates(0, 5);
+                            break;
+                        case 7:
+                            if ((0x100000001000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 8;
+                            break;
+                        case 16:
+                            jjCheckNAddStates(12, 17);
+                            break;
+                        case 17:
+                            if ((0x20000000200000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 18;
+                            break;
+                        case 18:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 19;
+                            break;
+                        case 19:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 20;
+                            break;
+                        case 20:
+                        case 23:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjCheckNAdd(21);
+                            break;
+                        case 21:
+                            if ((0x7e0000007eL & l) != 0L)
+                                jjCheckNAddStates(12, 17);
+                            break;
+                        case 22:
+                            if ((0x100000001000000L & l) != 0L)
+                                jjstateSet[jjnewStateCnt++] = 23;
+                            break;
+                        default :
+                            break;
+                    }
+                } while (i != startsAt);
+            } else {
+                int hiByte = (int) (curChar >> 8);
+                int i1 = hiByte >> 6;
+                long l1 = 1L << (hiByte & 077);
+                int i2 = (curChar & 0xff) >> 6;
+                long l2 = 1L << (curChar & 077);
+                MatchLoop: do {
+                    switch (jjstateSet[--i]) {
+                        case 33:
+                        case 1:
+                            if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                                jjCheckNAddStates(0, 5);
+                            break;
+                        case 34:
+                        case 16:
+                            if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                                jjCheckNAddStates(12, 17);
+                            break;
+                        case 0:
+                        case 31:
+                            if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+                                break;
+                            if (kind > 8)
+                                kind = 8;
+                            jjCheckNAdd(31);
+                            break;
+                        default :
+                            break;
+                    }
+                } while (i != startsAt);
+            }
+            if (kind != 0x7fffffff) {
+                jjmatchedKind = kind;
+                jjmatchedPos = curPos;
+                kind = 0x7fffffff;
+            }
+            ++curPos;
+            if ((i = jjnewStateCnt) == (startsAt = 33 - (jjnewStateCnt = startsAt)))
+                return curPos;
+            try {
+                curChar = input_stream.readChar();
+            } catch (java.io.IOException e) {
+                return curPos;
+            }
+        }
+    }
+
+    static final int[] jjnextStates = {
+        1, 2, 7, 9, 12, 13, 1, 2, 7, 9, 13, 14, 16, 17, 22, 24,
+        27, 28, 16, 17, 22, 24, 28, 29, 1, 2, 7, 9, 12, 13, 14, 16,
+        17, 22, 24, 27, 28, 29,
+    };
+
+    private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2) {
+        switch (hiByte) {
+            case 0:
+                return ((jjbitVec2[i2] & l2) != 0L);
+            default :
+                if ((jjbitVec0[i1] & l1) != 0L)
+                    return true;
+                return false;
+        }
+    }
+
+    private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2) {
+        switch (hiByte) {
+            case 0:
+                return ((jjbitVec4[i2] & l2) != 0L);
+            case 48:
+                return ((jjbitVec5[i2] & l2) != 0L);
+            case 49:
+                return ((jjbitVec6[i2] & l2) != 0L);
+            case 51:
+                return ((jjbitVec7[i2] & l2) != 0L);
+            case 61:
+                return ((jjbitVec8[i2] & l2) != 0L);
+            default :
+                if ((jjbitVec3[i1] & l1) != 0L)
+                    return true;
+                return false;
+        }
+    }
+
+    public static final String[] jjstrLiteralImages = {
+        "", null, "\173", "\134\134\173", "\175", null, null, null, null, null, null,
+        null, null, "\56", "\42", "\47", "\133", "\135", };
+    public static final String[] lexStateNames = {
+        "DEFAULT",
+        "IN_EXPRESSION",
+    };
+    public static final int[] jjnewLexState = {
+        -1, -1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    };
+    protected SimpleCharStream input_stream;
+    private final int[] jjrounds = new int[33];
+    private final int[] jjstateSet = new int[66];
+    protected char curChar;
+
+    public NetUIELParserTokenManager(SimpleCharStream stream) {
+        if (SimpleCharStream.staticFlag)
+            throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+        input_stream = stream;
+    }
+
+    public NetUIELParserTokenManager(SimpleCharStream stream, int lexState) {
+        this(stream);
+        SwitchTo(lexState);
+    }
+
+    public void ReInit(SimpleCharStream stream) {
+        jjmatchedPos = jjnewStateCnt = 0;
+        curLexState = defaultLexState;
+        input_stream = stream;
+        ReInitRounds();
+    }
+
+    private final void ReInitRounds() {
+        int i;
+        jjround = 0x80000001;
+        for (i = 33; i-- > 0;)
+            jjrounds[i] = 0x80000000;
+    }
+
+    public void ReInit(SimpleCharStream stream, int lexState) {
+        ReInit(stream);
+        SwitchTo(lexState);
+    }
+
+    public void SwitchTo(int lexState) {
+        if (lexState >= 2 || lexState < 0)
+            throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+        else
+            curLexState = lexState;
+    }
+
+    protected Token jjFillToken() {
+        Token t = Token.newToken(jjmatchedKind);
+        t.kind = jjmatchedKind;
+        String im = jjstrLiteralImages[jjmatchedKind];
+        t.image = (im == null) ? input_stream.GetImage() : im;
+        t.beginLine = input_stream.getBeginLine();
+        t.beginColumn = input_stream.getBeginColumn();
+        t.endLine = input_stream.getEndLine();
+        t.endColumn = input_stream.getEndColumn();
+        return t;
+    }
+
+    int curLexState = 0;
+    int defaultLexState = 0;
+    int jjnewStateCnt;
+    int jjround;
+    int jjmatchedPos;
+    int jjmatchedKind;
+
+    public Token getNextToken() {
+        int kind;
+        Token specialToken = null;
+        Token matchedToken;
+        int curPos = 0;
+
+        EOFLoop :
+        for (; ;) {
+            try {
+                curChar = input_stream.BeginToken();
+            } catch (java.io.IOException e) {
+                jjmatchedKind = 0;
+                matchedToken = jjFillToken();
+                return matchedToken;
+            }
+
+            switch (curLexState) {
+                case 0:
+                    jjmatchedKind = 0x7fffffff;
+                    jjmatchedPos = 0;
+                    curPos = jjMoveStringLiteralDfa0_0();
+                    break;
+                case 1:
+                    jjmatchedKind = 0x7fffffff;
+                    jjmatchedPos = 0;
+                    curPos = jjMoveStringLiteralDfa0_1();
+                    break;
+            }
+            if (jjmatchedKind != 0x7fffffff) {
+                if (jjmatchedPos + 1 < curPos)
+                    input_stream.backup(curPos - jjmatchedPos - 1);
+                matchedToken = jjFillToken();
+                if (jjnewLexState[jjmatchedKind] != -1)
+                    curLexState = jjnewLexState[jjmatchedKind];
+                return matchedToken;
+            }
+            int error_line = input_stream.getEndLine();
+            int error_column = input_stream.getEndColumn();
+            String error_after = null;
+            boolean EOFSeen = false;
+            try {
+                input_stream.readChar();
+                input_stream.backup(1);
+            } catch (java.io.IOException e1) {
+                EOFSeen = true;
+                error_after = curPos <= 1 ? "" : input_stream.GetImage();
+                if (curChar == '\n' || curChar == '\r') {
+                    error_line++;
+                    error_column = 0;
+                } else
+                    error_column++;
+            }
+            if (!EOFSeen) {
+                input_stream.backup(1);
+                error_after = curPos <= 1 ? "" : input_stream.GetImage();
+            }
+            throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+        }
+    }
+
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/ParseException.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/ParseException.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/ParseException.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/ParseException.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+import org.apache.ti.util.internal.InternalStringBuilder;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ * <p/>
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
+public class ParseException
+        extends Exception {
+
+    /**
+     * This constructor is used by the method "generateParseException"
+     * in the generated parser.  Calling this constructor generates
+     * a new object of this type with the fields "currentToken",
+     * "expectedTokenSequences", and "tokenImage" set.  The boolean
+     * flag "specialConstructor" is also set to true to indicate that
+     * this constructor was used to create this object.
+     * This constructor calls its super class with the empty string
+     * to force the "toString" method of parent class "Throwable" to
+     * print the error message in the form:
+     * ParseException: <result of getMessage>
+     */
+    public ParseException(Token currentTokenVal,
+                          int[][] expectedTokenSequencesVal,
+                          String[] tokenImageVal) {
+        super("");
+        specialConstructor = true;
+        currentToken = currentTokenVal;
+        expectedTokenSequences = expectedTokenSequencesVal;
+        tokenImage = tokenImageVal;
+    }
+
+    /**
+     * The following constructors are for use by you for whatever
+     * purpose you can think of.  Constructing the exception in this
+     * manner makes the exception behave in the normal way - i.e., as
+     * documented in the class "Throwable".  The fields "errorToken",
+     * "expectedTokenSequences", and "tokenImage" do not contain
+     * relevant information.  The JavaCC generated code does not use
+     * these constructors.
+     */
+
+    public ParseException() {
+        super();
+        specialConstructor = false;
+    }
+
+    public ParseException(String message) {
+        super(message);
+        specialConstructor = false;
+    }
+
+    /**
+     * This variable determines which constructor was used to create
+     * this object and thereby affects the semantics of the
+     * "getMessage" method (see below).
+     */
+    protected boolean specialConstructor;
+
+    /**
+     * This is the last token that has been consumed successfully.  If
+     * this object has been created due to a parse error, the token
+     * followng this token will (therefore) be the first error token.
+     */
+    public Token currentToken;
+
+    /**
+     * Each entry in this array is an array of integers.  Each array
+     * of integers represents a sequence of tokens (by their ordinal
+     * values) that is expected at this point of the parse.
+     */
+    public int[][] expectedTokenSequences;
+
+    /**
+     * This is a reference to the "tokenImage" array of the generated
+     * parser within which the parse error occurred.  This array is
+     * defined in the generated ...Constants interface.
+     */
+    public String[] tokenImage;
+
+    /**
+     * This method has the standard behavior when this object has been
+     * created using the standard constructors.  Otherwise, it uses
+     * "currentToken" and "expectedTokenSequences" to generate a parse
+     * error message and returns it.  If this object has been created
+     * due to a parse error, and you do not catch it (it gets thrown
+     * from the parser), then this method is called during the printing
+     * of the final stack trace, and hence the correct error message
+     * gets displayed.
+     */
+    public String getMessage() {
+        if (!specialConstructor) {
+            return super.getMessage();
+        }
+        String expected = "";
+        int maxSize = 0;
+        for (int i = 0; i < expectedTokenSequences.length; i++) {
+            if (maxSize < expectedTokenSequences[i].length) {
+                maxSize = expectedTokenSequences[i].length;
+            }
+            for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+                expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+            }
+            if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+                expected += "...";
+            }
+            expected += eol + "    ";
+        }
+        String retval = "Encountered \"";
+        Token tok = currentToken.next;
+        for (int i = 0; i < maxSize; i++) {
+            if (i != 0) retval += " ";
+            if (tok.kind == 0) {
+                retval += tokenImage[0];
+                break;
+            }
+            retval += add_escapes(tok.image);
+            tok = tok.next;
+        }
+        retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+        retval += "." + eol;
+        if (expectedTokenSequences.length == 1) {
+            retval += "Was expecting:" + eol + "    ";
+        } else {
+            retval += "Was expecting one of:" + eol + "    ";
+        }
+        retval += expected;
+        return retval;
+    }
+
+    /**
+     * The end of line string for this machine.
+     */
+    protected String eol = System.getProperty("line.separator", "\n");
+
+    /**
+     * Used to convert raw characters to their escaped version
+     * when these raw version cannot be used as part of an ASCII
+     * string literal.
+     */
+    protected String add_escapes(String str) {
+        InternalStringBuilder retval = new InternalStringBuilder();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+                case 0:
+                    continue;
+                case '\b':
+                    retval.append("\\b");
+                    continue;
+                case '\t':
+                    retval.append("\\t");
+                    continue;
+                case '\n':
+                    retval.append("\\n");
+                    continue;
+                case '\f':
+                    retval.append("\\f");
+                    continue;
+                case '\r':
+                    retval.append("\\r");
+                    continue;
+                case '\"':
+                    retval.append("\\\"");
+                    continue;
+                case '\'':
+                    retval.append("\\\'");
+                    continue;
+                case '\\':
+                    retval.append("\\\\");
+                    continue;
+                default:
+                    if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                        String s = "0000" + Integer.toString(ch, 16);
+                        retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+                    } else {
+                        retval.append(ch);
+                    }
+                    continue;
+            }
+        }
+        return retval.toString();
+    }
+
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/SimpleCharStream.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/SimpleCharStream.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/SimpleCharStream.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/SimpleCharStream.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,371 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public class SimpleCharStream {
+
+    public static final boolean staticFlag = false;
+    int bufsize;
+    int available;
+    int tokenBegin;
+    public int bufpos = -1;
+    protected int bufline[];
+    protected int bufcolumn[];
+
+    protected int column = 0;
+    protected int line = 1;
+
+    protected boolean prevCharIsCR = false;
+    protected boolean prevCharIsLF = false;
+
+    protected java.io.Reader inputStream;
+
+    protected char[] buffer;
+    protected int maxNextCharInd = 0;
+    protected int inBuf = 0;
+
+    protected void ExpandBuff(boolean wrapAround) {
+        char[] newbuffer = new char[bufsize + 2048];
+        int newbufline[] = new int[bufsize + 2048];
+        int newbufcolumn[] = new int[bufsize + 2048];
+
+        try {
+            if (wrapAround) {
+                System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+                System.arraycopy(buffer, 0, newbuffer,
+                        bufsize - tokenBegin, bufpos);
+                buffer = newbuffer;
+
+                System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+                System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+                bufline = newbufline;
+
+                System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+                System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+                bufcolumn = newbufcolumn;
+
+                maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+            } else {
+                System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+                buffer = newbuffer;
+
+                System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+                bufline = newbufline;
+
+                System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+                bufcolumn = newbufcolumn;
+
+                maxNextCharInd = (bufpos -= tokenBegin);
+            }
+        } catch (Throwable t) {
+            throw new Error(t.getMessage());
+        }
+
+
+        bufsize += 2048;
+        available = bufsize;
+        tokenBegin = 0;
+    }
+
+    protected void FillBuff() throws java.io.IOException {
+        if (maxNextCharInd == available) {
+            if (available == bufsize) {
+                if (tokenBegin > 2048) {
+                    bufpos = maxNextCharInd = 0;
+                    available = tokenBegin;
+                } else if (tokenBegin < 0)
+                    bufpos = maxNextCharInd = 0;
+                else
+                    ExpandBuff(false);
+            } else if (available > tokenBegin)
+                available = bufsize;
+            else if ((tokenBegin - available) < 2048)
+                ExpandBuff(true);
+            else
+                available = tokenBegin;
+        }
+
+        int i;
+        try {
+            if ((i = inputStream.read(buffer, maxNextCharInd,
+                    available - maxNextCharInd)) == -1) {
+                inputStream.close();
+                throw new java.io.IOException();
+            } else
+                maxNextCharInd += i;
+            return;
+        } catch (java.io.IOException e) {
+            --bufpos;
+            backup(0);
+            if (tokenBegin == -1)
+                tokenBegin = bufpos;
+            throw e;
+        }
+    }
+
+    public char BeginToken() throws java.io.IOException {
+        tokenBegin = -1;
+        char c = readChar();
+        tokenBegin = bufpos;
+
+        return c;
+    }
+
+    protected void UpdateLineColumn(char c) {
+        column++;
+
+        if (prevCharIsLF) {
+            prevCharIsLF = false;
+            line += (column = 1);
+        } else if (prevCharIsCR) {
+            prevCharIsCR = false;
+            if (c == '\n') {
+                prevCharIsLF = true;
+            } else
+                line += (column = 1);
+        }
+
+        switch (c) {
+            case '\r':
+                prevCharIsCR = true;
+                break;
+            case '\n':
+                prevCharIsLF = true;
+                break;
+            case '\t':
+                column--;
+                column += (8 - (column & 07));
+                break;
+            default :
+                break;
+        }
+
+        bufline[bufpos] = line;
+        bufcolumn[bufpos] = column;
+    }
+
+    public char readChar() throws java.io.IOException {
+        if (inBuf > 0) {
+            --inBuf;
+
+            if (++bufpos == bufsize)
+                bufpos = 0;
+
+            return buffer[bufpos];
+        }
+
+        if (++bufpos >= maxNextCharInd)
+            FillBuff();
+
+        char c = buffer[bufpos];
+
+        UpdateLineColumn(c);
+        return (c);
+    }
+
+    /**
+     * @see #getEndColumn
+     * @deprecated
+     */
+
+    public int getColumn() {
+        return bufcolumn[bufpos];
+    }
+
+    /**
+     * @see #getEndLine
+     * @deprecated
+     */
+
+    public int getLine() {
+        return bufline[bufpos];
+    }
+
+    public int getEndColumn() {
+        return bufcolumn[bufpos];
+    }
+
+    public int getEndLine() {
+        return bufline[bufpos];
+    }
+
+    public int getBeginColumn() {
+        return bufcolumn[tokenBegin];
+    }
+
+    public int getBeginLine() {
+        return bufline[tokenBegin];
+    }
+
+    public void backup(int amount) {
+
+        inBuf += amount;
+        if ((bufpos -= amount) < 0)
+            bufpos += bufsize;
+    }
+
+    public SimpleCharStream(java.io.Reader dstream, int startline,
+                            int startcolumn, int buffersize) {
+        inputStream = dstream;
+        line = startline;
+        column = startcolumn - 1;
+
+        available = bufsize = buffersize;
+        buffer = new char[buffersize];
+        bufline = new int[buffersize];
+        bufcolumn = new int[buffersize];
+    }
+
+    public SimpleCharStream(java.io.Reader dstream, int startline,
+                            int startcolumn) {
+        this(dstream, startline, startcolumn, 4096);
+    }
+
+    public SimpleCharStream(java.io.Reader dstream) {
+        this(dstream, 1, 1, 4096);
+    }
+
+    public void ReInit(java.io.Reader dstream, int startline,
+                       int startcolumn, int buffersize) {
+        inputStream = dstream;
+        line = startline;
+        column = startcolumn - 1;
+
+        if (buffer == null || buffersize != buffer.length) {
+            available = bufsize = buffersize;
+            buffer = new char[buffersize];
+            bufline = new int[buffersize];
+            bufcolumn = new int[buffersize];
+        }
+        prevCharIsLF = prevCharIsCR = false;
+        tokenBegin = inBuf = maxNextCharInd = 0;
+        bufpos = -1;
+    }
+
+    public void ReInit(java.io.Reader dstream, int startline,
+                       int startcolumn) {
+        ReInit(dstream, startline, startcolumn, 4096);
+    }
+
+    public void ReInit(java.io.Reader dstream) {
+        ReInit(dstream, 1, 1, 4096);
+    }
+
+    public SimpleCharStream(java.io.InputStream dstream, int startline,
+                            int startcolumn, int buffersize) {
+        this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+    }
+
+    public SimpleCharStream(java.io.InputStream dstream, int startline,
+                            int startcolumn) {
+        this(dstream, startline, startcolumn, 4096);
+    }
+
+    public SimpleCharStream(java.io.InputStream dstream) {
+        this(dstream, 1, 1, 4096);
+    }
+
+    public void ReInit(java.io.InputStream dstream, int startline,
+                       int startcolumn, int buffersize) {
+        ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+    }
+
+    public void ReInit(java.io.InputStream dstream) {
+        ReInit(dstream, 1, 1, 4096);
+    }
+
+    public void ReInit(java.io.InputStream dstream, int startline,
+                       int startcolumn) {
+        ReInit(dstream, startline, startcolumn, 4096);
+    }
+
+    public String GetImage() {
+        if (bufpos >= tokenBegin)
+            return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+        else
+            return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                    new String(buffer, 0, bufpos + 1);
+    }
+
+    public char[] GetSuffix(int len) {
+        char[] ret = new char[len];
+
+        if ((bufpos + 1) >= len)
+            System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+        else {
+            System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                    len - bufpos - 1);
+            System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+        }
+
+        return ret;
+    }
+
+    public void Done() {
+        buffer = null;
+        bufline = null;
+        bufcolumn = null;
+    }
+
+    /**
+     * Method to adjust line and column numbers for the start of a token.<BR>
+     */
+    public void adjustBeginLineColumn(int newLine, int newCol) {
+        int start = tokenBegin;
+        int len;
+
+        if (bufpos >= tokenBegin) {
+            len = bufpos - tokenBegin + inBuf + 1;
+        } else {
+            len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+        }
+
+        int i = 0, j = 0, k = 0;
+        int nextColDiff = 0, columnDiff = 0;
+
+        while (i < len &&
+                bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) {
+            bufline[j] = newLine;
+            nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+            bufcolumn[j] = newCol + columnDiff;
+            columnDiff = nextColDiff;
+            i++;
+        }
+
+        if (i < len) {
+            bufline[j] = newLine++;
+            bufcolumn[j] = newCol + columnDiff;
+
+            while (i++ < len) {
+                if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+                    bufline[j] = newLine++;
+                else
+                    bufline[j] = newLine;
+            }
+        }
+
+        line = bufline[j];
+        column = bufcolumn[j];
+    }
+
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/Token.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/Token.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/Token.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/Token.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token {
+
+    /**
+     * An integer that describes the kind of this token.  This numbering
+     * system is determined by JavaCCParser, and a table of these numbers is
+     * stored in the file ...Constants.java.
+     */
+    public int kind;
+
+    /**
+     * beginLine and beginColumn describe the position of the first character
+     * of this token; endLine and endColumn describe the position of the
+     * last character of this token.
+     */
+    public int beginLine, beginColumn, endLine, endColumn;
+
+    /**
+     * The string image of the token.
+     */
+    public String image;
+
+    /**
+     * A reference to the next regular (non-special) token from the input
+     * stream.  If this is the last token from the input stream, or if the
+     * token manager has not read tokens beyond this one, this field is
+     * set to null.  This is true only if this token is also a regular
+     * token.  Otherwise, see below for a description of the contents of
+     * this field.
+     */
+    public Token next;
+
+    /**
+     * This field is used to access special tokens that occur prior to this
+     * token, but after the immediately preceding regular (non-special) token.
+     * If there are no such special tokens, this field is set to null.
+     * When there are more than one such special token, this field refers
+     * to the last of these special tokens, which in turn refers to the next
+     * previous special token through its specialToken field, and so on
+     * until the first special token (whose specialToken field is null).
+     * The next fields of special tokens refer to other special tokens that
+     * immediately follow it (without an intervening regular token).  If there
+     * is no such token, this field is null.
+     */
+    public Token specialToken;
+
+    /**
+     * Returns the image.
+     */
+    public String toString() {
+        return image;
+    }
+
+    /**
+     * Returns a new Token object, by default. However, if you want, you
+     * can create and return subclass objects based on the value of ofKind.
+     * Simply add the cases to the switch for all those special cases.
+     * For example, if you have a subclass of Token called IDToken that
+     * you want to create if ofKind is ID, simlpy add something like :
+     * <p/>
+     * case MyParserConstants.ID : return new IDToken();
+     * <p/>
+     * to the following switch statement. Then you can cast matchedToken
+     * variable to the appropriate type and use it in your lexical actions.
+     */
+    public static final Token newToken(int ofKind) {
+        switch (ofKind) {
+            default :
+                return new Token();
+        }
+    }
+
+}

Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/TokenMgrError.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/TokenMgrError.java?rev=240168&view=auto
==============================================================================
--- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/TokenMgrError.java (added)
+++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/script/el/parser/TokenMgrError.java Thu Aug 25 22:46:03 2005
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.ti.script.el.parser;
+
+import org.apache.ti.util.internal.InternalStringBuilder;
+
+public class TokenMgrError
+        extends Error {
+
+    /*
+     * Ordinals for various reasons why an Error of this type can be thrown.
+     */
+
+    /**
+     * Lexical error occured.
+     */
+    static final int LEXICAL_ERROR = 0;
+
+    /**
+     * An attempt wass made to create a second instance of a static token manager.
+     */
+    static final int STATIC_LEXER_ERROR = 1;
+
+    /**
+     * Tried to change to an invalid lexical state.
+     */
+    static final int INVALID_LEXICAL_STATE = 2;
+
+    /**
+     * Detected (and bailed out of) an infinite loop in the token manager.
+     */
+    static final int LOOP_DETECTED = 3;
+
+    /**
+     * Indicates the reason why the exception is thrown. It will have
+     * one of the above 4 values.
+     */
+    int errorCode;
+
+    /**
+     * Replaces unprintable characters by their espaced (or unicode escaped)
+     * equivalents in the given string
+     */
+    protected static final String addEscapes(String str) {
+        InternalStringBuilder retval = new InternalStringBuilder();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+                case 0:
+                    continue;
+                case '\b':
+                    retval.append("\\b");
+                    continue;
+                case '\t':
+                    retval.append("\\t");
+                    continue;
+                case '\n':
+                    retval.append("\\n");
+                    continue;
+                case '\f':
+                    retval.append("\\f");
+                    continue;
+                case '\r':
+                    retval.append("\\r");
+                    continue;
+                case '\"':
+                    retval.append("\\\"");
+                    continue;
+                case '\'':
+                    retval.append("\\\'");
+                    continue;
+                case '\\':
+                    retval.append("\\\\");
+                    continue;
+                default:
+                    if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                        String s = "0000" + Integer.toString(ch, 16);
+                        retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+                    } else {
+                        retval.append(ch);
+                    }
+                    continue;
+            }
+        }
+        return retval.toString();
+    }
+
+    /**
+     * Returns a detailed message for the Error when it is thrown by the
+     * token manager to indicate a lexical error.
+     * Parameters :
+     * EOFSeen     : indicates if EOF caused the lexicl error
+     * curLexState : lexical state in which this error occured
+     * errorLine   : line number when the error occured
+     * errorColumn : column number when the error occured
+     * errorAfter  : prefix that was seen before this error occured
+     * curchar     : the offending character
+     * Note: You can customize the lexical error message by modifying this method.
+     */
+    protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+        return ("Lexical error at line " +
+                errorLine + ", column " +
+                errorColumn + ".  Encountered: " +
+                (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int) curChar + "), ") +
+                "after : \"" + addEscapes(errorAfter) + "\"");
+    }
+
+    /**
+     * You can also modify the body of this method to customize your error messages.
+     * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+     * of end-users concern, so you can return something like :
+     * <p/>
+     * "Internal Error : Please file a bug report .... "
+     * <p/>
+     * from this method for such cases in the release version of your parser.
+     */
+    public String getMessage() {
+        return super.getMessage();
+    }
+
+    /*
+     * Constructors of various flavors follow.
+     */
+
+    public TokenMgrError() {
+    }
+
+    public TokenMgrError(String message, int reason) {
+        super(message);
+        errorCode = reason;
+    }
+
+    public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+        this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org