// ============================================================================ // 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.