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