001: /* Generated By:JJTree: Do not edit this line. /tomc/web.align/webtier-alignment/prototype/el-ri/src/com/sun/el/parser/JJTELParserState.java */
002:
003: package org.apache.el.parser;
004:
005: class JJTELParserState {
006: private java.util.Stack nodes;
007: private java.util.Stack marks;
008:
009: private int sp; // number of nodes on stack
010: private int mk; // current mark
011: private boolean node_created;
012:
013: JJTELParserState() {
014: nodes = new java.util.Stack();
015: marks = new java.util.Stack();
016: sp = 0;
017: mk = 0;
018: }
019:
020: /* Determines whether the current node was actually closed and
021: pushed. This should only be called in the final user action of a
022: node scope. */
023: boolean nodeCreated() {
024: return node_created;
025: }
026:
027: /* Call this to reinitialize the node stack. It is called
028: automatically by the parser's ReInit() method. */
029: void reset() {
030: nodes.removeAllElements();
031: marks.removeAllElements();
032: sp = 0;
033: mk = 0;
034: }
035:
036: /* Returns the root node of the AST. It only makes sense to call
037: this after a successful parse. */
038: Node rootNode() {
039: return (Node) nodes.elementAt(0);
040: }
041:
042: /* Pushes a node on to the stack. */
043: void pushNode(Node n) {
044: nodes.push(n);
045: ++sp;
046: }
047:
048: /* Returns the node on the top of the stack, and remove it from the
049: stack. */
050: Node popNode() {
051: if (--sp < mk) {
052: mk = ((Integer) marks.pop()).intValue();
053: }
054: return (Node) nodes.pop();
055: }
056:
057: /* Returns the node currently on the top of the stack. */
058: Node peekNode() {
059: return (Node) nodes.peek();
060: }
061:
062: /* Returns the number of children on the stack in the current node
063: scope. */
064: int nodeArity() {
065: return sp - mk;
066: }
067:
068: void clearNodeScope(Node n) {
069: while (sp > mk) {
070: popNode();
071: }
072: mk = ((Integer) marks.pop()).intValue();
073: }
074:
075: void openNodeScope(Node n) {
076: marks.push(new Integer(mk));
077: mk = sp;
078: n.jjtOpen();
079: }
080:
081: /* A definite node is constructed from a specified number of
082: children. That number of nodes are popped from the stack and
083: made the children of the definite node. Then the definite node
084: is pushed on to the stack. */
085: void closeNodeScope(Node n, int num) {
086: mk = ((Integer) marks.pop()).intValue();
087: while (num-- > 0) {
088: Node c = popNode();
089: c.jjtSetParent(n);
090: n.jjtAddChild(c, num);
091: }
092: n.jjtClose();
093: pushNode(n);
094: node_created = true;
095: }
096:
097: /* A conditional node is constructed if its condition is true. All
098: the nodes that have been pushed since the node was opened are
099: made children of the the conditional node, which is then pushed
100: on to the stack. If the condition is false the node is not
101: constructed and they are left on the stack. */
102: void closeNodeScope(Node n, boolean condition) {
103: if (condition) {
104: int a = nodeArity();
105: mk = ((Integer) marks.pop()).intValue();
106: while (a-- > 0) {
107: Node c = popNode();
108: c.jjtSetParent(n);
109: n.jjtAddChild(c, a);
110: }
111: n.jjtClose();
112: pushNode(n);
113: node_created = true;
114: } else {
115: mk = ((Integer) marks.pop()).intValue();
116: node_created = false;
117: }
118: }
119: }
|