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 ******************************************************************************/ @SuppressWarnings ( { "all" } ) 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 ); } }