00001 package edu.ksu.cis.bandera.abstraction.predicate.parser;
00002
00003
00004 class JJTPredicateParserState {
00005 private java.util.Stack nodes;
00006 private java.util.Stack marks;
00007
00008 private int sp;
00009 private int mk;
00010 private boolean node_created;
00011
00012 JJTPredicateParserState() {
00013 nodes = new java.util.Stack();
00014 marks = new java.util.Stack();
00015 sp = 0;
00016 mk = 0;
00017 }
00018 void clearNodeScope(Node n) {
00019 while (sp > mk) {
00020 popNode();
00021 }
00022 mk = ((Integer)marks.pop()).intValue();
00023 }
00024
00025
00026
00027
00028 void closeNodeScope(Node n, int num) {
00029 mk = ((Integer)marks.pop()).intValue();
00030 while (num-- > 0) {
00031 Node c = popNode();
00032 c.jjtSetParent(n);
00033 n.jjtAddChild(c, num);
00034 }
00035 n.jjtClose();
00036 pushNode(n);
00037 node_created = true;
00038 }
00039
00040
00041
00042
00043
00044 void closeNodeScope(Node n, boolean condition) {
00045 if (condition) {
00046 int a = nodeArity();
00047 mk = ((Integer)marks.pop()).intValue();
00048 while (a-- > 0) {
00049 Node c = popNode();
00050 c.jjtSetParent(n);
00051 n.jjtAddChild(c, a);
00052 }
00053 n.jjtClose();
00054 pushNode(n);
00055 node_created = true;
00056 } else {
00057 mk = ((Integer)marks.pop()).intValue();
00058 node_created = false;
00059 }
00060 }
00061
00062
00063 int nodeArity() {
00064 return sp - mk;
00065 }
00066
00067
00068
00069 boolean nodeCreated() {
00070 return node_created;
00071 }
00072 void openNodeScope(Node n) {
00073 marks.push(new Integer(mk));
00074 mk = sp;
00075 n.jjtOpen();
00076 }
00077
00078 Node peekNode() {
00079 return (Node)nodes.peek();
00080 }
00081
00082
00083 Node popNode() {
00084 if (--sp < mk) {
00085 mk = ((Integer)marks.pop()).intValue();
00086 }
00087 return (Node)nodes.pop();
00088 }
00089
00090 void pushNode(Node n) {
00091 nodes.push(n);
00092 ++sp;
00093 }
00094
00095
00096 void reset() {
00097 nodes.removeAllElements();
00098 marks.removeAllElements();
00099 sp = 0;
00100 mk = 0;
00101 }
00102
00103
00104 Node rootNode() {
00105 return (Node)nodes.elementAt(0);
00106 }
00107 }