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
+36
View File
@@ -0,0 +1,36 @@
program calc;
{$APPTYPE CONSOLE}
uses
Classes,
SysUtils,
calcLexer in 'calcLexer.pas',
calcParser in 'calcParser.pas';
var
stm: TFileStream;
lex: TcalcLexer;
par: TcalcParser;
begin
if ParamCount <> 1 then
begin
writeln('usage: calc <filename>');
exit;
end
else
begin
try
stm := TFileStream.Create( ParamStr(1), fmOpenRead);
lex := TcalcLexer.Create(stm);
par := TcalcParser.Create(lex);
par.calc;
except
end;
end;
stm.Free;
par.Free;
end.
+5
View File
@@ -0,0 +1,5 @@
1+2+3+4+5+6+7+8+9;
(((((2+3)))));
(-1*(-2*(-3*(-4+ -5))));
(-1*(-2*(-3*(-4+ 5))));
7 * -(-9);
+49
View File
@@ -0,0 +1,49 @@
// ============================================================================
// Demo lexer for four operator calculator
// ============================================================================
unit calcLexer;
lexer TcalcLexer;
options
{
exportVocab = calcLexer;
}
// ============================================================================
// Simple tokens
// ============================================================================
LPAREN : '(';
RPAREN : ')';
PLUS : '+';
MINUS : '-';
STAR : '*';
SLASH : '/';
SEMI : ';';
// ============================================================================
// INT
// ============================================================================
INT : ('0'..'9')+;
// ============================================================================
// White space
// ============================================================================
WS
:
(
options
{
generateAmbigWarnings = false;
}
: '\r' '\n' { newLine; }
| '\r' { newLine; }
| '\n' { newLine; }
| '\t' { tab; }
| ' '
)
{
_ttype := TT_SKIP;
}
;
+430
View File
@@ -0,0 +1,430 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.1.0d
// Grammar: calcLexer
// ============================================================================
unit calcLexer;
interface
uses
calcLexerTokens,
Classes,
Contnrs,
dpgLexer,
dpgToken,
dpgTypes,
SysUtils;
type
// =========================================================================
// Class TcalcLexer declaration
// =========================================================================
TcalcLexer = class( TdpgLexer)
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 mSEMI ( pCreate: boolean);
procedure mINT ( pCreate: boolean);
procedure mWS ( pCreate: boolean);
public
function NextToken: IdpgToken; override;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedChar;
// ============================================================================
// mLPAREN
// ============================================================================
procedure TcalcLexer.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 TcalcLexer.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 TcalcLexer.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 TcalcLexer.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 TcalcLexer.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 TcalcLexer.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;
// ============================================================================
// mSEMI
// ============================================================================
procedure TcalcLexer.mSEMI( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_SEMI;
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;
// ============================================================================
// mINT
// ============================================================================
procedure TcalcLexer.mINT( pCreate: boolean);
var
_begin: integer;
_cnt_10: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_INT;
_cnt_10 := 0;
while(true) do
begin
if (( LA(1) in ['0'..'9'])) then
begin
match( ['0'..'9']);
end
else
begin
if _cnt_10 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), ['0'..'9'], FileName, Line, Column);
end;
INC(_cnt_10);
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;
// ============================================================================
// mWS
// ============================================================================
procedure TcalcLexer.mWS( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_WS;
if (( LA(1) in [#13])) 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 if (( LA(1) in [#9])) then
begin
match(#9);
tab;
end
else if (( LA(1) in [' '])) then
begin
match(' ');
end
else
Raise EdpgMismatchedChar.Create( LA(1), [#9..#10,#13,' '], 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 TcalcLexer.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 [';'])) then
begin
mSEMI(true);
result := fReturnToken;
end
else if (( LA(1) in ['0'..'9'])) then
begin
mINT(true);
result := fReturnToken;
end
else if (( LA(1) in [#9..#10,#13,' '])) then
begin
mWS(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;
end.
+24
View File
@@ -0,0 +1,24 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.1.0d
// Grammar: calcLexer
// ============================================================================
unit calcLexerTokens;
interface
const
TT_EOF = 1;
TT_LPAREN = 4;
TT_RPAREN = 5;
TT_PLUS = 6;
TT_MINUS = 7;
TT_STAR = 8;
TT_SLASH = 9;
TT_SEMI = 10;
TT_INT = 11;
TT_WS = 12;
implementation
end.
+12
View File
@@ -0,0 +1,12 @@
// $Delphi Parser Generator: calcLexer -> calcLexerTokens.txt$
TcalcLexer
TT_EOF=1
TT_LPAREN=4
TT_RPAREN=5
TT_PLUS=6
TT_MINUS=7
TT_STAR=8
TT_SLASH=9
TT_SEMI=10
TT_INT=11
TT_WS=12
+93
View File
@@ -0,0 +1,93 @@
// ============================================================================
// Demo parser for four operator calculator
// ============================================================================
unit calcParser;
parser TcalcParser;
options
{
importVocab = calcLexer;
exportVocab = calcParser;
// k = 2;
}
// ============================================================================
// calc
// ============================================================================
calc
local
{
v: integer;
}
: (v=expression SEMI {writeln(v);} )+
;
// ============================================================================
// expression
// ============================================================================
expression returns [integer]
: result=simpleExpression
;
// ============================================================================
// simpleExpression
// ============================================================================
simpleExpression returns [integer]
local
{
v : integer;
}
: result=term
(
PLUS v=term { result := result + v; }
| MINUS v=term { result := result - v; }
)*
;
// ============================================================================
// term
// ============================================================================
term returns [integer]
local
{
v : integer;
}
: result=factor
(
STAR v=factor { result := result * v; }
| SLASH v=factor { result := result div v; }
)*
;
// ============================================================================
// factor
// ============================================================================
factor returns [integer]
local
{
s: integer;
}
{
s := 1;
}
:
(
PLUS { s := 1; }
| MINUS { s := -1; }
)?
(
result=uInt
| LPAREN result=expression RPAREN
)
{
result := s * result;
}
;
// ============================================================================
// uInt
// ============================================================================
uInt returns [integer]
: x:INT { result := StrToInt( x.TokenText); }
;
+203
View File
@@ -0,0 +1,203 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.1.0d
// Grammar: calcParser
// ============================================================================
unit calcParser;
interface
uses
calcParserTokens,
Classes,
Contnrs,
dpgLLkParser,
dpgToken,
dpgTypes,
SysUtils;
type
// =========================================================================
// Class TcalcParser declaration
// =========================================================================
TcalcParser = class( TdpgLLkParser)
public // Public grammar rules
procedure calc ;
procedure expression ;
procedure simpleExpression ;
procedure term ;
procedure factor ;
procedure uInt ;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedToken;
// ============================================================================
// calc
// ============================================================================
procedure TcalcParser.calc;
var
_cnt_16: integer;
v: integer;
begin
_cnt_16 := 0;
while(true) do
begin
if (( LA(1) in [TT_LPAREN,TT_PLUS..TT_MINUS,TT_INT])) then
begin
expression;
match(TT_SEMI);
writeln(v);
end
else
begin
if _cnt_16 >= 1 then
break
else
Raise EdpgMismatchedToken.Create( LT(1), [TT_LPAREN,TT_PLUS..TT_MINUS,TT_INT], FileName);
end;
INC(_cnt_16);
end;
end;
// ============================================================================
// expression
// ============================================================================
procedure TcalcParser.expression;
begin
simpleExpression;
end;
// ============================================================================
// simpleExpression
// ============================================================================
procedure TcalcParser.simpleExpression;
var
v : integer;
begin
term;
while(true) do
begin
if (( LA(1) in [TT_PLUS])) then
begin
match(TT_PLUS);
term;
result := result + v;
end
else if (( LA(1) in [TT_MINUS])) then
begin
match(TT_MINUS);
term;
result := result - v;
end
else
break;
end;
end;
// ============================================================================
// term
// ============================================================================
procedure TcalcParser.term;
var
v : integer;
begin
factor;
while(true) do
begin
if (( LA(1) in [TT_STAR])) then
begin
match(TT_STAR);
factor;
result := result * v;
end
else if (( LA(1) in [TT_SLASH])) then
begin
match(TT_SLASH);
factor;
result := result div v;
end
else
break;
end;
end;
// ============================================================================
// factor
// ============================================================================
procedure TcalcParser.factor;
var
s: integer;
begin
s := 1;
if (( LA(1) in [TT_PLUS])) then
begin
match(TT_PLUS);
s := 1;
end
else if (( LA(1) in [TT_MINUS])) then
begin
match(TT_MINUS);
s := -1;
end;
if (( LA(1) in [TT_INT])) then
begin
uInt;
end
else if (( LA(1) in [TT_LPAREN])) then
begin
match(TT_LPAREN);
expression;
match(TT_RPAREN);
end
else
Raise EdpgMismatchedToken.Create( LT(1), [TT_LPAREN,TT_INT], FileName);
result := s * result;
end;
// ============================================================================
// uInt
// ============================================================================
procedure TcalcParser.uInt;
var
x: IdpgToken;
begin
x := LT(1);
match(TT_INT);
result := StrToInt( x.TokenText);
end;
end.
+24
View File
@@ -0,0 +1,24 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.1.0d
// Grammar: calcParser
// ============================================================================
unit calcParserTokens;
interface
const
TT_EOF = 1;
TT_LPAREN = 4;
TT_RPAREN = 5;
TT_PLUS = 6;
TT_MINUS = 7;
TT_STAR = 8;
TT_SLASH = 9;
TT_SEMI = 10;
TT_INT = 11;
TT_WS = 12;
implementation
end.
+12
View File
@@ -0,0 +1,12 @@
// $Delphi Parser Generator: calcParser -> calcParserTokens.txt$
TcalcParser
TT_EOF=1
TT_LPAREN=4
TT_RPAREN=5
TT_PLUS=6
TT_MINUS=7
TT_STAR=8
TT_SLASH=9
TT_SEMI=10
TT_INT=11
TT_WS=12
+11
View File
@@ -0,0 +1,11 @@
To build demo project you must first compile the grammars.
This grammar CAN NOT! be compiled with the demo version of dpg.
1. dpg calcLexer.g
2. dpg calcParser.g
After the compilation the project can be opened in delphi. Be sure that the dpg
runtime library is in the delphi library path. (In the project settings,
or in the environment settings).
Have fun...
+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
+43
View File
@@ -0,0 +1,43 @@
unit filter;
lexer Tfilter;
options
{
k = 2;
filter = true;
}
// ----------------------------------------------------------------------------
// Paragraph
// ----------------------------------------------------------------------------
P
: "<p>"
;
// ----------------------------------------------------------------------------
// Break
// ----------------------------------------------------------------------------
BR
: "<br>"
;
// ----------------------------------------------------------------------------
// Newline
// ----------------------------------------------------------------------------
NEWLINE
:
(
'\r' '\n' { newLine; _ttype := TT_SKIP; }
| '\r' { newLine; _ttype := TT_SKIP; }
| '\n' { newLine; _ttype := TT_SKIP; }
)
;
// ----------------------------------------------------------------------------
// Tab
// ----------------------------------------------------------------------------
TAB
: '\t' { tab; _ttype := TT_SKIP; }
;
+234
View File
@@ -0,0 +1,234 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.78r
// Grammar: filter.g
// ============================================================================
unit filter;
interface
uses
Classes,
Contnrs,
dpgLexer,
dpgToken,
dpgTypes,
filterTokens,
SysUtils;
type
// =========================================================================
// Class Tfilter declaration
// =========================================================================
Tfilter = class( TdpgLexer)
protected // Public grammar rules ("rescoped")
procedure mP ( pCreate: boolean);
procedure mBR ( pCreate: boolean);
procedure mNEWLINE ( pCreate: boolean);
procedure mTAB ( pCreate: boolean);
public
function NextToken: IdpgToken; override;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedChar;
// ============================================================================
// mP
// ============================================================================
procedure Tfilter.mP( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_P;
match('<p>');
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;
// ============================================================================
// mBR
// ============================================================================
procedure Tfilter.mBR( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_BR;
match('<br>');
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 Tfilter.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; _ttype := TT_SKIP;
end
else if (( LA(1) in [#13])) then
begin
match(#13);
newLine; _ttype := TT_SKIP;
end
else if (( LA(1) in [#10])) then
begin
match(#10);
newLine; _ttype := TT_SKIP;
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;
// ============================================================================
// mTAB
// ============================================================================
procedure Tfilter.mTAB( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_TAB;
match(#9);
tab; _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 Tfilter.NextToken : IdpgToken;
begin
while( true) do
begin
ResetText;
try
if (( LA(1) in ['<']) and (LA(2) in ['p'])) then
begin
mP(true);
result := fReturnToken;
end
else if (( LA(1) in ['<']) and (LA(2) in ['b'])) then
begin
mBR(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
mTAB(true);
result := fReturnToken;
end
else
begin
if LA(1) = EOF_CHAR then
begin
uponEof;
result := TdpgToken.Create(TT_EOF);
end
else
begin
consume;
continue;
end;
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
consume;
continue;
end;
end;
end;
end.
+19
View File
@@ -0,0 +1,19 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.78r
// Grammar: filter.g
// ============================================================================
unit filterTokens;
interface
const
TT_EOF = 1;
TT_P = 4;
TT_BR = 5;
TT_NEWLINE = 6;
TT_TAB = 7;
implementation
end.
+7
View File
@@ -0,0 +1,7 @@
// $Delphi Parser Generator: filter.pas -> TfilterTokens.txt$
Tfilter
TT_EOF=1
TT_P=4
TT_BR=5
TT_NEWLINE=6
TT_TAB=7
@@ -0,0 +1,367 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javadoclexer.g
// ============================================================================
unit JavaDocLexer;
interface
uses
Classes,
Contnrs,
dpgLexer,
dpgToken,
dpgTokenStreamSelector,
dpgTypes,
JavaDocTokens,
SysUtils;
type
// =========================================================================
// Class TJavaDocLexer declaration
// =========================================================================
TJavaDocLexer = class( TdpgLexer)
public
Selector : IdpgTokenStreamSelector;
protected // Protected grammar rules
procedure mID ( pCreate: boolean);
protected // Public grammar rules ("rescoped")
procedure mPARAM ( pCreate: boolean);
procedure mEXCEPTION ( pCreate: boolean);
procedure mSTAR ( pCreate: boolean);
procedure mJAVADOC_CLOSE ( pCreate: boolean);
procedure mNEWLINE ( pCreate: boolean);
public
function NextToken: IdpgToken; override;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedChar;
// ============================================================================
// mPARAM
// ============================================================================
procedure TJavaDocLexer.mPARAM( pCreate: boolean);
var
_begin: integer;
_cnt_3: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_PARAM;
match('@param');
_cnt_3 := 0;
while(true) do
begin
if (( LA(1) in [' '])) then
begin
match(' ');
end
else
begin
if _cnt_3 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), [' '], FileName, Line, Column);
end;
INC(_cnt_3);
end;
mID(false);
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;
// ============================================================================
// mID
// ============================================================================
procedure TJavaDocLexer.mID( pCreate: boolean);
var
_begin: integer;
_cnt_9: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_ID;
_cnt_9 := 0;
while(true) do
begin
if (( LA(1) in ['a'..'z'])) then
begin
match( ['a'..'z']);
end
else
begin
if _cnt_9 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), ['a'..'z'], FileName, Line, Column);
end;
INC(_cnt_9);
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;
// ============================================================================
// mEXCEPTION
// ============================================================================
procedure TJavaDocLexer.mEXCEPTION( pCreate: boolean);
var
_begin: integer;
_cnt_6: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_EXCEPTION;
match('@exception');
_cnt_6 := 0;
while(true) do
begin
if (( LA(1) in [' '])) then
begin
match(' ');
end
else
begin
if _cnt_6 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), [' '], FileName, Line, Column);
end;
INC(_cnt_6);
end;
mID(false);
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 TJavaDocLexer.mSTAR( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_STAR;
match('*');
_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;
// ============================================================================
// mJAVADOC_CLOSE
// ============================================================================
procedure TJavaDocLexer.mJAVADOC_CLOSE( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_JAVADOC_CLOSE;
match('*/');
Selector.Pop;
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 TJavaDocLexer.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);
end
else if (( LA(1) in [#13])) then
begin
match(#13);
end
else if (( LA(1) in [#10])) then
begin
match(#10);
end
else
Raise EdpgMismatchedChar.Create( LA(1), [#10,#13], FileName, Line, Column);
newLine;
_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 TJavaDocLexer.NextToken : IdpgToken;
var
la1 : char;
la2 : char;
begin
while( true) do
begin
ResetText;
try
la1 := LA(1);
la2 := LA(2);
if (( LA(1) in ['@']) and (LA(2) in ['p'])) then
begin
mPARAM(true);
result := fReturnToken;
end
else if (( LA(1) in ['@']) and (LA(2) in ['e'])) then
begin
mEXCEPTION(true);
result := fReturnToken;
end
else if (( LA(1) in ['*']) and (LA(2) in ['/'])) then
begin
mJAVADOC_CLOSE(true);
result := fReturnToken;
end
else if (( LA(1) in ['*'])) then
begin
mSTAR(true);
result := fReturnToken;
end
else if (( LA(1) in [#10,#13])) then
begin
mNEWLINE(true);
result := fReturnToken;
end
else
begin
if LA(1) = EOF_CHAR then
begin
uponEof;
result := TdpgToken.Create(TT_EOF);
end
else
begin
consume;
continue;
end;
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
consume;
continue;
end;
end;
end;
end.
@@ -0,0 +1,21 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javadoclexer.g
// ============================================================================
unit JavaDocTokens;
interface
const
TT_EOF = 1;
TT_PARAM = 4;
TT_EXCEPTION = 5;
TT_ID = 6;
TT_STAR = 7;
TT_JAVADOC_CLOSE = 8;
TT_NEWLINE = 9;
implementation
end.
@@ -0,0 +1,9 @@
// $Delphi Parser Generator: JavaDocLexer.pas -> TJavaDocLexerTokens.txt$
TJavaDocLexer
TT_EOF=1
TT_PARAM=4
TT_EXCEPTION=5
TT_ID=6
TT_STAR=7
TT_JAVADOC_CLOSE=8
TT_NEWLINE=9
+286
View File
@@ -0,0 +1,286 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javalexer.g
// ============================================================================
unit JavaLexer;
interface
uses
Classes,
Contnrs,
dpgLexer,
dpgToken,
dpgTokenStreamSelector,
dpgTypes,
JavaTokens,
SysUtils;
type
// =========================================================================
// Class TJavaLexer declaration
// =========================================================================
TJavaLexer = class( TdpgLexer)
public
Selector : IdpgTokenStreamSelector;
protected // Internals
procedure initialize; override;
protected // Public grammar rules ("rescoped")
procedure mSEMI ( pCreate: boolean);
procedure mJAVADOC_OPEN ( pCreate: boolean);
procedure mID ( pCreate: boolean);
procedure mWS ( pCreate: boolean);
public
function NextToken: IdpgToken; override;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedChar;
// ============================================================================
// mSEMI
// ============================================================================
procedure TJavaLexer.mSEMI( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_SEMI;
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;
// ============================================================================
// mJAVADOC_OPEN
// ============================================================================
procedure TJavaLexer.mJAVADOC_OPEN( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_JAVADOC_OPEN;
match('/**');
Selector.Push('docLexer');
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;
// ============================================================================
// mID
// ============================================================================
procedure TJavaLexer.mID( pCreate: boolean);
var
_begin: integer;
_cnt_5: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_ID;
_cnt_5 := 0;
while(true) do
begin
if (( LA(1) in ['a'..'z'])) then
begin
match( ['a'..'z']);
end
else
begin
if _cnt_5 >= 1 then
break
else
Raise EdpgMismatchedChar.Create( LA(1), ['a'..'z'], FileName, Line, Column);
end;
INC(_cnt_5);
end;
_ttype := testLit( _ttype);
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;
// ============================================================================
// mWS
// ============================================================================
procedure TJavaLexer.mWS( pCreate: boolean);
var
_begin: integer;
_save: integer;
_token: IdpgToken;
_ttype: integer;
begin
_begin := Length( fText) +1;
_token := nil;
_ttype := TT_WS;
if (( LA(1) in [' '])) then
begin
match(' ');
end
else if (( LA(1) in [#9])) then
begin
match(#9);
end
else if (( LA(1) in [#10,#13])) then
begin
if (( LA(1) in [#13]) and (LA(2) in [#10])) then
begin
match(#13);
match(#10);
end
else if (( LA(1) in [#13])) then
begin
match(#13);
end
else if (( LA(1) in [#10])) then
begin
match(#10);
end
else
Raise EdpgMismatchedChar.Create( LA(1), [#10,#13], FileName, Line, Column);
newLine;
end
else
Raise EdpgMismatchedChar.Create( LA(1), [#9..#10,#13,' '], 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 TJavaLexer.NextToken : IdpgToken;
var
_first : TdpgCharSet;
begin
_first := [#9..#10,#13,' ','/',';','a'..'z'];
while( true) do
begin
ResetText;
try
if (( LA(1) in [';'])) then
begin
mSEMI(true);
result := fReturnToken;
end
else if (( LA(1) in ['/'])) then
begin
mJAVADOC_OPEN(true);
result := fReturnToken;
end
else if (( LA(1) in ['a'..'z'])) then
begin
mID(true);
result := fReturnToken;
end
else if (( LA(1) in [#9..#10,#13,' '])) then
begin
mWS(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 TJavaLexer.initialize;
begin
fLiterals.Add('int', 10);
end;
end.
@@ -0,0 +1,25 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javalexer.g
// ============================================================================
unit JavaTokens;
interface
const
TT_EOF = 1;
TT_PARAM = 4;
TT_EXCEPTION = 5;
TT_ID = 6;
TT_STAR = 7;
TT_JAVADOC_CLOSE = 8;
TT_NEWLINE = 9;
LT_int = 10;
TT_SEMI = 11;
TT_JAVADOC_OPEN = 12;
TT_WS = 13;
implementation
end.
@@ -0,0 +1,13 @@
// $Delphi Parser Generator: JavaLexer.pas -> TJavaLexerTokens.txt$
TJavaLexer
TT_EOF=1
TT_PARAM=4
TT_EXCEPTION=5
TT_ID=6
TT_STAR=7
TT_JAVADOC_CLOSE=8
TT_NEWLINE=9
LT_int="int"=10
TT_SEMI=11
TT_JAVADOC_OPEN=12
TT_WS=13
+49
View File
@@ -0,0 +1,49 @@
program demo;
{$APPTYPE CONSOLE}
uses
Classes,
SysUtils,
dpgTokenStreamSelector,
javaLexer,
javaDocLexer,
javaParser;
var
stm : TFileStream;
lexJava : TJavaLexer;
lexJavaDoc : TJavaDocLexer;
parJava : TJavaParser;
sel : TdpgTokenStreamSelector;
begin
if ParamCount = 1 then
begin
try
stm := TFileStream.Create( ParamStr(1), fmOpenRead);
sel := TdpgTokenStreamSelector.Create;
lexJava := TJavaLexer.Create( stm);
lexJavaDoc := TJavaDocLexer.Create( lexJava.InputState);
lexJava.Selector := sel;
lexJavaDoc.Selector := sel;
sel.add( lexJava, 'main');
sel.add( lexJavaDoc, 'docLexer');
sel.select( 'main');
parJava := TJavaParser.Create( sel);
parJava.input;
except
writeln('Exception...');
end;
end;
{ TODO -oUser -cConsole Main : Insert code here }
end.
@@ -0,0 +1,76 @@
unit JavaDocLexer;
uses
{
dpgTokenStreamSelector;
}
lexer TJavaDocLexer;
options
{
k = 2;
exportVocab = JavaDoc;
filter = true;
}
memberdecl
{
public
Selector : IdpgTokenStreamSelector;
}
// ----------------------------------------------------------------------------
// @param
// ----------------------------------------------------------------------------
PARAM
: "@param" (' ')+ ID
;
// ----------------------------------------------------------------------------
// @exception
// ----------------------------------------------------------------------------
EXCEPTION
: "@exception" (' ')+ ID
;
// ----------------------------------------------------------------------------
// identifier
// ----------------------------------------------------------------------------
protected ID
: ('a'..'z')+
;
// ----------------------------------------------------------------------------
// Star
//
// This rule simply prevents JAVADOC_CLOSE from being called for every '*' in
// a comment. Calling JAVADOC_CLOSE will fail for simple '*' and cause an
// exception, which is slow. In other words, the grammar will work without
// this rule, but is slower.
// ----------------------------------------------------------------------------
STAR
: '*' { _ttype := TT_SKIP; }
;
// ----------------------------------------------------------------------------
// JavaDocClose
// ----------------------------------------------------------------------------
JAVADOC_CLOSE
: "*/" { Selector.Pop; }
;
// ----------------------------------------------------------------------------
// NewLine
// ----------------------------------------------------------------------------
NEWLINE
:
(
'\r' '\n'
| '\r'
| '\n'
)
{
newLine;
_ttype := TT_SKIP;
}
;
+68
View File
@@ -0,0 +1,68 @@
unit JavaLexer;
uses
{
dpgTokenStreamSelector;
}
lexer TJavaLexer;
options
{
k = 2;
importVocab = JavaDoc;
exportVocab = Java;
}
tokens
{
"int";
}
memberdecl
{
public
Selector : IdpgTokenStreamSelector;
}
// ----------------------------------------------------------------------------
// Simple tokens
// ----------------------------------------------------------------------------
SEMI : ';';
// ----------------------------------------------------------------------------
// JavaDocOpen
// ----------------------------------------------------------------------------
JAVADOC_OPEN
: "/**" { Selector.Push('docLexer'); }
;
// ----------------------------------------------------------------------------
// Identifier
// ----------------------------------------------------------------------------
ID
options
{
testLiterals = true;
}
: ('a'..'z')+
;
WS
:
(
' '
| '\t'
|
(
'\r' '\n'
| '\r'
| '\n'
)
{
newLine;
}
)
{
_ttype := TT_SKIP;
}
;
+20
View File
@@ -0,0 +1,20 @@
unit javaParser;
parser TJavaParser;
options
{
k = 2;
importVocab = Java;
}
input
: ( (javadoc)? "int" ID SEMI)+
;
javadoc
:
JAVADOC_OPEN
(PARAM)?
(EXCEPTION)?
JAVADOC_CLOSE
;
@@ -0,0 +1,91 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javaparser.g
// ============================================================================
unit javaParser;
interface
uses
Classes,
Contnrs,
dpgLLkParser,
dpgToken,
dpgTypes,
javaParserTokens,
SysUtils;
type
// =========================================================================
// Class TJavaParser declaration
// =========================================================================
TJavaParser = class( TdpgLLkParser)
public // Public grammar rules
procedure input ;
procedure javadoc ;
end;
implementation
uses
dpgException,
dpgExceptionSemantic,
dpgExceptionMismatchedToken;
// ============================================================================
// input
// ============================================================================
procedure TJavaParser.input;
var
_cnt_4: integer;
begin
_cnt_4 := 0;
while(true) do
begin
if (( LA(1) in [LT_int,TT_JAVADOC_OPEN])) then
begin
if (( LA(1) in [TT_JAVADOC_OPEN])) then
begin
javadoc;
end;
match(LT_int);
match(TT_ID);
match(TT_SEMI);
end
else
begin
if _cnt_4 >= 1 then
break
else
Raise EdpgMismatchedToken.Create( LT(1), [LT_int,TT_JAVADOC_OPEN], FileName);
end;
INC(_cnt_4);
end;
end;
// ============================================================================
// javadoc
// ============================================================================
procedure TJavaParser.javadoc;
begin
match(TT_JAVADOC_OPEN);
if (( LA(1) in [TT_PARAM])) then
begin
match(TT_PARAM);
end;
if (( LA(1) in [TT_EXCEPTION])) then
begin
match(TT_EXCEPTION);
end;
match(TT_JAVADOC_CLOSE);
end;
end.
@@ -0,0 +1,25 @@
// ============================================================================
// This file is generated by the Delphi Parser Generator.
// ----------------------------------------------------------------------------
// DPG version: 1.0.0.118r
// Grammar: javaparser.g
// ============================================================================
unit javaParserTokens;
interface
const
TT_EOF = 1;
TT_PARAM = 4;
TT_EXCEPTION = 5;
TT_ID = 6;
TT_STAR = 7;
TT_JAVADOC_CLOSE = 8;
TT_NEWLINE = 9;
LT_int = 10;
TT_SEMI = 11;
TT_JAVADOC_OPEN = 12;
TT_WS = 13;
implementation
end.
@@ -0,0 +1,13 @@
// $Delphi Parser Generator: javaParser.pas -> TJavaParserTokens.txt$
TJavaParser
TT_EOF=1
TT_PARAM=4
TT_EXCEPTION=5
TT_ID=6
TT_STAR=7
TT_JAVADOC_CLOSE=8
TT_NEWLINE=9
LT_int="int"=10
TT_SEMI=11
TT_JAVADOC_OPEN=12
TT_WS=13
+20
View File
@@ -0,0 +1,20 @@
/** a javadoc comment
* @param foo
* @exception bar
* Just a little text for a comment
*/
int abc;
/** a javadoc comment
* @param foo
* @exception bar
* Just a little text for a comment
*/
int zzz;
/** a javadoc comment
* @param foo
* @exception bar
* Just a little text for a comment
*/
int xxx;