package de.unisiegen.tpml.core.languages ;
import java.io.IOException ;
import de.unisiegen.tpml.core.prettyprinter.PrettyStyle ;
/**
* Abstract base class for classes that implement the
* {@link de.unisiegen.tpml.core.languages.LanguageScanner} interface.
*
* @author Benedikt Meurer
* @version $Rev:380 $
* @see de.unisiegen.tpml.core.languages.LanguageScanner
*/
public abstract class AbstractLanguageScanner implements LanguageScanner
{
/**
* Allocates a new <code>AbstractLanguageScanner</code>, which implements
* the <code>LanguageScanner</code> interface and should be used as base
* class for all scanners generated by JFlex.
*/
protected AbstractLanguageScanner ( )
{
super ( ) ;
}
//
// Symbol allocation (protected)
//
/**
* Allocates a new {@link LanguageSymbol} with the specified <code>name</code>
* and symbol <code>id</code>. The remaining parameters are optional, see
* the documentation of the {@link LanguageSymbol} class for details.
*
* @param name the name of the symbol.
* @param id the unique identifier of the symbol.
* @param left the left position of the symbol, or <code>-1</code>.
* @param right the right position of the symbol, or <code>-1</code>.
* @param value the value of the symbol.
* @return the generated {@link LanguageSymbol}.
*/
protected final LanguageSymbol symbol ( String name , int id , int left ,
int right , Object value )
{
return new LanguageSymbol ( name , id , left , right , value ) ;
}
/**
* {@inheritDoc}
*
* @see LanguageScanner#getStyleBySymbol(LanguageSymbol)
*/
public final PrettyStyle getStyleBySymbol ( LanguageSymbol symbol )
{
return getStyleBySymbolId ( symbol.getId ( ) ) ;
}
/**
* Returns the {@link PrettyStyle} for the specified symbol <code>id</code>,
* for example {@link PrettyStyle#KEYWORD} if the <code>id</code> refers to
* the token <code>"let"</code>. This method must be implemented by all
* lexers generated by JFlex.
*
* @param id the unique identifier of a symbol.
* @return the {@link PrettyStyle} for the symbol <code>id</code>.
* @see #getStyleBySymbol(LanguageSymbol)
*/
public abstract PrettyStyle getStyleBySymbolId ( int id ) ;
/**
* Implementation of the <code>next_token()</code> interface of the
* {@link java_cup.runtime.Scanner} interface. This is a simple wrapper around
* the <code>nextSymbol()</code> method, which automatically skips all
* symbols that should be ignored by the parser.
*
* @return the next symbol from the scanner, skipping all tokens that should
* be ignored by the parser, or <code>null</code> on end-of-file.
* @see java_cup.runtime.Scanner#next_token()
* @throws IOException if an error occurs while reading characters from the
* input source stream.
* @throws LanguageScannerException if a syntax error occurred while trying to
* scan the input stream.
*/
public final LanguageSymbol next_token ( ) throws IOException ,
LanguageScannerException
{
for ( ; ; )
{
// return the next symbol, skipping comments
LanguageSymbol symbol = nextSymbol ( ) ;
if ( symbol != null && getStyleBySymbol ( symbol ) == PrettyStyle.COMMENT )
continue ;
return symbol ;
}
}
}