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.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.TreeMap; import java.util.Properties; import java.util.Random; import java.util.Set; import java.util.logging.Level; //-----------------------------------------------------------------------// // Specialized sub-classes of AST nodes: //-----------------------------------------------------------------------// /** * Represents the merger of a "named rule" with an "unnamed rule" where * the two both start with the same non-terminal symbol. * * @layer<bali2javacc> */ public class Merger extends ProductionNode { public Merger( String ruleName, IdentifierNode nonTerminal ) { this.namedNode = null ; this.nonTerminal = nonTerminal ; this.ruleName = ruleName ; this.unnamedNode = null ; } public ProductionNode getNamed() { return namedNode ; } public IdentifierNode getNonterminal() { return nonTerminal ; } public String getRule() { return ruleName ; } public ProductionNode getUnnamed() { return unnamedNode ; } public boolean isComplete() { return namedNode != null && unnamedNode != null ; } public void setNamed( ProductionNode node ) { if ( this.namedNode != null && node != null ) throw new IllegalStateException( "multiple named rules: " + this ) ; this.namedNode = node ; } public void setUnnamed( ProductionNode node ) { if ( this.unnamedNode != null && node != null ) throw new IllegalStateException( "multiple unnamed rules: " + this ) ; this.unnamedNode = node ; } public String toString() { return "[rule->" + ruleName + ", nonTerminal->" + nonTerminal.tok[0].tokenName() + ", unnamed->" + unnamedNode + ", named->" + namedNode + ']' ; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // private ProductionNode namedNode ; private ProductionNode unnamedNode ; final private IdentifierNode nonTerminal ; final private String ruleName ; }