Initial check in docu

This commit is contained in:
2026-01-03 18:31:15 +01:00
parent e2c3cbc520
commit ee130973e2
98 changed files with 9430 additions and 0 deletions
+91
View File
@@ -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
// ============================================================================
+505
View File
@@ -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.
+26
View File
@@ -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.
+14
View File
@@ -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
+101
View File
@@ -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
{
}
+170
View File
@@ -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