📄 commontreenodestream.java
字号:
//System.out.println("found in index; stream index = "+streamIndexI); return streamIndexI.intValue(); // found it! } } return -1; } protected int getNodeIndexLinearly(Object node) { if ( p==-1 ) { fillBuffer(); } for (int i = 0; i < nodes.size(); i++) { Object t = (Object) nodes.get(i); if ( t==node ) { return i; } } return -1; } /** As we flatten the tree, we use UP, DOWN nodes to represent * the tree structure. When debugging we need unique nodes * so instantiate new ones when uniqueNavigationNodes is true. */ protected void addNavigationNode(final int ttype) { Object navNode = null; if ( ttype==Token.DOWN ) { if ( hasUniqueNavigationNodes() ) { navNode = adaptor.create(Token.DOWN, "DOWN"); } else { navNode = down; } } else { if ( hasUniqueNavigationNodes() ) { navNode = adaptor.create(Token.UP, "UP"); } else { navNode = up; } } nodes.add(navNode); } public Object get(int i) { if ( p==-1 ) { fillBuffer(); } return nodes.get(i); } public Object LT(int k) { if ( p==-1 ) { fillBuffer(); } if ( k==0 ) { return null; } if ( k<0 ) { return LB(-k); } //System.out.print("LT(p="+p+","+k+")="); if ( (p+k-1) >= nodes.size() ) { return eof; } return nodes.get(p+k-1); }/* public Object getLastTreeNode() { int i = index(); if ( i>=size() ) { i--; // if at EOF, have to start one back } System.out.println("start last node: "+i+" size=="+nodes.size()); while ( i>=0 && (adaptor.getType(get(i))==Token.EOF || adaptor.getType(get(i))==Token.UP || adaptor.getType(get(i))==Token.DOWN) ) { i--; } System.out.println("stop at node: "+i+" "+nodes.get(i)); return nodes.get(i); }*/ /** Look backwards k nodes */ protected Object LB(int k) { if ( k==0 ) { return null; } if ( (p-k)<0 ) { return null; } return nodes.get(p-k); } public Object getTreeSource() { return root; } public TokenStream getTokenStream() { return tokens; } public void setTokenStream(TokenStream tokens) { this.tokens = tokens; } public TreeAdaptor getTreeAdaptor() { return adaptor; } public boolean hasUniqueNavigationNodes() { return uniqueNavigationNodes; } public void setUniqueNavigationNodes(boolean uniqueNavigationNodes) { this.uniqueNavigationNodes = uniqueNavigationNodes; } public void consume() { if ( p==-1 ) { fillBuffer(); } p++; } public int LA(int i) { return adaptor.getType(LT(i)); } public int mark() { if ( p==-1 ) { fillBuffer(); } lastMarker = index(); return lastMarker; } public void release(int marker) { // no resources to release } public int index() { return p; } public void rewind(int marker) { seek(marker); } public void rewind() { seek(lastMarker); } public void seek(int index) { if ( p==-1 ) { fillBuffer(); } p = index; } /** Make stream jump to a new location, saving old location. * Switch back with pop(). I manage dyanmic array manually * to avoid creating Integer objects all over the place. */ public void push(int index) { if ( calls==null ) { calls = new int[INITIAL_CALL_STACK_SIZE]; } else if ( (_sp+1)>=calls.length ) { int[] newStack = new int[calls.length*2]; System.arraycopy(calls, 0, newStack, 0, calls.length); calls = newStack; } calls[++_sp] = p; // save current index seek(index); } /** Seek back to previous index saved during last push() call. * Return top of stack (return index). */ public int pop() { int ret = calls[_sp--]; seek(ret); return ret; } public int size() { if ( p==-1 ) { fillBuffer(); } return nodes.size(); } public Iterator iterator() { if ( p==-1 ) { fillBuffer(); } return new StreamIterator(); } /** Used for testing, just return the token type stream */ public String toString() { if ( p==-1 ) { fillBuffer(); } StringBuffer buf = new StringBuffer(); for (int i = 0; i < nodes.size(); i++) { Object t = (Object) nodes.get(i); buf.append(" "); buf.append(adaptor.getType(t)); } return buf.toString(); } public String toString(Object start, Object stop) { if ( start==null || stop==null ) { return null; } if ( p==-1 ) { fillBuffer(); } System.out.println("stop: "+stop); if ( start instanceof CommonTree ) System.out.print("toString: "+((CommonTree)start).getToken()+", "); else System.out.println(start); if ( stop instanceof CommonTree ) System.out.println(((CommonTree)stop).getToken()); else System.out.println(stop); // if we have the token stream, use that to dump text in order if ( tokens!=null ) { int beginTokenIndex = adaptor.getTokenStartIndex(start); int endTokenIndex = adaptor.getTokenStopIndex(stop); // if it's a tree, use start/stop index from start node // else use token range from start/stop nodes if ( adaptor.getType(stop)==Token.UP ) { endTokenIndex = adaptor.getTokenStopIndex(start); } else if ( adaptor.getType(stop)==Token.EOF ) { endTokenIndex = size()-2; // don't use EOF } return tokens.toString(beginTokenIndex, endTokenIndex); } // walk nodes looking for start Object t = null; int i = 0; for (; i < nodes.size(); i++) { t = nodes.get(i); if ( t==start ) { break; } } // now walk until we see stop, filling string buffer with text StringBuffer buf = new StringBuffer(); t = nodes.get(i); while ( t!=stop ) { String text = adaptor.getText(t); if ( text==null ) { text = " "+String.valueOf(adaptor.getType(t)); } buf.append(text); i++; t = nodes.get(i); } // include stop node too String text = adaptor.getText(stop); if ( text==null ) { text = " "+String.valueOf(adaptor.getType(stop)); } buf.append(text); return buf.toString(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -