package sicel.compiler.parser.internal;
import java.io.File;
import sicel.compiler.parser.ASTNode;
import sicel.compiler.parser.Lexer;
import sicel.compiler.parser.Parser;
import sicel.compiler.parser.Token;
import sicel.compiler.parser.exceptions.SyntaxError;
import sicel.compiler.parser.exceptions.UnexpectedTokenError;
public abstract class AbstractParser implements Parser
{
protected Lexer lexer;
protected Token consumedToken;
protected ASTNode consumedNode;
@Override
public void setLexer(Lexer lexer)
{
this.lexer = lexer;
}
public abstract ASTNode parse( File file );
protected final Token expect( Class<? extends Token> tokenType )
{
Token t = lexer.take();
if( t == null )
{
throw new SyntaxError("Unexpected EOF", "", 0, 0);
}
if( ! t.getClass().equals( tokenType ) )
{
throw new UnexpectedTokenError( t, tokenType );
}
return t;
}
protected final boolean consumeIf( Class<? extends Token> tokenType )
{
Token t = lexer.peek();
if( t == null ) return false;
if( t.getClass().equals( tokenType ) )
{
consumedToken = lexer.take();
return true;
}
return false;
}
protected final boolean lookAhead( int depth, Class<? extends Token> tokenType )
{
Token t = lexer.lookAhead( depth );
if( t == null ) return false;
return ( t.getClass().equals( tokenType ) );
}
}