Packageorg.antlr.runtime.tree
Classpublic class RewriteRuleElementStream
SubclassesRewriteRuleNodeStream, RewriteRuleSubtreeStream, RewriteRuleTokenStream

A generic list of elements tracked in an alternative to be used in a -> rewrite rule. We need to subclass to fill in the next() method, which returns either an AST node wrapped around a token payload or an existing subtree. Once you start next()ing, do not try to add more elements. It will break the cursor tracking I believe.

See also

org.antlr.runtime.tree.RewriteRuleSubtreeStream
TODO: add mechanism to detect/puke on modification after reading from stream


Public Properties
 PropertyDefined by
  description : String
[read-only]
RewriteRuleElementStream
  hasNext : Boolean
[read-only]
RewriteRuleElementStream
  size : int
[read-only]
RewriteRuleElementStream
Protected Properties
 PropertyDefined by
  adaptor : TreeAdaptor
RewriteRuleElementStream
  cursor : int = 0
Cursor 0..n-1.
RewriteRuleElementStream
  dirty : Boolean = false
Once a node / subtree has been used in a stream, it must be dup'd from then on.
RewriteRuleElementStream
  elementDescription : String
The element or stream description; usually has name of the token or rule reference that this list tracks.
RewriteRuleElementStream
  elements : Array
The list of tokens or subtrees we are tracking
RewriteRuleElementStream
  singleElement : Object
Track single elements w/o creating a list.
RewriteRuleElementStream
Public Methods
 MethodDefined by
  
RewriteRuleElementStream(adaptor:TreeAdaptor, elementDescription:String, element:Object = null)
RewriteRuleElementStream
  
add(el:Object):void
RewriteRuleElementStream
  
nextTree():Object
Return the next element in the stream.
RewriteRuleElementStream
  
reset():void
Reset the condition of this stream so that it appears we have not consumed any of its elements.
RewriteRuleElementStream
Protected Methods
 MethodDefined by
  
_next():Object
do the work of getting the next element, making sure that it's a tree node or subtree.
RewriteRuleElementStream
  
dup(el:Object):Object
When constructing trees, sometimes we need to dup a token or AST subtree.
RewriteRuleElementStream
  
toTree(el:Object):Object
Ensure stream emits trees; tokens must be converted to AST nodes.
RewriteRuleElementStream
Property detail
adaptorproperty
protected var adaptor:TreeAdaptor
cursorproperty 
protected var cursor:int = 0

Cursor 0..n-1. If singleElement!=null, cursor is 0 until you next(), which bumps it to 1 meaning no more elements.

descriptionproperty 
description:String  [read-only]Implementation
    public function get description():String
dirtyproperty 
protected var dirty:Boolean = false

Once a node / subtree has been used in a stream, it must be dup'd from then on. Streams are reset after subrules so that the streams can be reused in future subrules. So, reset must set a dirty bit. If dirty, then next() always returns a dup. I wanted to use "naughty bit" here, but couldn't think of a way to use "naughty".

elementDescriptionproperty 
protected var elementDescription:String

The element or stream description; usually has name of the token or rule reference that this list tracks. Can include rulename too, but the exception would track that info.

elementsproperty 
protected var elements:Array

The list of tokens or subtrees we are tracking

hasNextproperty 
hasNext:Boolean  [read-only]Implementation
    public function get hasNext():Boolean
singleElementproperty 
protected var singleElement:Object

Track single elements w/o creating a list. Upon 2nd add, alloc list

sizeproperty 
size:int  [read-only]Implementation
    public function get size():int
Constructor detail
RewriteRuleElementStream()constructor
public function RewriteRuleElementStream(adaptor:TreeAdaptor, elementDescription:String, element:Object = null)Parameters
adaptor:TreeAdaptor
 
elementDescription:String
 
element:Object (default = null)
Method detail
_next()method
protected function _next():Object

do the work of getting the next element, making sure that it's a tree node or subtree. Deal with the optimization of single- element list versus list of size > 1. Throw an exception if the stream is empty or we're out of elements and size>1. protected so you can override in a subclass if necessary.

Returns
Object
add()method 
public function add(el:Object):voidParameters
el:Object
dup()method 
protected function dup(el:Object):Object

When constructing trees, sometimes we need to dup a token or AST subtree. Dup'ing a token means just creating another AST node around it. For trees, you must call the adaptor.dupTree() unless the element is for a tree root; then it must be a node dup.

Parameters
el:Object

Returns
Object
nextTree()method 
public function nextTree():Object

Return the next element in the stream. If out of elements, throw an exception unless size()==1. If size is 1, then return elements[0]. Return a duplicate node/subtree if stream is out of elements and size==1. If we've already used the element, dup (dirty bit set).

Returns
Object
reset()method 
public function reset():void

Reset the condition of this stream so that it appears we have not consumed any of its elements. Elements themselves are untouched. Once we reset the stream, any future use will need duplicates. Set the dirty bit.

toTree()method 
protected function toTree(el:Object):Object

Ensure stream emits trees; tokens must be converted to AST nodes. AST nodes can be passed through unmolested.

Parameters
el:Object

Returns
Object