1
2 package net.sourceforge.pmd.ast;
3
4 public class JJTJavaParserState {
5 private java.util.List<Node> nodes;
6 private java.util.List<Integer> marks;
7
8 private int sp;
9 private int mk;
10 private boolean node_created;
11
12 public JJTJavaParserState() {
13 nodes = new java.util.ArrayList<Node>();
14 marks = new java.util.ArrayList<Integer>();
15 sp = 0;
16 mk = 0;
17 }
18
19
20
21
22 public boolean nodeCreated() {
23 return node_created;
24 }
25
26
27
28 public void reset() {
29 nodes.clear();
30 marks.clear();
31 sp = 0;
32 mk = 0;
33 }
34
35
36
37 public Node rootNode() {
38 return nodes.get(0);
39 }
40
41
42 public void pushNode(Node n) {
43 nodes.add(n);
44 ++sp;
45 }
46
47
48
49 public Node popNode() {
50 if (--sp < mk) {
51 mk = marks.remove(marks.size()-1);
52 }
53 return nodes.remove(nodes.size()-1);
54 }
55
56
57 public Node peekNode() {
58 return nodes.get(nodes.size()-1);
59 }
60
61
62
63 public int nodeArity() {
64 return sp - mk;
65 }
66
67
68 public void clearNodeScope(Node n) {
69 while (sp > mk) {
70 popNode();
71 }
72 mk = marks.remove(marks.size()-1);
73 }
74
75
76 public void openNodeScope(Node n) {
77 marks.add(mk);
78 mk = sp;
79 n.jjtOpen();
80 }
81
82
83
84
85
86
87 public void closeNodeScope(Node n, int num) {
88 mk = marks.remove(marks.size()-1);
89 while (num-- > 0) {
90 Node c = popNode();
91 c.jjtSetParent(n);
92 n.jjtAddChild(c, num);
93 }
94 n.jjtClose();
95 pushNode(n);
96 node_created = true;
97 }
98
99
100
101
102
103
104
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