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