Initial check in docu
This commit is contained in:
@@ -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.
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
}
|
||||
;
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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); }
|
||||
;
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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...
|
||||
@@ -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
|
||||
@@ -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; }
|
||||
;
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
;
|
||||
@@ -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;
|
||||
}
|
||||
;
|
||||
@@ -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
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user