236 lines
6.4 KiB
Plaintext
236 lines
6.4 KiB
Plaintext
// HRParserPas v1.0.1 (25.Sep.2000)
|
|
// Fast Pascal source code parser.
|
|
// by Colin A Ridgewell
|
|
//
|
|
// Copyright (C) 1999,2000 Hayden-R Ltd
|
|
// http://www.haydenr.com
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify it
|
|
// under the terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 2 of the License, or (at your
|
|
// option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful, but
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
// more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License along
|
|
// with this program (gnu_license.htm); if not, write to the
|
|
//
|
|
// Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
//
|
|
// To contact us via e-mail use the following addresses...
|
|
//
|
|
// bug@haydenr.u-net.com - to report a bug
|
|
// support@haydenr.u-net.com - for general support
|
|
// wishlist@haydenr.u-net.com - add new requirement to wish list
|
|
//
|
|
unit HRParserPas;
|
|
|
|
interface
|
|
|
|
uses
|
|
HRParser;
|
|
|
|
const
|
|
{THRParserPas tokens.}
|
|
HR_TOKEN_PAS_COMMENT_BRACE_OPEN = 7; //e.g. {
|
|
HR_TOKEN_PAS_COMMENT_BRACE = 8; //e.g. { }
|
|
HR_TOKEN_PAS_COMMENT_BRACKET_OPEN = 9; //e.g. (*
|
|
HR_TOKEN_PAS_COMMENT_BRACKET = 10; //e.g. (* *)
|
|
HR_TOKEN_PAS_COMMENT_SLASH = 11; //e.g. //
|
|
HR_TOKEN_PAS_STRING_OPEN = 12; //e.g. '
|
|
HR_TOKEN_PAS_STRING = 13; //e.g. ' '
|
|
HR_TOKEN_PAS_EMBEDDEDCHAR = 14; //e.g. #10
|
|
HR_TOKEN_PAS_HEX = 15; //e.g. $A3
|
|
|
|
HR_TOKEN_PAS_DESC : Array[ 0..15 ] of PChar = (
|
|
'nil',
|
|
'eof',
|
|
'char',
|
|
'space',
|
|
'symbol',
|
|
'integer',
|
|
'float',
|
|
'comment brace open',
|
|
'comment brace',
|
|
'comment bracket open',
|
|
'comment bracket',
|
|
'comment slash',
|
|
'string open',
|
|
'string',
|
|
'embbeded char',
|
|
'hex');
|
|
|
|
type
|
|
THRParserPas = class( THRParserText )
|
|
private
|
|
protected
|
|
procedure GetNextToken; override;
|
|
public
|
|
constructor Create; override;
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
|
|
{ T H R P a r s e r P a s }
|
|
|
|
constructor THRParserPas.Create;
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
|
|
destructor THRParserPas.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
|
|
procedure THRParserPas.GetNextToken;
|
|
begin
|
|
repeat
|
|
|
|
{comments} { } // - can go across multiple lines
|
|
if FSourceBuf[ FSourcePos ] = '{' then
|
|
begin
|
|
{move past open comment}
|
|
Inc( FSourcePos );
|
|
while True do
|
|
begin
|
|
case FSourceBuf[ FSourcePos ] of
|
|
#0 :
|
|
begin
|
|
FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACE_OPEN;
|
|
Break;{out of while}
|
|
end;
|
|
'}' :
|
|
begin
|
|
FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACE;
|
|
{move past close comment}
|
|
Inc( FSourcePos );
|
|
Break;{out of while}
|
|
end;
|
|
else
|
|
begin
|
|
FTokenBuf.Write( FSourceBuf[ FSourcePos ] );
|
|
if FSourceBuf[ FSourcePos ] = #10 then IncLine;
|
|
Inc( FSourcePos );
|
|
end;
|
|
end;
|
|
end;
|
|
Break;{out of repeat}
|
|
end;
|
|
|
|
{comments} (* *) // - can go across multiple lines
|
|
if ( FSourceBuf[ FSourcePos ] = '(' ) and ( FSourceBuf[ FSourcePos + 1 ] = '*' ) then
|
|
begin
|
|
{Move past open comment}
|
|
Inc( FSourcePos, 2 );
|
|
while True do
|
|
begin
|
|
if FSourceBuf[ FSourcePos ] = #0 then
|
|
begin
|
|
FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACKET_OPEN;
|
|
Break;{out of while}
|
|
end;
|
|
if ( ( FSourceBuf[ FSourcePos ] = '*' ) and ( FSourceBuf[ FSourcePos + 1 ] = ')' ) ) then
|
|
begin
|
|
FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACKET;
|
|
{move past close comment}
|
|
Inc( FSourcePos, 2 );
|
|
Break;{out of while}
|
|
end;
|
|
FTokenBuf.Write( FSourceBuf[ FSourcePos ] );
|
|
if FSourceBuf[ FSourcePos ] = #10 then IncLine;
|
|
Inc( FSourcePos );
|
|
end;
|
|
Break;{out of repeat}
|
|
end;
|
|
|
|
{comments} // - remainder of current line
|
|
if ( FSourceBuf[ FSourcePos ] = '/' ) and ( FSourceBuf[ FSourcePos + 1 ] = '/' ) then
|
|
begin
|
|
{move past open comment}
|
|
Inc( FSourcePos, 2 );
|
|
FToken.TokenType := HR_TOKEN_PAS_COMMENT_SLASH;
|
|
while FSourceBuf[ FSourcePos ] <> #13 do
|
|
begin
|
|
FTokenBuf.Write( FSourceBuf[ FSourcePos ] );
|
|
if FSourceBuf[ FSourcePos ] = #10 then IncLine;
|
|
Inc( FSourcePos );
|
|
end;
|
|
Break;{out of repeat}
|
|
end;
|
|
|
|
{quoted strings}
|
|
if FSourceBuf[ FSourcePos ] = '''' then
|
|
begin
|
|
{Move past open quote}
|
|
Inc( FSourcePos );
|
|
while True do
|
|
begin
|
|
case FSourceBuf[ FSourcePos ] of
|
|
#0, #10, #13 :
|
|
begin
|
|
FToken.TokenType := HR_TOKEN_PAS_STRING_OPEN;
|
|
Break;{out of while}
|
|
end;
|
|
'''' :
|
|
begin
|
|
FToken.TokenType := HR_TOKEN_PAS_STRING;
|
|
Break;{out of while}
|
|
end;
|
|
else
|
|
begin
|
|
FTokenBuf.Write( FSourceBuf[ FSourcePos ] );
|
|
Inc( FSourcePos );
|
|
end;
|
|
end;
|
|
end;
|
|
{move past close quote}
|
|
Inc( FSourcePos );
|
|
Break;{out of repeat}
|
|
end;
|
|
|
|
{embedded ascii eg #13}
|
|
if FSourceBuf[ FSourcePos ] = '#' then
|
|
begin
|
|
//FTokenBuf.Write(FSourceBuf[FSourcePos]);
|
|
Inc( FSourcePos );
|
|
while FSourceBuf[ FSourcePos ] in [ '0'..'9' ] do
|
|
begin
|
|
FTokenBuf.Write( FSourceBuf[ FSourcePos ] );
|
|
Inc( FSourcePos );
|
|
end;
|
|
FToken.TokenType := HR_TOKEN_PAS_EMBEDDEDCHAR;
|
|
Break;{out of repeat}
|
|
end;
|
|
|
|
{hex numbers}
|
|
if FSourceBuf[ FSourcePos ] = '$' then
|
|
begin
|
|
//FTokenBuf.Write(FSourceBuf[FSourcePos]);
|
|
Inc( FSourcePos );
|
|
while FSourceBuf[ FSourcePos ] in [ '0'..'9', 'A'..'F', 'a'..'f' ] do
|
|
begin
|
|
FTokenBuf.Write( FSourceBuf[ FSourcePos ] );
|
|
Inc( FSourcePos );
|
|
end;
|
|
FToken.TokenType := HR_TOKEN_PAS_HEX;
|
|
Break;{out of repeat}
|
|
end;
|
|
|
|
inherited GetNextToken;
|
|
{Break;}{out of repeat}
|
|
|
|
until( True );
|
|
end;
|
|
|
|
|
|
end.
|