import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
//-----------------------------------------------------------------------//
// Collector class and classes for collected elements:
//-----------------------------------------------------------------------//
/**
* Extends {@link AstVisitor} to provide data collection methods for those
* parts of the parse tree(s) that will be composed and translated. For
* composition of parse trees, build an empty <code>Collector</code> and
* apply it to all trees in order of composition, starting with the
* <em>base</em> tree. For translation of a single parse tree, apply a
* single empty <code>Collector</code> to the parse tree.
*
* @layer<collect>
*/
public class Collector extends AstVisitor {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// This section initializes data structures built by visitation:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
/**
* Bali rules are aggregated by rule name as a list of productions in
* order of declaration.
*
* @layer<collect>
*/
final public BaliRulesData
baliRules = new BaliRulesData() ;
/**
* Bali tokens are aggregated by name where later definitions of a name
* override the previous.
*
* @layer<collect>
*/
final public BaliTokensData
baliTokens = new BaliTokensData() ;
/**
* Java code blocks (handwritten parsing methods) are aggregated as a
* list in order of declaration.
*
* @layer<collect>
*/
final public JavaBlocksData
javaBlocks = new JavaBlocksData() ;
/**
* Option code blocks (for generated JavaCC code) are aggregated as a
* list in order of declaration.
*
* @layer<collect>
*/
final public OptionBlocksData
optionBlocks = new OptionBlocksData() ;
/**
* Parser code blocks (to be appended to generated JavaCC parser) are
* aggregated as a list in order of declaration.
*
* @layer<collect>
*/
final public ParserBlocksData
parserBlocks = new ParserBlocksData() ;
/**
* Regular expression token definitions are aggregated by (states,kind)
* as a list of definitions in order of declaration.
*
* @layer<collect>
*/
final public RegexTokensData
regexTokens = new RegexTokensData() ;
/**
* Token manager code blocks (for inclusion with generated JavaCC token
* manager) are aggregated as a list in order of declaration.
*
* @layer<collect>
*/
final public TokenManagerData
tknMgrBlocks = new TokenManagerData() ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// The "visit" methods follow. Their implementation is all of the form
// <code>data.addNode(node)</code> where <code>data</code> is one of
// the above data collection objects. See the actual code in the data
// collection classes; these are implemented using the layering scheme,
// so they may be refined in later layers.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
public void visit( BaliGrammarNode node ) {
baliRules.addNode( node ) ;
}
public void visit( BaliTokenDefineNode node ) {
baliTokens.addNode( node ) ;
}
public void visit( JavacodeNode node ) {
javaBlocks.addNode( node ) ;
}
public void visit( OptionsNode node ) {
optionBlocks.addNode( node ) ;
}
public void visit( ParserCodeNode node ) {
parserBlocks.addNode( node ) ;
}
public void visit( RegexDefinitionNode node ) {
regexTokens.addNode( node ) ;
}
public void visit( TokenManagerNode node ) {
tknMgrBlocks.addNode( node ) ;
}
}