1*0c56280aSSorin Basca /* 2*0c56280aSSorin Basca * Licensed to the Apache Software Foundation (ASF) under one or more 3*0c56280aSSorin Basca * contributor license agreements. See the NOTICE file distributed with 4*0c56280aSSorin Basca * this work for additional information regarding copyright ownership. 5*0c56280aSSorin Basca * The ASF licenses this file to You under the Apache License, Version 2.0 6*0c56280aSSorin Basca * (the "License"); you may not use this file except in compliance with 7*0c56280aSSorin Basca * the License. You may obtain a copy of the License at 8*0c56280aSSorin Basca * 9*0c56280aSSorin Basca * http://www.apache.org/licenses/LICENSE-2.0 10*0c56280aSSorin Basca * 11*0c56280aSSorin Basca * Unless required by applicable law or agreed to in writing, software 12*0c56280aSSorin Basca * distributed under the License is distributed on an "AS IS" BASIS, 13*0c56280aSSorin Basca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*0c56280aSSorin Basca * See the License for the specific language governing permissions and 15*0c56280aSSorin Basca * limitations under the License. 16*0c56280aSSorin Basca * 17*0c56280aSSorin Basca */ 18*0c56280aSSorin Basca /* Generated By:JJTree: Do not edit this line. JJTMiniParserState.java */ 19*0c56280aSSorin Basca 20*0c56280aSSorin Basca package Mini; 21*0c56280aSSorin Basca 22*0c56280aSSorin Basca class JJTMiniParserState { 23*0c56280aSSorin Basca private java.util.Stack<Node> nodes; 24*0c56280aSSorin Basca private java.util.Stack<Integer> marks; 25*0c56280aSSorin Basca 26*0c56280aSSorin Basca private int sp; // number of nodes on stack 27*0c56280aSSorin Basca private int mk; // current mark 28*0c56280aSSorin Basca private boolean node_created; 29*0c56280aSSorin Basca JJTMiniParserState()30*0c56280aSSorin Basca JJTMiniParserState() { 31*0c56280aSSorin Basca nodes = new java.util.Stack<Node>(); 32*0c56280aSSorin Basca marks = new java.util.Stack<Integer>(); 33*0c56280aSSorin Basca sp = 0; 34*0c56280aSSorin Basca mk = 0; 35*0c56280aSSorin Basca } 36*0c56280aSSorin Basca 37*0c56280aSSorin Basca /* Determines whether the current node was actually closed and 38*0c56280aSSorin Basca pushed. This should only be called in the final user action of a 39*0c56280aSSorin Basca node scope. */ nodeCreated()40*0c56280aSSorin Basca boolean nodeCreated() { 41*0c56280aSSorin Basca return node_created; 42*0c56280aSSorin Basca } 43*0c56280aSSorin Basca 44*0c56280aSSorin Basca /* Call this to reinitialize the node stack. It is called 45*0c56280aSSorin Basca automatically by the parser's ReInit() method. */ reset()46*0c56280aSSorin Basca void reset() { 47*0c56280aSSorin Basca nodes.removeAllElements(); 48*0c56280aSSorin Basca marks.removeAllElements(); 49*0c56280aSSorin Basca sp = 0; 50*0c56280aSSorin Basca mk = 0; 51*0c56280aSSorin Basca } 52*0c56280aSSorin Basca 53*0c56280aSSorin Basca /* Returns the root node of the AST. It only makes sense to call 54*0c56280aSSorin Basca this after a successful parse. */ rootNode()55*0c56280aSSorin Basca Node rootNode() { 56*0c56280aSSorin Basca return nodes.elementAt(0); 57*0c56280aSSorin Basca } 58*0c56280aSSorin Basca 59*0c56280aSSorin Basca /* Pushes a node on to the stack. */ pushNode(Node n)60*0c56280aSSorin Basca void pushNode(Node n) { 61*0c56280aSSorin Basca nodes.push(n); 62*0c56280aSSorin Basca ++sp; 63*0c56280aSSorin Basca } 64*0c56280aSSorin Basca 65*0c56280aSSorin Basca /* Returns the node on the top of the stack, and remove it from the 66*0c56280aSSorin Basca stack. */ popNode()67*0c56280aSSorin Basca Node popNode() { 68*0c56280aSSorin Basca if (--sp < mk) { 69*0c56280aSSorin Basca mk = marks.pop().intValue(); 70*0c56280aSSorin Basca } 71*0c56280aSSorin Basca return nodes.pop(); 72*0c56280aSSorin Basca } 73*0c56280aSSorin Basca 74*0c56280aSSorin Basca /* Returns the node currently on the top of the stack. */ peekNode()75*0c56280aSSorin Basca Node peekNode() { 76*0c56280aSSorin Basca return nodes.peek(); 77*0c56280aSSorin Basca } 78*0c56280aSSorin Basca 79*0c56280aSSorin Basca /* Returns the number of children on the stack in the current node 80*0c56280aSSorin Basca scope. */ nodeArity()81*0c56280aSSorin Basca int nodeArity() { 82*0c56280aSSorin Basca return sp - mk; 83*0c56280aSSorin Basca } 84*0c56280aSSorin Basca 85*0c56280aSSorin Basca clearNodeScope(Node n)86*0c56280aSSorin Basca void clearNodeScope(Node n) { 87*0c56280aSSorin Basca while (sp > mk) { 88*0c56280aSSorin Basca popNode(); 89*0c56280aSSorin Basca } 90*0c56280aSSorin Basca mk = marks.pop().intValue(); 91*0c56280aSSorin Basca } 92*0c56280aSSorin Basca 93*0c56280aSSorin Basca openNodeScope(Node n)94*0c56280aSSorin Basca void openNodeScope(Node n) { 95*0c56280aSSorin Basca marks.push(new Integer(mk)); 96*0c56280aSSorin Basca mk = sp; 97*0c56280aSSorin Basca n.jjtOpen(); 98*0c56280aSSorin Basca } 99*0c56280aSSorin Basca 100*0c56280aSSorin Basca 101*0c56280aSSorin Basca /* A definite node is constructed from a specified number of 102*0c56280aSSorin Basca children. That number of nodes are popped from the stack and 103*0c56280aSSorin Basca made the children of the definite node. Then the definite node 104*0c56280aSSorin Basca is pushed on to the stack. */ closeNodeScope(Node n, int num)105*0c56280aSSorin Basca void closeNodeScope(Node n, int num) { 106*0c56280aSSorin Basca mk = marks.pop().intValue(); 107*0c56280aSSorin Basca while (num-- > 0) { 108*0c56280aSSorin Basca Node c = popNode(); 109*0c56280aSSorin Basca c.jjtSetParent(n); 110*0c56280aSSorin Basca n.jjtAddChild(c, num); 111*0c56280aSSorin Basca } 112*0c56280aSSorin Basca n.jjtClose(); 113*0c56280aSSorin Basca pushNode(n); 114*0c56280aSSorin Basca node_created = true; 115*0c56280aSSorin Basca } 116*0c56280aSSorin Basca 117*0c56280aSSorin Basca 118*0c56280aSSorin Basca /* A conditional node is constructed if its condition is true. All 119*0c56280aSSorin Basca the nodes that have been pushed since the node was opened are 120*0c56280aSSorin Basca made children of the the conditional node, which is then pushed 121*0c56280aSSorin Basca on to the stack. If the condition is false the node is not 122*0c56280aSSorin Basca constructed and they are left on the stack. */ closeNodeScope(Node n, boolean condition)123*0c56280aSSorin Basca void closeNodeScope(Node n, boolean condition) { 124*0c56280aSSorin Basca if (condition) { 125*0c56280aSSorin Basca int a = nodeArity(); 126*0c56280aSSorin Basca mk = marks.pop().intValue(); 127*0c56280aSSorin Basca while (a-- > 0) { 128*0c56280aSSorin Basca Node c = popNode(); 129*0c56280aSSorin Basca c.jjtSetParent(n); 130*0c56280aSSorin Basca n.jjtAddChild(c, a); 131*0c56280aSSorin Basca } 132*0c56280aSSorin Basca n.jjtClose(); 133*0c56280aSSorin Basca pushNode(n); 134*0c56280aSSorin Basca node_created = true; 135*0c56280aSSorin Basca } else { 136*0c56280aSSorin Basca mk = marks.pop().intValue(); 137*0c56280aSSorin Basca node_created = false; 138*0c56280aSSorin Basca } 139*0c56280aSSorin Basca } 140*0c56280aSSorin Basca } 141