Files
bds.mr.dpg/doc/tutorial/hoc/hoc 1/hocParser.pas
T
2026-01-03 18:31:15 +01:00

171 lines
3.6 KiB
ObjectPascal

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