xref: /aosp_15_r20/external/apache-commons-bcel/src/examples/Mini/JJTMiniParserState.java (revision 0c56280ab0842982c46a149f7b9eaa497e31e292)
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