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 );
}
}