232 lines
8.2 KiB
ObjectPascal
232 lines
8.2 KiB
ObjectPascal
unit dpgrtl.parser;
|
|
|
|
interface
|
|
uses
|
|
System.SysUtils,
|
|
dpgrtl.types;
|
|
|
|
type
|
|
TParser = class
|
|
protected
|
|
fParserState : IParserState;
|
|
|
|
// ----------------------------------------------------------------------
|
|
// Interface
|
|
// ----------------------------------------------------------------------
|
|
public
|
|
procedure ConsumeUntil( ATokenType : byte); overload;
|
|
procedure ConsumeUntil( ATokenSet : TByteSet); overload;
|
|
|
|
procedure Match( ATokenSet : TByteSet); overload;
|
|
procedure Match( ATokenType : byte); overload;
|
|
procedure MatchNot( ATokenType : byte);
|
|
|
|
function Mark: integer; virtual;
|
|
procedure Rewind( Pos: integer); virtual;
|
|
|
|
procedure ReportError( e: Exception); overload; virtual;
|
|
procedure ReportError( s: string); overload; virtual;
|
|
|
|
procedure Consume; virtual; abstract;
|
|
function LA(i:integer): byte; virtual; abstract;
|
|
function LT(i:integer): IToken; virtual; abstract;
|
|
|
|
// ----------------------------------------------------------------------
|
|
// Construction/destruction
|
|
// ----------------------------------------------------------------------
|
|
public
|
|
constructor Create( AState : IParserState); overload;
|
|
constructor Create( ABuffer: ITokenBuffer); overload;
|
|
constructor Create( AStream: ITokenStream); overload;
|
|
|
|
// ----------------------------------------------------------------------
|
|
public
|
|
property InputState : IParserState read fParserState
|
|
write fParserState;
|
|
end;
|
|
|
|
TParserClass = class of TParser;
|
|
|
|
implementation
|
|
uses
|
|
dpgrtl.exception,
|
|
dpgrtl.parserstate,
|
|
dpgrtl.tokenbuffer;
|
|
|
|
{ TParser }
|
|
|
|
// @@@: Construction/destruction ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Construction/destruction
|
|
//
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ================================================================================================
|
|
// Constructor(ParserState)
|
|
// ================================================================================================
|
|
constructor TParser.Create(AState: IParserState);
|
|
begin
|
|
inherited Create;
|
|
fParserState := AState
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Constructor(TokenBuffer)
|
|
// ================================================================================================
|
|
constructor TParser.Create(ABuffer: ITokenBuffer);
|
|
begin
|
|
inherited Create;
|
|
fParserState := TParserState.Create( ABuffer)
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Constructor(TokenStream)
|
|
// ================================================================================================
|
|
constructor TParser.Create(AStream: ITokenStream);
|
|
var
|
|
tb: TTokenBuffer;
|
|
|
|
begin
|
|
inherited Create;
|
|
|
|
tb := TTokenBuffer.Create(AStream);
|
|
fParserState := TParserState.Create(tb);
|
|
end;
|
|
|
|
// @@@: Interface +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Interface
|
|
//
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// ================================================================================================
|
|
// ConsumeUntil(TokenType)
|
|
// ================================================================================================
|
|
procedure TParser.ConsumeUntil(ATokenType: byte);
|
|
var
|
|
la1: byte;
|
|
|
|
begin
|
|
la1 := LA(1);
|
|
|
|
while (la1 <> TT_EOF) and (la1 <> ATokenType) do
|
|
begin
|
|
Consume;
|
|
la1 := LA(1)
|
|
end
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// ConsumeUntil(TokenSet)
|
|
// ================================================================================================
|
|
procedure TParser.ConsumeUntil(ATokenSet: TByteSet);
|
|
var
|
|
la1: byte;
|
|
|
|
begin
|
|
la1 := LA(1);
|
|
|
|
while (la1 <> TT_EOF) and not(la1 in ATokenSet) do
|
|
begin
|
|
Consume;
|
|
la1 := LA(1)
|
|
end
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Match Not
|
|
//
|
|
// Make sure current lookahead symbol NOT matches token type 'pTokenType'. Throw an exception
|
|
// upon mismatch, which is catched by either the error handler or by the syntactic predicate.
|
|
// ================================================================================================
|
|
procedure TParser.MatchNot(ATokenType: byte);
|
|
var
|
|
la1: byte;
|
|
|
|
begin
|
|
la1 := LA(1);
|
|
|
|
if la1 = ATokenType
|
|
then Raise EMismatchedToken.Create( LT(1), ATokenType, fParserState.FileName, true)
|
|
else Consume
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Match
|
|
//
|
|
// Make sure current lookahead symbol matches token type 'pTokenType'. Throw an exception upon
|
|
// mismatch, which is catched by either the error handler or by the syntactic predicate.
|
|
// ================================================================================================
|
|
procedure TParser.Match(ATokenType: byte);
|
|
var
|
|
la1: byte;
|
|
lt1: IToken;
|
|
|
|
begin
|
|
la1 := LA(1);
|
|
|
|
if la1 <> ATokenType then
|
|
begin
|
|
lt1 := LT(1);
|
|
Raise EMismatchedToken.Create( lt1, ATokenType, fParserState.FileName, false)
|
|
end;
|
|
|
|
Consume
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Match
|
|
//
|
|
// Make sure current lookahead symbol matches the given set. Throw an exception upon mismatch,
|
|
// which is catched by either the error handler or by the syntactic predicate.
|
|
// ================================================================================================
|
|
procedure TParser.Match(ATokenSet: TByteSet);
|
|
var
|
|
la1: byte;
|
|
|
|
begin
|
|
la1 := LA(1);
|
|
|
|
if not (la1 in ATokenSet)
|
|
then Raise EMismatchedToken.Create( LT(1), ATokenSet, fParserState.FileName, false)
|
|
else Consume
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Mark
|
|
// ================================================================================================
|
|
function TParser.Mark: integer;
|
|
begin
|
|
result := fParserState.InputBuffer.Mark
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Rewind
|
|
// ================================================================================================
|
|
procedure TParser.Rewind(Pos: integer);
|
|
begin
|
|
fParserState.InputBuffer.Rewind(Pos)
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Report Error
|
|
// ================================================================================================
|
|
procedure TParser.ReportError(e: Exception);
|
|
begin
|
|
end;
|
|
|
|
// ================================================================================================
|
|
// Report Error
|
|
// ================================================================================================
|
|
procedure TParser.ReportError(s: string);
|
|
begin
|
|
end;
|
|
|
|
end.
|