git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.jvcl@17 7f62d464-2af8-f54e-996c-e91b33f51cbe
200 lines
5.0 KiB
ObjectPascal
200 lines
5.0 KiB
ObjectPascal
unit Unit1;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls;
|
|
|
|
type
|
|
TForm1 = class(TForm)
|
|
Memo1: TMemo;
|
|
Label1: TLabel;
|
|
Memo2: TMemo;
|
|
Label2: TLabel;
|
|
Button1: TButton;
|
|
Label3: TLabel;
|
|
procedure Button1Click(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
HIndices:array[0..31] of integer;
|
|
HValues:array[0..255] of integer;
|
|
AssoValues:array[0..255] of integer;
|
|
intest:boolean;
|
|
procedure FillIndices;
|
|
function FillValues:integer;
|
|
function TestHValue(const TokenStr: string): integer;
|
|
function TestIndices:boolean;
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
uses JvInterpreterParser;
|
|
|
|
type
|
|
TTokenTag = record
|
|
// (rom) changed to PChar to get rid of hidden initialization section
|
|
Token: PChar;
|
|
TTyp: TTokenKind;
|
|
end;
|
|
|
|
const
|
|
WordList: array [0..51] of TTokenTag = (
|
|
(Token: kwTRUE; TTyp: ttTrue),
|
|
(Token: kwFALSE; TTyp: ttFalse),
|
|
(Token: kwOR; TTyp: ttOr),
|
|
(Token: kwAND; TTyp: ttAnd),
|
|
(Token: kwNOT; TTyp: ttNot),
|
|
(Token: kwDIV; TTyp: ttIntDiv),
|
|
(Token: kwMOD; TTyp: ttMod),
|
|
(Token: kwBEGIN; TTyp: ttBegin),
|
|
(Token: kwEND; TTyp: ttEnd),
|
|
(Token: kwIF; TTyp: ttIf),
|
|
(Token: kwTHEN; TTyp: ttThen),
|
|
(Token: kwELSE; TTyp: ttElse),
|
|
(Token: kwWHILE; TTyp: ttWhile),
|
|
(Token: kwDO; TTyp: ttDo),
|
|
(Token: kwREPEAT; TTyp: ttRepeat),
|
|
(Token: kwUNTIL; TTyp: ttUntil),
|
|
(Token: kwPROCEDURE; TTyp: ttProcedure),
|
|
(Token: kwFUNCTION; TTyp: ttFunction),
|
|
(Token: kwFOR; TTyp: ttFor),
|
|
(Token: kwTO; TTyp: ttTo),
|
|
(Token: kwBREAK; TTyp: ttBreak),
|
|
(Token: kwCONTINUE; TTyp: ttContinue),
|
|
(Token: kwVAR; TTyp: ttVar),
|
|
(Token: kwTRY; TTyp: ttTry),
|
|
(Token: kwFINALLY; TTyp: ttFinally),
|
|
(Token: kwEXCEPT; TTyp: ttExcept),
|
|
(Token: kwON; TTyp: ttOn),
|
|
(Token: kwRAISE; TTyp: ttRaise),
|
|
(Token: kwEXTERNAL; TTyp: ttExternal),
|
|
(Token: kwUNIT; TTyp: ttUnit),
|
|
(Token: kwUSES; TTyp: ttUses),
|
|
(Token: kwCONST; TTyp: ttConst),
|
|
(Token: kwPUBLIC; TTyp: ttPublic),
|
|
(Token: kwPRIVATE; TTyp: ttPrivate),
|
|
(Token: kwPROTECTED; TTyp: ttProtected),
|
|
(Token: kwPUBLISHED; TTyp: ttPublished),
|
|
(Token: kwPROPERTY; TTyp: ttProperty),
|
|
(Token: kwCLASS; TTyp: ttClass),
|
|
(Token: kwTYPE; TTyp: ttType),
|
|
(Token: kwINTERFACE; TTyp: ttInterface),
|
|
(Token: kwIMPLEMENTATION; TTyp: ttImplementation),
|
|
(Token: kwEXIT; TTyp: ttExit),
|
|
(Token: kwARRAY; TTyp: ttArray),
|
|
(Token: kwOF; TTyp: ttOf),
|
|
(Token: kwCASE; TTyp: ttCase),
|
|
(Token: kwPROGRAM; TTyp: ttProgram),
|
|
(Token: kwIN; TTyp: ttIn),
|
|
(Token: kwRECORD; TTyp: ttRecord),
|
|
(Token: kwDOWNTO; TTyp: ttDownTo),
|
|
(Token: kwSHL; TTyp: ttShl), // [peter schraut: added on 2005/08/14]
|
|
(Token: kwSHR; TTyp: ttShr), // [peter schraut: added on 2005/08/14]
|
|
(Token: kwXOR; TTyp: ttXor) // [peter schraut: added on 2005/08/14]
|
|
);
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.FillIndices;
|
|
var
|
|
i,temp:integer;
|
|
begin
|
|
for i:=0 to High(HIndices) do
|
|
//HIndices[i]:=random(64)*random(64) div 64;
|
|
HIndices[i]:=random(100);
|
|
end;
|
|
|
|
function TForm1.FillValues:integer;
|
|
var
|
|
i:integer;
|
|
HIndex:integer;
|
|
begin
|
|
for i:=0 to High(HValues) do
|
|
HValues[i]:=-1;
|
|
for result:=0 to High(WordList) do begin
|
|
HIndex:=TestHValue(WordList[result].Token);
|
|
if HValues[HIndex]=-1 then
|
|
HValues[HIndex]:=result
|
|
else
|
|
Exit;
|
|
//raise Exception.CreateFmt('Collision at step %d',[result]);
|
|
end;
|
|
end;
|
|
|
|
function TForm1.TestHValue(const TokenStr: string): integer;
|
|
var
|
|
Len,i: Integer;
|
|
HVal: Integer;
|
|
begin
|
|
Len := Length(TokenStr);
|
|
|
|
begin
|
|
HVal := Len;
|
|
for i:=1 to Len do begin
|
|
HVal := HVal + HIndices[(Byte(TokenStr[i]) - Byte('a')) and $1F];
|
|
if i=3 then
|
|
Break;
|
|
end;
|
|
HVal := HVal + HIndices[(Byte(TokenStr[Len]) - Byte('a')) and $1F];
|
|
result := HVal and 255;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.Button1Click(Sender: TObject);
|
|
begin
|
|
if intest then begin
|
|
intest:=false;
|
|
exit;
|
|
end;
|
|
intest:=true;
|
|
randomize;
|
|
while (intest and not TestIndices) do
|
|
Application.Processmessages;
|
|
end;
|
|
|
|
function TForm1.TestIndices: boolean;
|
|
var
|
|
i:integer;
|
|
temp:string;
|
|
begin
|
|
result:=false;
|
|
Memo1.Clear;
|
|
FillIndices;
|
|
temp:='';
|
|
for i:=0 to high(HIndices) do begin
|
|
temp:=temp+format('%3d,',[HIndices[i]]);
|
|
if (i mod 10)=9 then begin
|
|
Memo1.Lines.Add(temp);
|
|
temp:='';
|
|
end;
|
|
end;
|
|
Memo1.Lines.Add(temp);
|
|
|
|
Memo2.Clear;
|
|
i:=FillValues;
|
|
if i=high(WordList) then begin
|
|
label3.Caption:='OK';
|
|
result:=true;
|
|
end
|
|
else
|
|
label3.Caption:=IntToStr(i);
|
|
temp:='';
|
|
for i:=0 to high(HValues) do begin
|
|
temp:=temp+format('%3d,',[HValues[i]]);
|
|
if (i mod 10)=9 then begin
|
|
Memo2.Lines.Add(temp);
|
|
temp:='';
|
|
end;
|
|
end;
|
|
Memo2.Lines.Add(temp);
|
|
end;
|
|
|
|
end.
|