Files
bds.mr.dpg/doc/tutorial/old/multiLexer/JavaDocLexer.pas
T
2026-01-03 18:31:15 +01:00

368 lines
8.6 KiB
ObjectPascal

// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javadoclexer.g
// ============================================================================
unit JavaDocLexer;
interface
uses
Classes,
Contnrs,
dpgLexer,
dpgToken,
dpgTokenStreamSelector,
dpgTypes,
JavaDocTokens,
SysUtils;
type
// =========================================================================
// Class TJavaDocLexer declaration
// =========================================================================
TJavaDocLexer = class( TdpgLexer)
public
Selector : IdpgTokenStreamSelector;
protected // Protected grammar rules
procedure mID ( pCreate: boolean);
protected // Public grammar rules ("rescoped")
procedure mPARAM ( pCreate: boolean);
procedure mEXCEPTION ( pCreate: boolean);
procedure mSTAR ( pCreate: boolean);
procedure mJAVADOC_CLOSE ( pCreate: boolean);
procedure mNEWLINE ( pCreate: boolean);
public
function NextToken: IdpgToken; override;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedChar;
// ============================================================================
// mPARAM
// ============================================================================
procedure TJavaDocLexer.mPARAM( pCreate: boolean);
var
_begin: integer;
_cnt_3: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_PARAM;
match('@param');
_cnt_3 := 0;
while(true) do
begin
if (( LA(1) in [' '])) then
begin
match(' ');
end
else
begin
if _cnt_3 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), [' '], FileName, Line, Column);
end;
INC(_cnt_3);
end;
mID(false);
if (_ttype <> TT_SKIP) and (pCreate = true) then
begin
_token := makeToken( _ttype);
_token.TokenText := Copy( fText, _begin, Length(fText)-_begin+1);
end;
fReturnToken := _token;
end;
// ============================================================================
// mID
// ============================================================================
procedure TJavaDocLexer.mID( pCreate: boolean);
var
_begin: integer;
_cnt_9: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_ID;
_cnt_9 := 0;
while(true) do
begin
if (( LA(1) in ['a'..'z'])) then
begin
match( ['a'..'z']);
end
else
begin
if _cnt_9 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), ['a'..'z'], FileName, Line, Column);
end;
INC(_cnt_9);
end;
if (_ttype <> TT_SKIP) and (pCreate = true) then
begin
_token := makeToken( _ttype);
_token.TokenText := Copy( fText, _begin, Length(fText)-_begin+1);
end;
fReturnToken := _token;
end;
// ============================================================================
// mEXCEPTION
// ============================================================================
procedure TJavaDocLexer.mEXCEPTION( pCreate: boolean);
var
_begin: integer;
_cnt_6: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_EXCEPTION;
match('@exception');
_cnt_6 := 0;
while(true) do
begin
if (( LA(1) in [' '])) then
begin
match(' ');
end
else
begin
if _cnt_6 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), [' '], FileName, Line, Column);
end;
INC(_cnt_6);
end;
mID(false);
if (_ttype <> TT_SKIP) and (pCreate = true) then
begin
_token := makeToken( _ttype);
_token.TokenText := Copy( fText, _begin, Length(fText)-_begin+1);
end;
fReturnToken := _token;
end;
// ============================================================================
// mSTAR
// ============================================================================
procedure TJavaDocLexer.mSTAR( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_STAR;
match('*');
_ttype := TT_SKIP;
if (_ttype <> TT_SKIP) and (pCreate = true) then
begin
_token := makeToken( _ttype);
_token.TokenText := Copy( fText, _begin, Length(fText)-_begin+1);
end;
fReturnToken := _token;
end;
// ============================================================================
// mJAVADOC_CLOSE
// ============================================================================
procedure TJavaDocLexer.mJAVADOC_CLOSE( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_JAVADOC_CLOSE;
match('*/');
Selector.Pop;
if (_ttype <> TT_SKIP) and (pCreate = true) then
begin
_token := makeToken( _ttype);
_token.TokenText := Copy( fText, _begin, Length(fText)-_begin+1);
end;
fReturnToken := _token;
end;
// ============================================================================
// mNEWLINE
// ============================================================================
procedure TJavaDocLexer.mNEWLINE( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_NEWLINE;
if (( LA(1) in [#13]) and (LA(2) in [#10])) then
begin
match(#13);
match(#10);
end
else if (( LA(1) in [#13])) then
begin
match(#13);
end
else if (( LA(1) in [#10])) then
begin
match(#10);
end
else
Raise EdpgMismatchedChar.Create( LA(1), [#10,#13], FileName, Line, Column);
newLine;
_ttype := TT_SKIP;
if (_ttype <> TT_SKIP) and (pCreate = true) then
begin
_token := makeToken( _ttype);
_token.TokenText := Copy( fText, _begin, Length(fText)-_begin+1);
end;
fReturnToken := _token;
end;
// ----------------------------------------------------------------------------
// NextToken
// ----------------------------------------------------------------------------
function TJavaDocLexer.NextToken : IdpgToken;
var
la1 : char;
la2 : char;
begin
while( true) do
begin
ResetText;
try
la1 := LA(1);
la2 := LA(2);
if (( LA(1) in ['@']) and (LA(2) in ['p'])) then
begin
mPARAM(true);
result := fReturnToken;
end
else if (( LA(1) in ['@']) and (LA(2) in ['e'])) then
begin
mEXCEPTION(true);
result := fReturnToken;
end
else if (( LA(1) in ['*']) and (LA(2) in ['/'])) then
begin
mJAVADOC_CLOSE(true);
result := fReturnToken;
end
else if (( LA(1) in ['*'])) then
begin
mSTAR(true);
result := fReturnToken;
end
else if (( LA(1) in [#10,#13])) then
begin
mNEWLINE(true);
result := fReturnToken;
end
else
begin
if LA(1) = EOF_CHAR then
begin
uponEof;
result := TdpgToken.Create(TT_EOF);
end
else
begin
consume;
continue;
end;
end;
// --------------------------------------------------------------
// If we found a SKIP token, then try again...
// --------------------------------------------------------------
if result = nil then
continue;
// --------------------------------------------------------------
// Now we have a valid token, so exit the function
// --------------------------------------------------------------
break;
except
consume;
continue;
end;
end;
end;
end.