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