287 lines
6.9 KiB
ObjectPascal
287 lines
6.9 KiB
ObjectPascal
// ============================================================================
|
|
// This file is generated by the Delphi Parser Generator.
|
|
// ----------------------------------------------------------------------------
|
|
// DPG version: 1.0.0.118r
|
|
// Grammar: javalexer.g
|
|
// ============================================================================
|
|
unit JavaLexer;
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes,
|
|
Contnrs,
|
|
dpgLexer,
|
|
dpgToken,
|
|
dpgTokenStreamSelector,
|
|
dpgTypes,
|
|
JavaTokens,
|
|
SysUtils;
|
|
|
|
type
|
|
// =========================================================================
|
|
// Class TJavaLexer declaration
|
|
// =========================================================================
|
|
TJavaLexer = class( TdpgLexer)
|
|
|
|
public
|
|
Selector : IdpgTokenStreamSelector;
|
|
|
|
protected // Internals
|
|
procedure initialize; override;
|
|
|
|
protected // Public grammar rules ("rescoped")
|
|
procedure mSEMI ( pCreate: boolean);
|
|
procedure mJAVADOC_OPEN ( pCreate: boolean);
|
|
procedure mID ( pCreate: boolean);
|
|
procedure mWS ( pCreate: boolean);
|
|
|
|
public
|
|
function NextToken: IdpgToken; override;
|
|
end;
|
|
|
|
implementation
|
|
uses
|
|
dpgException,
|
|
dpgExceptionSemantic,
|
|
dpgExceptionMismatchedChar;
|
|
|
|
// ============================================================================
|
|
// mSEMI
|
|
// ============================================================================
|
|
procedure TJavaLexer.mSEMI( pCreate: boolean);
|
|
var
|
|
_begin: integer;
|
|
_save: integer;
|
|
_token: IdpgToken;
|
|
_ttype: integer;
|
|
|
|
begin
|
|
_begin := Length( fText) +1;
|
|
_token := nil;
|
|
_ttype := TT_SEMI;
|
|
|
|
match(';');
|
|
|
|
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_OPEN
|
|
// ============================================================================
|
|
procedure TJavaLexer.mJAVADOC_OPEN( pCreate: boolean);
|
|
var
|
|
_begin: integer;
|
|
_save: integer;
|
|
_token: IdpgToken;
|
|
_ttype: integer;
|
|
|
|
begin
|
|
_begin := Length( fText) +1;
|
|
_token := nil;
|
|
_ttype := TT_JAVADOC_OPEN;
|
|
|
|
match('/**');
|
|
Selector.Push('docLexer');
|
|
|
|
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 TJavaLexer.mID( pCreate: boolean);
|
|
var
|
|
_begin: integer;
|
|
_cnt_5: integer;
|
|
_save: integer;
|
|
_token: IdpgToken;
|
|
_ttype: integer;
|
|
|
|
begin
|
|
_begin := Length( fText) +1;
|
|
_token := nil;
|
|
_ttype := TT_ID;
|
|
|
|
_cnt_5 := 0;
|
|
|
|
while(true) do
|
|
begin
|
|
if (( LA(1) in ['a'..'z'])) then
|
|
begin
|
|
match( ['a'..'z']);
|
|
end
|
|
|
|
else
|
|
begin
|
|
if _cnt_5 >= 1 then
|
|
break
|
|
else
|
|
Raise EdpgMismatchedChar.Create( LA(1), ['a'..'z'], FileName, Line, Column);
|
|
end;
|
|
|
|
INC(_cnt_5);
|
|
end;
|
|
_ttype := testLit( _ttype);
|
|
|
|
|
|
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;
|
|
|
|
// ============================================================================
|
|
// mWS
|
|
// ============================================================================
|
|
procedure TJavaLexer.mWS( pCreate: boolean);
|
|
var
|
|
_begin: integer;
|
|
_save: integer;
|
|
_token: IdpgToken;
|
|
_ttype: integer;
|
|
|
|
begin
|
|
_begin := Length( fText) +1;
|
|
_token := nil;
|
|
_ttype := TT_WS;
|
|
|
|
if (( LA(1) in [' '])) then
|
|
begin
|
|
match(' ');
|
|
end
|
|
|
|
else if (( LA(1) in [#9])) then
|
|
begin
|
|
match(#9);
|
|
end
|
|
|
|
else if (( LA(1) in [#10,#13])) then
|
|
begin
|
|
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;
|
|
end
|
|
|
|
else
|
|
Raise EdpgMismatchedChar.Create( LA(1), [#9..#10,#13,' '], FileName, Line, Column);
|
|
_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 TJavaLexer.NextToken : IdpgToken;
|
|
var
|
|
_first : TdpgCharSet;
|
|
|
|
begin
|
|
_first := [#9..#10,#13,' ','/',';','a'..'z'];
|
|
|
|
while( true) do
|
|
begin
|
|
ResetText;
|
|
|
|
try
|
|
if (( LA(1) in [';'])) then
|
|
begin
|
|
mSEMI(true);
|
|
result := fReturnToken;
|
|
end
|
|
|
|
else if (( LA(1) in ['/'])) then
|
|
begin
|
|
mJAVADOC_OPEN(true);
|
|
result := fReturnToken;
|
|
end
|
|
|
|
else if (( LA(1) in ['a'..'z'])) then
|
|
begin
|
|
mID(true);
|
|
result := fReturnToken;
|
|
end
|
|
|
|
else if (( LA(1) in [#9..#10,#13,' '])) then
|
|
begin
|
|
mWS(true);
|
|
result := fReturnToken;
|
|
end
|
|
|
|
else
|
|
begin
|
|
if LA(1) = EOF_CHAR then
|
|
begin
|
|
uponEof;
|
|
result := TdpgToken.Create(TT_EOF);
|
|
end
|
|
|
|
else
|
|
Raise EdpgMismatchedChar.Create(LA(1), _first, FileName, Line, Column);
|
|
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
|
|
Raise;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// InitLiterals
|
|
// ----------------------------------------------------------------------------
|
|
procedure TJavaLexer.initialize;
|
|
begin
|
|
fLiterals.Add('int', 10);
|
|
end;
|
|
|
|
end.
|