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