1
2
3 package org.osoco.dyninc.parser;
4
5 class JJTParserState {
6 private java.util.Stack nodes;
7 private java.util.Stack marks;
8
9 private int sp;
10 private int mk;
11 private boolean node_created;
12
13 JJTParserState() {
14 nodes = new java.util.Stack();
15 marks = new java.util.Stack();
16 sp = 0;
17 mk = 0;
18 }
19
20
21
22
23 boolean nodeCreated() {
24 return node_created;
25 }
26
27
28
29 void reset() {
30 nodes.removeAllElements();
31 marks.removeAllElements();
32 sp = 0;
33 mk = 0;
34 }
35
36
37
38 Node rootNode() {
39 return (Node)nodes.elementAt(0);
40 }
41
42
43 void pushNode(Node n) {
44 nodes.push(n);
45 ++sp;
46 }
47
48
49
50 Node popNode() {
51 if (--sp < mk) {
52 mk = ((Integer)marks.pop()).intValue();
53 }
54 return (Node)nodes.pop();
55 }
56
57
58 Node peekNode() {
59 return (Node)nodes.peek();
60 }
61
62
63
64 int nodeArity() {
65 return sp - mk;
66 }
67
68
69 void clearNodeScope(Node n) {
70 while (sp > mk) {
71 popNode();
72 }
73 mk = ((Integer)marks.pop()).intValue();
74 }
75
76
77 void openNodeScope(Node n) {
78 marks.push(new Integer(mk));
79 mk = sp;
80 n.jjtOpen();
81 }
82
83
84
85
86
87
88 void closeNodeScope(Node n, int num) {
89 mk = ((Integer)marks.pop()).intValue();
90 while (num-- > 0) {
91 Node c = popNode();
92 c.jjtSetParent(n);
93 n.jjtAddChild(c, num);
94 }
95 n.jjtClose();
96 pushNode(n);
97 node_created = true;
98 }
99
100
101
102
103
104
105
106 void closeNodeScope(Node n, boolean condition) {
107 if (condition) {
108 int a = nodeArity();
109 mk = ((Integer)marks.pop()).intValue();
110 while (a-- > 0) {
111 Node c = popNode();
112 c.jjtSetParent(n);
113 n.jjtAddChild(c, a);
114 }
115 n.jjtClose();
116 pushNode(n);
117 node_created = true;
118 } else {
119 mk = ((Integer)marks.pop()).intValue();
120 node_created = false;
121 }
122 }
123 }