// ============================================================================ // This file is generated by the Delphi Parser Generator. // ---------------------------------------------------------------------------- // DPG version: 1.0.1.0r // Grammar: hocParser // ============================================================================ unit hocParser; interface uses Classes, Contnrs, dpgLLkParser, dpgToken, dpgTypes, hocParserTokens, SysUtils; type // ========================================================================= // Class ThocParser declaration // ========================================================================= ThocParser = class( TdpgLLkParser) public // Public grammar rules procedure prog ; function expression : double; function term : double; function factor : double; function uNumber : double; end; implementation uses dpgException, dpgExceptionSemantic, dpgExceptionMismatchedToken; // ============================================================================ // prog // ============================================================================ procedure ThocParser.prog; var val : double; begin while(true) do begin if (( LA(1) in [TT_LPAREN,TT_UNUMBER,TT_NEWLINE])) then begin if (( LA(1) in [TT_LPAREN,TT_UNUMBER])) then begin val := expression; end; match(TT_NEWLINE); end else break; end; end; // ============================================================================ // expression // ============================================================================ function ThocParser.expression: double; var val : double; begin result := term; while(true) do begin if (( LA(1) in [TT_PLUS])) then begin match(TT_PLUS); val := term; result := result + val; end else if (( LA(1) in [TT_MINUS])) then begin match(TT_MINUS); val := term; result := result - val; end else break; end; end; // ============================================================================ // term // ============================================================================ function ThocParser.term: double; var val : double; begin result := factor; while(true) do begin if (( LA(1) in [TT_STAR])) then begin match(TT_STAR); val := factor; result := result * val; end else if (( LA(1) in [TT_SLASH])) then begin match(TT_SLASH); val := factor; result := result / val; end else break; end; end; // ============================================================================ // factor // ============================================================================ function ThocParser.factor: double; begin if (( LA(1) in [TT_UNUMBER])) then begin result := uNumber; end else if (( LA(1) in [TT_LPAREN])) then begin match(TT_LPAREN); result := expression; match(TT_RPAREN); end else Raise EdpgMismatchedToken.Create( LT(1), [TT_LPAREN,TT_UNUMBER], FileName); end; // ============================================================================ // uNumber // ============================================================================ function ThocParser.uNumber: double; var n: IdpgToken; begin n := LT(1); match(TT_UNUMBER); result := StrToIntDef( n.TokenText); end; end.