VistA-cprs/VA/HRParserPas.pas

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.