001/* Generated By:JavaCC: Do not edit this line. JJTSRCPParserState.java Version 7.0.3 */ 002package jmri.jmris.srcp.parser; 003 004public class JJTSRCPParserState { 005 private java.util.List<Node> nodes; 006 private java.util.List<Integer> marks; 007 008 private int sp; // number of nodes on stack 009 private int mk; // current mark 010 private boolean node_created; 011 012 public JJTSRCPParserState() { 013 nodes = new java.util.ArrayList<Node>(); 014 marks = new java.util.ArrayList<Integer>(); 015 sp = 0; 016 mk = 0; 017 } 018 019 /* Determines whether the current node was actually closed and 020 pushed. This should only be called in the final user action of a 021 node scope. */ 022 public boolean nodeCreated() { 023 return node_created; 024 } 025 026 /* Call this to reinitialize the node stack. It is called 027 automatically by the parser's ReInit() method. */ 028 public void reset() { 029 nodes.clear(); 030 marks.clear(); 031 sp = 0; 032 mk = 0; 033 } 034 035 /* Returns the root node of the AST. It only makes sense to call 036 this after a successful parse. */ 037 public Node rootNode() { 038 return nodes.get(0); 039 } 040 041 /* Pushes a node on to the stack. */ 042 public void pushNode(Node n) { 043 nodes.add(n); 044 ++sp; 045 } 046 047 /* Returns the node on the top of the stack, and remove it from the 048 stack. */ 049 public Node popNode() { 050 if (--sp < mk) { 051 mk = marks.remove(marks.size()-1); 052 } 053 return nodes.remove(nodes.size()-1); 054 } 055 056 /* Returns the node currently on the top of the stack. */ 057 public Node peekNode() { 058 return nodes.get(nodes.size()-1); 059 } 060 061 /* Returns the number of children on the stack in the current node 062 scope. */ 063 public int nodeArity() { 064 return sp - mk; 065 } 066 067 068 public void clearNodeScope(Node n) { 069 while (sp > mk) { 070 popNode(); 071 } 072 mk = marks.remove(marks.size()-1); 073 } 074 075 076 public void openNodeScope(Node n) { 077 marks.add(mk); 078 mk = sp; 079 n.jjtOpen(); 080 } 081 082 083 /* A definite node is constructed from a specified number of 084 children. That number of nodes are popped from the stack and 085 made the children of the definite node. Then the definite node 086 is pushed on to the stack. */ 087 public void closeNodeScope(Node n, int num) { 088 mk = marks.remove(marks.size()-1); 089 while (num-- > 0) { 090 Node c = popNode(); 091 c.jjtSetParent(n); 092 n.jjtAddChild(c, num); 093 } 094 n.jjtClose(); 095 pushNode(n); 096 node_created = true; 097 } 098 099 100 /* A conditional node is constructed if its condition is true. All 101 the nodes that have been pushed since the node was opened are 102 made children of the conditional node, which is then pushed 103 on to the stack. If the condition is false the node is not 104 constructed and they are left on the stack. */ 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/* JavaCC - OriginalChecksum=4eeb6a99959e7daf6f9ea0b848ff5ab6 (do not edit this line) */