Initial check in docu
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
unit hocLexer;
|
||||
|
||||
// ============================================================================
|
||||
// Lexer class declaration
|
||||
// ============================================================================
|
||||
lexer ThocLexer;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Lexer options
|
||||
// ----------------------------------------------------------------------------
|
||||
options
|
||||
{
|
||||
k = 2;
|
||||
exportVocab = hocLexer;
|
||||
caseSensitive = false;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Begin rule definitions
|
||||
//
|
||||
// Remember: All lexer rule names must begin with UPPERCASE letter!
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Simple tokens
|
||||
// ----------------------------------------------------------------------------
|
||||
LPAREN : '(';
|
||||
RPAREN : ')';
|
||||
|
||||
PLUS : '+';
|
||||
MINUS : '-';
|
||||
STAR : '*';
|
||||
SLASH : '/';
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// NUMBER
|
||||
// ----------------------------------------------------------------------------
|
||||
UNUMBER
|
||||
: UINT ('.' UINT)?
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// UINT
|
||||
// ----------------------------------------------------------------------------
|
||||
protected
|
||||
UINT
|
||||
: (DIGIT)+
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// DIGIT
|
||||
// ----------------------------------------------------------------------------
|
||||
protected
|
||||
DIGIT
|
||||
: '0'..'9'
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// NEWLINE
|
||||
// ----------------------------------------------------------------------------
|
||||
NEWLINE
|
||||
:
|
||||
(
|
||||
options
|
||||
{
|
||||
generateAmbigWarnings = false;
|
||||
}
|
||||
: '\r' '\n' { newLine; }
|
||||
| '\r' { newLine; }
|
||||
| '\n' { newLine; }
|
||||
)
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// WHITESPACE
|
||||
// ----------------------------------------------------------------------------
|
||||
WHITESPACE
|
||||
:
|
||||
(
|
||||
' '
|
||||
| '\t' { tab; }
|
||||
)
|
||||
{
|
||||
_ttype := TT_SKIP;
|
||||
}
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// End rule definitions
|
||||
// ============================================================================
|
||||
|
||||
@@ -0,0 +1,505 @@
|
||||
// ============================================================================
|
||||
// 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.
|
||||
@@ -0,0 +1,26 @@
|
||||
// ============================================================================
|
||||
// This file is generated by the Delphi Parser Generator.
|
||||
// ----------------------------------------------------------------------------
|
||||
// DPG version: 1.0.1.0r
|
||||
// Grammar: hocLexer
|
||||
// ============================================================================
|
||||
unit hocLexerTokens;
|
||||
|
||||
interface
|
||||
|
||||
const
|
||||
TT_EOF = 1;
|
||||
TT_LPAREN = 4;
|
||||
TT_RPAREN = 5;
|
||||
TT_PLUS = 6;
|
||||
TT_MINUS = 7;
|
||||
TT_STAR = 8;
|
||||
TT_SLASH = 9;
|
||||
TT_UNUMBER = 10;
|
||||
TT_UINT = 11;
|
||||
TT_DIGIT = 12;
|
||||
TT_NEWLINE = 13;
|
||||
TT_WHITESPACE = 14;
|
||||
|
||||
implementation
|
||||
end.
|
||||
@@ -0,0 +1,14 @@
|
||||
// $Delphi Parser Generator: hocLexer -> hocLexerTokens.txt$
|
||||
ThocLexer
|
||||
TT_EOF=1
|
||||
TT_LPAREN=4
|
||||
TT_RPAREN=5
|
||||
TT_PLUS=6
|
||||
TT_MINUS=7
|
||||
TT_STAR=8
|
||||
TT_SLASH=9
|
||||
TT_UNUMBER=10
|
||||
TT_UINT=11
|
||||
TT_DIGIT=12
|
||||
TT_NEWLINE=13
|
||||
TT_WHITESPACE=14
|
||||
@@ -0,0 +1,101 @@
|
||||
unit hocParser;
|
||||
|
||||
// ============================================================================
|
||||
// Parser class declaration
|
||||
// ============================================================================
|
||||
parser ThocParser;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Parser options
|
||||
// ----------------------------------------------------------------------------
|
||||
options
|
||||
{
|
||||
k = 2;
|
||||
importVocab = hocLexer;
|
||||
exportVocab = hocParser;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Begin rule definitions
|
||||
//
|
||||
// Remember: All parser rule names must begin with LOWERCASE letter!
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// prog
|
||||
// ----------------------------------------------------------------------------
|
||||
prog
|
||||
local
|
||||
{
|
||||
val : double;
|
||||
}
|
||||
:
|
||||
(
|
||||
(
|
||||
val = expression
|
||||
)?
|
||||
|
||||
NEWLINE
|
||||
)*
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// expression
|
||||
// ----------------------------------------------------------------------------
|
||||
expression returns [double]
|
||||
local
|
||||
{
|
||||
val : double;
|
||||
}
|
||||
: result = term
|
||||
(
|
||||
PLUS val = term { result := result + val; }
|
||||
| MINUS val = term { result := result - val; }
|
||||
)*
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// term
|
||||
// ----------------------------------------------------------------------------
|
||||
term returns [double]
|
||||
local
|
||||
{
|
||||
val : double;
|
||||
}
|
||||
: result = factor
|
||||
(
|
||||
STAR val = factor { result := result * val; }
|
||||
| SLASH val = factor { result := result / val; }
|
||||
)*
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// factor
|
||||
// ----------------------------------------------------------------------------
|
||||
factor returns [double]
|
||||
: result = uNumber
|
||||
| LPAREN result = expression RPAREN
|
||||
;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// uNumber
|
||||
// ----------------------------------------------------------------------------
|
||||
uNumber returns [double]
|
||||
: n:UNUMBER
|
||||
{
|
||||
result := StrToIntDef( n.TokenText);
|
||||
}
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// End rule definitions
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// This section is used for generating member defintions in the unit 'hocParser'.
|
||||
// The content of the section is verbatim copied into the generated code.
|
||||
// ----------------------------------------------------------------------------
|
||||
memberdef
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
// ============================================================================
|
||||
// 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.
|
||||
@@ -0,0 +1,26 @@
|
||||
// ============================================================================
|
||||
// This file is generated by the Delphi Parser Generator.
|
||||
// ----------------------------------------------------------------------------
|
||||
// DPG version: 1.0.1.0r
|
||||
// Grammar: hocParser
|
||||
// ============================================================================
|
||||
unit hocParserTokens;
|
||||
|
||||
interface
|
||||
|
||||
const
|
||||
TT_EOF = 1;
|
||||
TT_LPAREN = 4;
|
||||
TT_RPAREN = 5;
|
||||
TT_PLUS = 6;
|
||||
TT_MINUS = 7;
|
||||
TT_STAR = 8;
|
||||
TT_SLASH = 9;
|
||||
TT_UNUMBER = 10;
|
||||
TT_UINT = 11;
|
||||
TT_DIGIT = 12;
|
||||
TT_NEWLINE = 13;
|
||||
TT_WHITESPACE = 14;
|
||||
|
||||
implementation
|
||||
end.
|
||||
@@ -0,0 +1,14 @@
|
||||
// $Delphi Parser Generator: hocParser -> hocParserTokens.txt$
|
||||
ThocParser
|
||||
TT_EOF=1
|
||||
TT_LPAREN=4
|
||||
TT_RPAREN=5
|
||||
TT_PLUS=6
|
||||
TT_MINUS=7
|
||||
TT_STAR=8
|
||||
TT_SLASH=9
|
||||
TT_UNUMBER=10
|
||||
TT_UINT=11
|
||||
TT_DIGIT=12
|
||||
TT_NEWLINE=13
|
||||
TT_WHITESPACE=14
|
||||
Reference in New Issue
Block a user