    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) */