import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
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.ListIterator;
import java.util.logging.Level;
//-----------------------------------------------------------------------//
// Composer-specific collections from the parse tree:
// (adds composer-specific {@link Object#toString()} methods)
//-----------------------------------------------------------------------//
public class BaliRulesData {
/**
* Formats Bali rules by concatenating them with blank line separation.
*
* @layer<composer>
*/
public String toString() {
List keys = new ArrayList( keySet() ) ;
StringBuffer buffer = new StringBuffer() ;
bufferRule( buffer, getStartName() ) ;
keys.remove( getStartName() ) ;
Collections.sort( keys ) ;
for ( Iterator p = keys.iterator() ; p.hasNext() ; ) {
buffer.append( Main.LINE_SEPARATOR ) ;
buffer.append( Main.LINE_SEPARATOR ) ;
bufferRule( buffer, ( String ) p.next() ) ;
}
return buffer.toString() ;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
private void bufferRule( StringBuffer buffer, String name ) {
buffer.append( name ) ;
List originals = ( List ) get( name ) ;
List productions = new ArrayList( originals.size() ) ;
HashMap namedRuleMap = new HashMap() ;
for ( Iterator p = originals.iterator() ; p.hasNext() ; ) {
Production production = ( Production ) p.next() ;
ProductionVisitor v = new ProductionVisitor() ;
v.dispatch( production ) ;
String ruleName = v.getRuleName() ;
if ( ruleName == null ) {
productions.add( production ) ;
continue ;
}
if ( namedRuleMap.get( ruleName ) == null ) {
productions.add( production ) ;
namedRuleMap.put( ruleName, production ) ;
}
}
char separator = ':' ;
for ( Iterator p = productions.iterator() ; p.hasNext() ; ) {
buffer.append( Main.LINE_SEPARATOR ) ;
buffer.append( '\t' ) ;
buffer.append( separator ) ;
buffer.append( p.next() ) ;
separator = '|' ;
}
buffer.append( Main.LINE_SEPARATOR ) ;
buffer.append( '\t' ) ;
buffer.append( ';' ) ;
}
}