import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.regex.*;
import java.util.logging.Level;
import Jakarta.loader.Loader;
import Jakarta.loader.PrefixClassLoader;
import java.io.*;
import java.util.*;
import java.lang.*;
public class BaliRulesData {
/**
* Collects all non-terminals and rule names into {@link classNames}
*
*/
public void collectClasses(StringBuffer className) {
//Handles each production
for ( Iterator p = entrySet().iterator() ; p.hasNext() ; ) {
//entry is a (name, production) pair
Map.Entry entry = ( Map.Entry ) p.next() ;
String ruleName = ( String ) entry.getKey() ;
ruleClass( ruleName, className) ;
List productions = ( List ) entry.getValue() ;
for ( Iterator q = productions.iterator() ; q.hasNext() ; ) {
Production production = ( Production ) q.next() ;
productionClass( ruleName, production, className) ;
}
}
}
/**
* Collects the ":: ruleName " part for a production
*
*/
private void productionClass( String base, Production prod, StringBuffer className) {
// The production is a (item)+ list
ProductionNode prodNode = ( ProductionNode ) prod ;
Rewrite rewrite = ( Rewrite ) prodNode.arg [1] ;
if ( rewrite instanceof SimpleListNode )
return ;
// The production is a "item1 (item2)*" list:
PrimitiveRewriteNode prn = ( PrimitiveRewriteNode ) rewrite ;
PrimitiveRewrite pr = ( PrimitiveRewrite ) prn.arg [1] ;
if ( pr instanceof ComplexListNode )
return;
// Named pattern (i.e., ":: NodeName" at production's end):
PatternNode patternNode = ( PatternNode ) pr ;
AstNode classNameNode = patternNode.arg[1].arg [0] ;
if ( classNameNode != null ) {
ClassNameNode node = ( ClassNameNode ) classNameNode ;
String name = node.tok[1].getTokenName() ;
className.append(name);
className.append(" ");
return ;
}
// Don't generate a class for unnamed pattern *sequences*
if ( patternNode.arg[0].arg [0] != null )
throw new IllegalStateException( "unnamed rule with right-hand sequence: " + base ) ;
// What remains are productions with a singleton fields.
// If the field is a rule name, it's an unnamed rule:
//
Primitive prim = ( Primitive ) prn.arg [0] ;
if ( prim instanceof IdentifierNode ) {
return ;
}
return ;
}
private void ruleClass( String base, StringBuffer className ) {
className.append(base);
className.append(" ");
}
}