package java_cup.runtime ; /** * Default Implementation for SymbolFactory, creates plain old Symbols * * @version last updated 27-03-2006 * @author Michael Petter */ /******************************************************************************* * class DefaultSymbolFactory interface for creating new symbols ******************************************************************************/ public class ComplexSymbolFactory implements SymbolFactory { public static class Location { private String unit = "unknown" ; private int line , column ; public Location ( String unit , int line , int column ) { this.unit = unit ; this.line = line ; this.column = column ; } public Location ( int line , int column ) { this.line = line ; this.column = column ; } public String toString ( ) { return unit + ":" + line + "/" + column ; } public int getColumn ( ) { return column ; } public int getLine ( ) { return line ; } public String getUnit ( ) { return unit ; } } /** * ComplexSymbol with detailed Location Informations and a Name */ public static class ComplexSymbol extends Symbol { protected String name ; protected Location xleft , xright ; public ComplexSymbol ( String name , int id ) { super ( id ) ; this.name = name ; } public ComplexSymbol ( String name , int id , Object value ) { super ( id , value ) ; this.name = name ; } public String toString ( ) { if ( xleft == null || xright == null ) return "Symbol: " + name ; return "Symbol: " + name + " (" + xleft + " - " + xright + ")" ; } public ComplexSymbol ( String name , int id , int state ) { super ( id , state ) ; this.name = name ; } public ComplexSymbol ( String name , int id , Symbol left , Symbol right ) { super ( id , left , right ) ; this.name = name ; if ( left != null ) this.xleft = ( ( ComplexSymbol ) left ).xleft ; if ( right != null ) this.xright = ( ( ComplexSymbol ) right ).xright ; } public ComplexSymbol ( String name , int id , Location left , Location right ) { super ( id ) ; this.name = name ; this.xleft = left ; this.xright = right ; } public ComplexSymbol ( String name , int id , Symbol left , Symbol right , Object value ) { super ( id , value ) ; this.name = name ; if ( left != null ) this.xleft = ( ( ComplexSymbol ) left ).xleft ; if ( right != null ) this.xright = ( ( ComplexSymbol ) right ).xright ; } public ComplexSymbol ( String name , int id , Location left , Location right , Object value ) { super ( id , value ) ; this.name = name ; this.xleft = left ; this.xright = right ; } public Location getLeft ( ) { return xleft ; } public Location getRight ( ) { return xright ; } } // Factory methods public Symbol newSymbol ( String name , int id , Location left , Location right , Object value ) { return new ComplexSymbol ( name , id , left , right , value ) ; } public Symbol newSymbol ( String name , int id , Location left , Location right ) { return new ComplexSymbol ( name , id , left , right ) ; } public Symbol newSymbol ( String name , int id , Symbol left , Symbol right , Object value ) { return new ComplexSymbol ( name , id , left , right , value ) ; } public Symbol newSymbol ( String name , int id , Symbol left , Symbol right ) { return new ComplexSymbol ( name , id , left , right ) ; } public Symbol newSymbol ( String name , int id ) { return new ComplexSymbol ( name , id ) ; } public Symbol newSymbol ( String name , int id , Object value ) { return new ComplexSymbol ( name , id , value ) ; } public Symbol startSymbol ( String name , int id , int state ) { return new ComplexSymbol ( name , id , state ) ; } }