Componentes.Terceros.jvcl/official/3.32/devtools/JvInterpreter/MakeHash/Unit1.pas

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.