import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* Extends {@link Main#driver(String[])} to generate warning and error
* messages about non-terminals in the grammar.
*
* @layer<requireBali2javacc>
*/
public class Main {
public Object driver( String[] args ) throws Throwable {
setVersion( "v2002.08.27" ) ;
Collector collector =
( Collector ) original( args ) ;
List messages = new ArrayList( unDefined( collector.baliRules ) ) ;
boolean hasErrors = ( ! messages.isEmpty() ) ;
messages.addAll( misRequired( collector.baliRules ) ) ;
messages.addAll( unReferenced( collector.baliRules ) ) ;
Collections.sort( messages ) ;
for ( Iterator p = messages.iterator() ; p.hasNext() ; )
System.err.println( ( String ) p.next() ) ;
if ( hasErrors )
throw new IllegalStateException( "undefined rules are referenced in grammar" ) ;
return collector ;
}
protected List misRequired( BaliRulesData rules ) {
List list = rules.misRequired() ;
for ( ListIterator p = list.listIterator() ; p.hasNext() ; ) {
String rule = ( String ) p.next() ;
p.set( "rule \""
+ rule
+ "\" is in a \"require\" statement, but is undefined" ) ;
}
return list ;
}
protected List unDefined( BaliRulesData rules ) {
List list = rules.misDefined() ;
for ( ListIterator p = list.listIterator() ; p.hasNext() ; ) {
String rule = ( String ) p.next() ;
p.set( "rule \""
+ rule
+ "\" is referenced but not defined" ) ;
}
return list ;
}
protected List unReferenced( BaliRulesData rules ) {
List list = rules.unReferenced() ;
for ( ListIterator p = list.listIterator() ; p.hasNext() ; ) {
String rule = ( String ) p.next() ;
p.set( "rule \""
+ rule
+ "\" is defined but not referenced" ) ;
}
return list ;
}
}