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