// ============================================================================ // This file is generated by the Delphi Parser Generator. // ---------------------------------------------------------------------------- // DPG version: 1.0.1.0r // Grammar: hocLexer // ============================================================================ unit hocLexer; interface uses Classes, Contnrs, dpgLexer, dpgToken, dpgTypes, hocLexerTokens, SysUtils; type // ========================================================================= // Class ThocLexer declaration // ========================================================================= ThocLexer = class( TdpgLexer) protected // Internals procedure initialize; override; protected // Protected grammar rules procedure mUINT ( pCreate: boolean); procedure mDIGIT ( pCreate: boolean); protected // Public grammar rules ("rescoped") procedure mLPAREN ( pCreate: boolean); procedure mRPAREN ( pCreate: boolean); procedure mPLUS ( pCreate: boolean); procedure mMINUS ( pCreate: boolean); procedure mSTAR ( pCreate: boolean); procedure mSLASH ( pCreate: boolean); procedure mUNUMBER ( pCreate: boolean); procedure mNEWLINE ( pCreate: boolean); procedure mWHITESPACE ( pCreate: boolean); public function NextToken: IdpgToken; override; end; implementation uses dpgException, dpgExceptionSemantic, dpgExceptionMismatchedChar; // ============================================================================ // mLPAREN // ============================================================================ procedure ThocLexer.mLPAREN( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_LPAREN; 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; // ============================================================================ // mRPAREN // ============================================================================ procedure ThocLexer.mRPAREN( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_RPAREN; 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; // ============================================================================ // mPLUS // ============================================================================ procedure ThocLexer.mPLUS( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_PLUS; 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; // ============================================================================ // mMINUS // ============================================================================ procedure ThocLexer.mMINUS( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_MINUS; 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; // ============================================================================ // mSTAR // ============================================================================ procedure ThocLexer.mSTAR( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_STAR; 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; // ============================================================================ // mSLASH // ============================================================================ procedure ThocLexer.mSLASH( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_SLASH; 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; // ============================================================================ // mUNUMBER // ============================================================================ procedure ThocLexer.mUNUMBER( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_UNUMBER; mUINT(false); if (( LA(1) in ['.'])) then begin match('.'); mUINT(false); 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; // ============================================================================ // mUINT // ============================================================================ procedure ThocLexer.mUINT( pCreate: boolean); var _begin: integer; _cnt_40: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_UINT; _cnt_40 := 0; while(true) do begin if (( LA(1) in ['0'..'9'])) then begin mDIGIT(false); end else begin if _cnt_40 >= 1 then break else Raise EdpgMismatchedChar.Create( LA(1), ['0'..'9'], FileName, Line, Column); end; INC(_cnt_40); 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; // ============================================================================ // mDIGIT // ============================================================================ procedure ThocLexer.mDIGIT( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_DIGIT; match( ['0'..'9']); 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 ThocLexer.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); newLine; end else if (( LA(1) in [#13])) then begin match(#13); newLine; end else if (( LA(1) in [#10])) then begin match(#10); newLine; end else Raise EdpgMismatchedChar.Create( LA(1), [#10,#13], FileName, Line, Column); 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; // ============================================================================ // mWHITESPACE // ============================================================================ procedure ThocLexer.mWHITESPACE( pCreate: boolean); var _begin: integer; _save: integer; _token: IdpgToken; _ttype: integer; begin _begin := Length( fText) +1; _token := nil; _ttype := TT_WHITESPACE; if (( LA(1) in [' '])) then begin match(' '); end else if (( LA(1) in [#9])) then begin match(#9); tab; end else Raise EdpgMismatchedChar.Create( LA(1), [#9,' '], 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 ThocLexer.NextToken : IdpgToken; var _first : TdpgCharSet; begin _first := [#9..#10,#13,' ','('..'+','-','/'..'9']; while( true) do begin ResetText; try if (( LA(1) in ['('])) then begin mLPAREN(true); result := fReturnToken; end else if (( LA(1) in [')'])) then begin mRPAREN(true); result := fReturnToken; end else if (( LA(1) in ['+'])) then begin mPLUS(true); result := fReturnToken; end else if (( LA(1) in ['-'])) then begin mMINUS(true); result := fReturnToken; end else if (( LA(1) in ['*'])) then begin mSTAR(true); result := fReturnToken; end else if (( LA(1) in ['/'])) then begin mSLASH(true); result := fReturnToken; end else if (( LA(1) in ['0'..'9'])) then begin mUNUMBER(true); result := fReturnToken; end else if (( LA(1) in [#10,#13])) then begin mNEWLINE(true); result := fReturnToken; end else if (( LA(1) in [#9,' '])) then begin mWHITESPACE(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 ThocLexer.initialize; begin fCaseSensitive := false; fLiterals.CaseSensitive := false; end; end.