1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#: 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Tree 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using System.Collections.Generic; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using Console = System.Console; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using IList = System.Collections.IList; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using InvalidOperationException = System.InvalidOperationException; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using StringBuilder = System.Text.StringBuilder; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>A buffered stream of tree nodes. Nodes can be from a tree of ANY kind.</summary> 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This node stream sucks all nodes out of the tree specified in 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the constructor during construction and makes pointers into 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the tree using an array of Object pointers. The stream necessarily 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * includes pointers to DOWN and UP and EOF nodes. 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This stream knows how to mark/release for backtracking. 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This stream is most suitable for tree interpreters that need to 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * jump around a lot or for tree parsers requiring speed (at cost of memory). 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * There is some duplicated functionality here with UnBufferedTreeNodeStream 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but just in bookkeeping, not tree walking etc... 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * TARGET DEVELOPERS: 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is the old CommonTreeNodeStream that buffered up entire node stream. 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * No need to implement really as new CommonTreeNodeStream is much better 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and covers what we need. 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @see CommonTreeNodeStream 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public class BufferedTreeNodeStream : ITreeNodeStream, ITokenStreamInformation 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public const int DEFAULT_INITIAL_BUFFER_SIZE = 100; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public const int INITIAL_CALL_STACK_SIZE = 10; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected sealed class StreamIterator : IEnumerator<object> 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BufferedTreeNodeStream _outer; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int _index; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public StreamIterator( BufferedTreeNodeStream outer ) 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _outer = outer; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = -1; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IEnumerator<object> Members 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object Current 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( _index < _outer.nodes.Count ) 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _outer.nodes[_index]; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _outer.eof; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IDisposable Members 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void Dispose() 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IEnumerator Members 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool MoveNext() 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( _index < _outer.nodes.Count ) 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index++; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _index < _outer.nodes.Count; 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void Reset() 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = -1; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // all these navigation nodes are shared and hence they 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // cannot contain any line/column info 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected object down; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected object up; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected object eof; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The complete mapping from stream index to tree node. 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This buffer includes pointers to DOWN, UP, and EOF nodes. 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * It is built upon ctor invocation. The elements are type 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Object as we don't what the trees look like.</summary> 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Load upon first need of the buffer so we can set token types 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of interest for reverseIndexing. Slows us down a wee bit to 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * do all of the if p==-1 testing everywhere though. 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected IList nodes; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Pull nodes from which tree?</summary> */ 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected object root; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>IF this tree (root) was created from a token stream, track it.</summary> */ 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected ITokenStream tokens; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>What tree adaptor was used to build these trees</summary> */ 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeAdaptor adaptor; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Reuse same DOWN, UP navigation nodes unless this is true</summary> */ 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bool uniqueNavigationNodes = false; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The index into the nodes list of the current node (next node 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to consume). If -1, nodes array not filled yet.</summary> 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected int p = -1; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Track the last mark() call result value for use in rewind().</summary> */ 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected int lastMarker; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Stack of indexes used for push/pop calls</summary> */ 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected Stack<int> calls; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BufferedTreeNodeStream( object tree ) 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this( new CommonTreeAdaptor(), tree ) 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BufferedTreeNodeStream( ITreeAdaptor adaptor, object tree ) 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this( adaptor, tree, DEFAULT_INITIAL_BUFFER_SIZE ) 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BufferedTreeNodeStream( ITreeAdaptor adaptor, object tree, int initialBufferSize ) 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.root = tree; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.adaptor = adaptor; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = new List<object>( initialBufferSize ); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver down = adaptor.Create( TokenTypes.Down, "DOWN" ); 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver up = adaptor.Create( TokenTypes.Up, "UP" ); 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver eof = adaptor.Create( TokenTypes.EndOfFile, "EOF" ); 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Properties 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Count 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException( "Cannot determine the Count before the buffer is filled." ); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nodes.Count; 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual object TreeSource 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return root; 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual string SourceName 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TokenStream.SourceName; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual ITokenStream TokenStream 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokens; 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = value; 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual ITreeAdaptor TreeAdaptor 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor = value; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual bool UniqueNavigationNodes 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return uniqueNavigationNodes; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver uniqueNavigationNodes = value; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual IToken LastToken 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TreeAdaptor.GetToken(LB(1)); 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual IToken LastRealToken 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i = 0; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken token; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver do 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = TreeAdaptor.GetToken(LB(i)); 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } while (token != null && token.Line <= 0); 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token; 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int MaxLookBehind 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return int.MaxValue; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Walk tree with depth-first-search and fill nodes buffer. 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Don't do DOWN, UP nodes if its a list (t is isNil). 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected virtual void FillBuffer() 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer( root ); 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //Console.Out.WriteLine( "revIndex=" + tokenTypeToStreamIndexesMap ); 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p = 0; // buffer of nodes intialized now 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void FillBuffer( object t ) 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bool nil = adaptor.IsNil( t ); 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !nil ) 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.Add( t ); // add this node 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add DOWN node if t has children 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int n = adaptor.GetChildCount( t ); 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !nil && n > 0 ) 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddNavigationNode( TokenTypes.Down ); 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and now add all its children 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for ( int c = 0; c < n; c++ ) 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object child = adaptor.GetChild( t, c ); 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer( child ); 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add UP node if t has children 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !nil && n > 0 ) 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddNavigationNode( TokenTypes.Up ); 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** What is the stream index for node? 0..n-1 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return -1 if node not found. 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected virtual int GetNodeIndex( object node ) 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for ( int i = 0; i < nodes.Count; i++ ) 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object t = nodes[i]; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t == node ) 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return i; 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** As we flatten the tree, we use UP, DOWN nodes to represent 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the tree structure. When debugging we need unique nodes 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so instantiate new ones when uniqueNavigationNodes is true. 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected virtual void AddNavigationNode( int ttype ) 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object navNode = null; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( ttype == TokenTypes.Down ) 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( UniqueNavigationNodes ) 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = adaptor.Create( TokenTypes.Down, "DOWN" ); 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = down; 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( UniqueNavigationNodes ) 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = adaptor.Create( TokenTypes.Up, "UP" ); 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = up; 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.Add( navNode ); 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual object this[int i] 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException( "Cannot get the node at index i before the buffer is filled." ); 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nodes[i]; 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual object LT( int k ) 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( k == 0 ) 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( k < 0 ) 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return LB( -k ); 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.print("LT(p="+p+","+k+")="); 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( ( p + k - 1 ) >= nodes.Count ) 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return eof; 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nodes[p + k - 1]; 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual object GetCurrentSymbol() 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return LT( 1 ); 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if false 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual object getLastTreeNode() 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i = Index; 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( i >= size() ) 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i--; // if at EOF, have to start one back 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.WriteLine( "start last node: " + i + " size==" + nodes.Count ); 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( i >= 0 && 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( adaptor.getType( this[i] ) == TokenTypes.EOF || 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor.getType( this[i] ) == TokenTypes.UP || 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor.getType( this[i] ) == TokenTypes.DOWN ) ) 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i--; 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.WriteLine( "stop at node: " + i + " " + nodes[i] ); 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nodes[i]; 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Look backwards k nodes</summary> */ 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected virtual object LB( int k ) 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( k == 0 ) 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( ( p - k ) < 0 ) 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nodes[p - k]; 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Consume() 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p++; 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int LA( int i ) 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor.GetType( LT( i ) ); 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Mark() 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lastMarker = Index; 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return lastMarker; 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Release( int marker ) 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no resources to release 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Index 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return p; 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Rewind( int marker ) 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek( marker ); 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Rewind() 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek( lastMarker ); 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Seek( int index ) 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p = index; 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Make stream jump to a new location, saving old location. 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Switch back with pop(). 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Push( int index ) 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( calls == null ) 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver calls = new Stack<int>(); 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver calls.Push( p ); // save current index 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek( index ); 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Seek back to previous index saved during last push() call. 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return top of stack (return index). 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Pop() 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int ret = calls.Pop(); 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek( ret ); 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ret; 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Reset() 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p = 0; 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lastMarker = 0; 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( calls != null ) 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver calls.Clear(); 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual IEnumerator<object> Iterator() 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new StreamIterator( this ); 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TREE REWRITE INTERFACE 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void ReplaceChildren( object parent, int startChildIndex, int stopChildIndex, object t ) 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( parent != null ) 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor.ReplaceChildren( parent, startChildIndex, stopChildIndex, t ); 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Used for testing, just return the token type stream</summary> */ 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual string ToTokenTypeString() 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuilder buf = new StringBuilder(); 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for ( int i = 0; i < nodes.Count; i++ ) 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object t = nodes[i]; 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.Append( " " ); 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.Append( adaptor.GetType( t ) ); 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf.ToString(); 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Debugging</summary> */ 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual string ToTokenString( int start, int stop ) 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(); 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuilder buf = new StringBuilder(); 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for ( int i = start; i < nodes.Count && i <= stop; i++ ) 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object t = nodes[i]; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.Append( " " ); 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.Append( adaptor.GetToken( t ) ); 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf.ToString(); 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual string ToString( object start, object stop ) 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.WriteLine( "toString" ); 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( start == null || stop == null ) 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( p == -1 ) 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException( "Buffer is not yet filled." ); 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //Console.Out.WriteLine( "stop: " + stop ); 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( start is CommonTree ) 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.Write( "toString: " + ( (CommonTree)start ).Token + ", " ); 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.WriteLine( start ); 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( stop is CommonTree ) 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.WriteLine( ( (CommonTree)stop ).Token ); 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Console.Out.WriteLine( stop ); 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if we have the token stream, use that to dump text in order 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( tokens != null ) 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int beginTokenIndex = adaptor.GetTokenStartIndex( start ); 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int endTokenIndex = adaptor.GetTokenStopIndex( stop ); 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if it's a tree, use start/stop index from start node 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // else use token range from start/stop nodes 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( adaptor.GetType( stop ) == TokenTypes.Up ) 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver endTokenIndex = adaptor.GetTokenStopIndex( start ); 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( adaptor.GetType( stop ) == TokenTypes.EndOfFile ) 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver endTokenIndex = Count - 2; // don't use EOF 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokens.ToString( beginTokenIndex, endTokenIndex ); 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // walk nodes looking for start 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object t = null; 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i = 0; 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for ( ; i < nodes.Count; i++ ) 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = nodes[i]; 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t == start ) 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // now walk until we see stop, filling string buffer with text 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuilder buf = new StringBuilder(); 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = nodes[i]; 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( t != stop ) 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string text = adaptor.GetText( t ); 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( text == null ) 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = " " + adaptor.GetType( t ).ToString(); 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.Append( text ); 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = nodes[i]; 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // include stop node too 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string text2 = adaptor.GetText( stop ); 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( text2 == null ) 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text2 = " " + adaptor.GetType( stop ).ToString(); 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.Append( text2 ); 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf.ToString(); 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 664