171 lines
3.6 KiB
ObjectPascal
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.
|