unit Natural; //---------------------------------------------------------------------------- // //1. Paranorm, Inspacenorm kann gelöscht werden?? //---------------------------------------------------------------------------- interface uses
GenDefs,OwnUtils,Editor,OptionClass,Memtree; //---------------------------------------------------------------------------- // //---------------------------------------------------------------------------- type
Verb=(keine,mehrmals,dann,entweder,oder,aufrufen,ausgefuehrt,berechnet,
uebertraegt,vergleicht,entscheidet,selektiert,wenn,sucht,ruft,nicht,
fortsetzung,loest); //---------------------------------------------------------------------------- // //---------------------------------------------------------------------------- function memtreelong(T:TMemTree;lnr,col:integer):JString; procedure displayres(var Root:TMemTree;var RE:TEde); function Expression(var T:TMemTree):JString; procedure StartRtfSource(Pwin:TEde); implementation uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,Utilities,jpeg,ExtCtrls,Menus,ToolWin,Buttons,Math,
StrUtils,ImgList,Printers,Chart,CheckLst,Clipbrd,ComCtrls,DateUtils; const
linelen=80;
Paranorm='';
Inspacenorm=' ';
Variante: array [Verb] of JString=('keine','mehrmals wird','','entweder', 'oder','aufrufen','ausgeführt','berechnet','überträgt','vergleicht', 'entscheidet','selektiert','wenn ','sucht','ruft','nicht','','löst'); var
lvl:integer;
edt:^TRichEdit;
lastfolgeline:integer;
lastlevel:integer;
lastphrase:Verb;
streamatt:TMemoryStream;
WinLnr:integer;
TimeSet:TDateTime;
Duration:Longint;
Durmin:Longint;
Durmax:Longint;
Duravg:Longint;
Durn:Longint;
ThisBlock:JString;
LastFunc:JString;
ExprDepth:integer;
Callsofexpr:integer; //----------------------------------------------------------------- // //Stats Dur // //---------------------------------------------------------------- function Incr(var counter:integer):integer; begin
counter:=counter+1;
result:=Counter; end; //----------------------------------------------------------------- // //Stats Dur // //---------------------------------------------------------------- procedure StartDur(); begin
TimeSet:=Now; end; //---------------------------------------------------------------- // //End Stats Dur // //---------------------------------------------------------------- procedure EndDur(); begin
Duration:=MilliSecondsBetween(Now,TimeSet); if Duration>Durmax then
Durmax:=Duration; if Duration<Durmin then
Durmin:=Duration;
Duravg:=(Duravg*Durn+Duration)div(Durn+1);
Durn:=Durn+1; end; //---------------------------------------------------------------- // //Start rtf // //---------------------------------------------------------------- procedure StartRtfSource(Pwin:TEde); var
S:JString;
i:integer; begin
edt.Clear;
edt.lines.Clear;
edt.ReadOnly:=false;
edt.PlainText:=false;
streamatt:=TMemoryStream.Create;
streamatt.Position:=0;
S:=Pwin.RtfHeader; for i:=1 to Length(S) do
streamatt.WriteBuffer(S[i],1); end; //---------------------------------------------------------------- // //Close rtf // //---------------------------------------------------------------- procedure CloseRtfSource; begin
edt.lines.Clear;
streamatt.WriteBuffer(AnsiString(' }'),2);
streamatt.Position:=0;
edt.lines.LoadFromStream(streamatt);
edt.ReadOnly:=true;
streamatt.Free; end; //---------------------------------------------------------------- // //Large Font // //---------------------------------------------------------------- function Large:JString; begin
Large:=SetSize+IntToStr(4*Opt.r.FontSize); end; //---------------------------------------------------------------- // //Middle Font // //---------------------------------------------------------------- function Middle:JString; begin
Middle:=SetSize+IntToStr(3*Opt.r.FontSize); end; //---------------------------------------------------------------- // //Normal Font // //---------------------------------------------------------------- function Normal:JString; begin
Normal:=SetSize+IntToStr(2*Opt.r.FontSize); end; //---------------------------------------------------------------- // //Folge // //---------------------------------------------------------------- function folge(phrase:Verb):JString; var
r:JString; begin if (lastphrase=phrase) thenbegin
r:=SetColor+'7'+Variante[phrase]+SetNoColor;
lastfolgeline:=WinLnr;
lastphrase:=phrase; end elsebegin
r:=SetColor+'7'+Variante[phrase]+SetNoColor;
lastfolgeline:=WinLnr;
lastphrase:=phrase; end;
folge:=r end; //---------------------------------------------------------------- // //POaragraph // //---------------------------------------------------------------- function Para:JString; begin
WinLnr:=WinLnr+1;
Para:=RtfParagraph; end; //---------------------------------------------------------------- // //test for duplicate paragraph // //---------------------------------------------------------------- function CheckPara(S:JString):JString; begin //if S='' then Checkpara:='' //else if midstr(S,length(S)-3,4)=RtfParagraph then Checkpara:=S //else Checkpara:=S+Para;
CheckPara:=S end; //---------------------------------------------------------------- // //LLength // //---------------------------------------------------------------- function Restlength(S:JString):integer; var
p:integer; begin
p:=Pos(RtfParagraph,S); while p>0 dobegin
S:=MidStr(S,p+Length(RtfParagraph),Length(S)-p-Length(RtfParagraph));
p:=Pos(RtfParagraph,S); end;
Restlength:=Length(S) end; //---------------------------------------------------------------- // //level indenting // //---------------------------------------------------------------- function level(T:JString):JString; var
i:integer;
S:JString; begin
S:=''; for i:=1 to lvl do
S:=S+Inspacenorm;
S:=S+T;
level:=S; end; //---------------------------------------------------------------- // //line in rtf // //---------------------------------------------------------------- procedure winlines(C:integer;S:AnsiString); var
ll:integer; begin if S<>''thenbegin if S[1] in ['0'..'9'] then
S:=Inspacenorm+S; if C<>0 then
S:=SetColor+IntToStr(C)+S;
S:=level(S); if C<>0 then
S:=S+SetNoColor; //attention for {}
S:=StringReplace(S,'\{','{',[rfReplaceAll]);
S:=StringReplace(S,'{',' \{',[rfReplaceAll]);
S:=StringReplace(S,'\}','}',[rfReplaceAll]);
S:=StringReplace(S,'}','\}',[rfReplaceAll]);
ll:=Length(S);
streamatt.WriteBuffer(S[1],ll); end;
lastlevel:=lvl; end; //---------------------------------------------------------------- // //Item format // //---------------------------------------------------------------- function item(C:integer;S:JString):JString; var
Erg:JString; begin
Erg:=''; if S<>''thenbegin if C<>0 then
Erg:=SetColor+IntToStr(C);
Erg:=Erg+S; if C<>0 then
Erg:=Erg+SetNoColor; end;
item:=Erg end; //---------------------------------------------------------------- // //Script format // //---------------------------------------------------------------- function Script(S:JString):JString; var
Erg:JString; begin
Erg:=''; if S<>''thenbegin
Erg:=Italic;
Erg:=Erg+S;
Erg:=Erg+ItalicOff; end;
Script:=Erg end; //---------------------------------------------------------------- // //look for a certain lnr // //---------------------------------------------------------------- function memtreelong(T:TMemTree;lnr,col:integer):JString; var
DB:JString; begin if T=nilthen
memtreelong:='' elseif T.Line=lnr then
memtreelong:=T.LongText elsebegin
DB:=memtreelong(T.Child,lnr,col); if DB=''then
memtreelong:=memtreelong(T.Sibling,lnr,col) else
memtreelong:=DB end end; //---------------------------------------------------------------- // //Traverse // //---------------------------------------------------------------- procedure traverse(T:TMemTree); var
DB:JString; begin if T<>nilthenbegin
DB:=T.Text;
winlines(5,IntToStr(T.level)+':'+DB+Para); if T.Child<>nilthenbegin
lvl:=lvl+1;
traverse(T.Child);
lvl:=lvl-1 end;
traverse(T.Sibling); end; end; //---------------------------------------------------------------- // //function ? // //---------------------------------------------------------------- function IsFunction(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_function) then
IsFunction:=true else
IsFunction:=false; end; //---------------------------------------------------------------- // //call ? // //---------------------------------------------------------------- function IsCall(T:TMemTree):boolean; begin if (T<>nil)and(Pos('$',T.Text)>=1)and(Pos('.',T.Text)>=1) then
IsCall:=true else
IsCall:=false; end; //---------------------------------------------------------------- // //get temporyry parent // //---------------------------------------------------------------- function TempParent(T:TMemTree):JString; var
p:integer; begin
TempParent:=''; if (T<>nil) thenbegin
p:=Pos('$',T.Text); if p>2 then
TempParent:=MidStr(T.Text,1,p-2); end; end; //---------------------------------------------------------------- // //Block ? // //---------------------------------------------------------------- function IsBlock(T:TMemTree):boolean; var pi:JString; begin
pi:=getpar(S_Typ,T.LongText); if (T<>nil)and(T.Text>'')and(pi=S_Block) then
IsBlock:=true else
IsBlock:=false; end; //---------------------------------------------------------------- // //Or ? // //---------------------------------------------------------------- function IsIf(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_if) then
IsIf:=true else
IsIf:=false; end; //---------------------------------------------------------------- // //Assign ? // //---------------------------------------------------------------- function IsAssign(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_assign) then
IsAssign:=true else
IsAssign:=false; end; //---------------------------------------------------------------- // //logical cond ? // //---------------------------------------------------------------- function IsCondition(T:TMemTree):boolean; begin if (T<>nil)and((T.Text=S_or)or(T.Text=S_and)or(T.Text=S_not)or(T.Text='0')or
(T.Text='1')) then
IsCondition:=true else
IsCondition:=false; end; //---------------------------------------------------------------- // //= ? // //---------------------------------------------------------------- function IsEqual(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_eq) then
IsEqual:=true else
IsEqual:=false; end; //---------------------------------------------------------------- // //Compose ? // //---------------------------------------------------------------- function IsCompose(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_compose) then
IsCompose:=true else
IsCompose:=false; end; //---------------------------------------------------------------- // //Or ? // //---------------------------------------------------------------- function IsOr(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_or) then
IsOr:=true else
IsOr:=false; end; //---------------------------------------------------------------- // //Or ? // //---------------------------------------------------------------- function IsUnion(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_Union) then
IsUnion:=true else
IsUnion:=false; end; //---------------------------------------------------------------- // //Expose ? // //---------------------------------------------------------------- function IsExpose(T:TMemTree):boolean; begin if (T<>nil)and(T.Text=S_replicator) then
IsExpose:=true else
IsExpose:=false; end; //---------------------------------------------------------------- // //Operator of Expression // //---------------------------------------------------------------- function Oper(T:TMemTree):JString; var
FC:TMemTree;
TL:JString; begin
TL:=''; if T<>nilthenbegin
ExprDepth:=ExprDepth+1;
FC:=T.Child; if IsFunction(T) thenbegin//function
TL:=LowerCase(FC.Text); end elsebegin//operator
TL:=LowerCase(T.Text); end; end;
Oper:=TL end; //---------------------------------------------------------------- // //Operator Priority // //---------------------------------------------------------------- function Prio(TL:JString):integer; begin if (TL=S_max) then
Prio:=10 elseif (TL=S_min) then
Prio:=10 elseif (TL=S_extension) then
Prio:=10 elseif (TL=S_mod) then
Prio:=10 elseif (TL=S_sqrt) then
Prio:=10 elseif (TL=S_abs) then
Prio:=10 elseif (TL=S_log) then
Prio:=10 elseif (TL=S_log10) then
Prio:=10 elseif (TL=S_convert) then
Prio:=10 elseif (TL=S_Sum) then
Prio:=10 elseif (TL=S_Prod) then
Prio:=10 elseif (TL=S_subscript) then
Prio:=10 elseif (TL=S_substring) then
Prio:=10 elseif (TL=S_interval) then
Prio:=10 elseif (TL=S_Fak) then
Prio:=9 elseif (TL=S_Star) then
Prio:=9 elseif (TL=S_catenate) then
Prio:=8 elseif (TL=S_power) then
Prio:=8 elseif (TL=S_mult) then
Prio:=7 elseif (TL=S_divnat) then
Prio:=7 elseif (TL=S_divrat) then
Prio:=7 elseif (TL=S_plus) then
Prio:=6 elseif (TL=S_minus) then
Prio:=6 elseif (TL=S_or) then
Prio:=5 elseif (TL=S_and) then
Prio:=4 elseif (TL=S_not) then
Prio:=3 elseif (TL=S_ne) then
Prio:=2 elseif (TL=S_ge) then
Prio:=2 elseif (TL=S_gt) then
Prio:=2 elseif (TL=S_lt) then
Prio:=2 elseif (TL=S_le) then
Prio:=2 elseif (TL=S_eq) then
Prio:=2 else
Prio:=11; end; //---------------------------------------------------------------- // //expression // //---------------------------------------------------------------- function Expression(var T:TMemTree):JString; var
FC,NC,TC,TCC,TCCE:TMemTree;//enr:integer;
E,Comma,Repl,FCE,TL,FCL,PLI,LINT,RINT,INTVAR,TempNr:JString; //---------------------------------------------------------------- // //Bracket // //---------------------------------------------------------------- function Brexpression(T:TMemTree;TL:JString):JString; var
E:JString; begin
E:=Expression(T); if T=nilthen
result:=E elseif Prio(Oper(T))<Prio(TL) then
result:='('+E+')' else
result:=E; end; begin //enr:=incr(Callsofexpr); //debuggvars
E:=''; if T<>nilthenbegin
ExprDepth:=ExprDepth+1;
FC:=T.Child; if IsFunction(T) thenbegin//function //------------------------------------------------------------------------ //function call //------------------------------------------------------------------------ if FC<>nilthen
NC:=FC.Sibling else
NC:=nil;
FCL:=LowerCase(FC.Text); if FC<>nilthen
NC:=FC.Sibling else
NC:=nil;
PLI:='';
Comma:=''; while NC<>nildobegin
PLI:=PLI+Comma+Expression(NC);
Comma:=',';
NC:=NC.Sibling; end; if (FCL=S_max) then
E:='max('+PLI+')' elseif (FCL=S_min) then
E:='min('+PLI+')' elseif (FCL=S_extension) then
E:='Extension('+PLI+')' elseif (FCL=S_mod) then
E:='mod('+PLI+')' elseif (FCL=S_sqrt) then
E:='sqrt('+PLI+')' elseif (FCL=S_abs) then
E:='||'+PLI+'||' elseif (FCL=S_log) then
E:='log('+PLI+')' elseif (FCL=S_log10) then
E:='log10('+PLI+')' elseif (FCL=S_convert) then
E:='conv('+PLI+')' elseif (FCL=S_Sum)or(FCL=S_Prod) thenbegin
Repl:=Summenzeichen; if FCL=S_Prod then
Repl:=Produktzeichen;
Repl:=Large+Repl+Normal;
NC:=FC.Sibling;
TC:=NC.Sibling;
TCC:=TC.Sibling;
TCCE:=TCC.Sibling;
E:=Bold+Repl+'\{'+BoldOff+Expression(TC)+'<='+Expression(NC)
+'<='+Expression(TCC);
E:=E+Bold+'|'+BoldOff+Expression(TCCE);
E:=E+Bold+'\}'+BoldOff; end elsebegin
E:=FCL+'('+PLI+')'; end; end elsebegin //------------------------------------------------------------------------ //operator //------------------------------------------------------------------------
TL:=LowerCase(T.Text); //catcher(enr=3); if (FC=nil) thenbegin//varname if TL[1]='$'thenbegin//special names
TempNr:=MidStr(TL,2,Length(TL)-1);
E:='i'+Subscript+TempNr+SubscriptOff; end else
E:=TL end elseif (TL=S_Fak) thenbegin
E:=Brexpression(FC,TL);
E:=E+'!' end elseif (TL=S_Star) thenbegin
E:=Brexpression(FC,TL);
E:=E+'*' end elseif (TL=S_not) then
E:='not '+Brexpression(FC,TL) elsebegin //------------------------------------------------------------------------ //multiadic //------------------------------------------------------------------------ if FC<>nilthen
NC:=FC.Sibling else
NC:=nil; if (TL=S_subscript) then
E:=Brexpression(FC,TL)+'['+Expression(NC)+']' elseif (TL=S_substring) then
E:=Brexpression(FC,TL)+'[:'+Expression(NC)+':]' elseif (TL=S_interval) thenbegin
LINT:=Brexpression(FC,TL);
RINT:=Brexpression(FC.Child,TL);
INTVAR:=FC.Sibling.Text;
NC:=FC.Sibling.Child;
E:='['+LINT+'<='+INTVAR+'<='+RINT+':'+Expression(NC)+']' end elsebegin //------------------------------------------------------------------------ //dyadic //------------------------------------------------------------------------ //Catcher(Enr=4);
FCE:=Brexpression(FC,TL); //if Restlength(FCE)>80 then // FCE:=FCE+Paranorm+level(folge(fortsetzung)); if (TL=S_and) then
E:=FCE+S_and+Brexpression(NC,TL) elseif (TL=S_or) then
E:=FCE+S_or+Brexpression(NC,TL) elseif (TL=S_lt) then
E:=FCE+'<'+Brexpression(NC,TL) elseif (TL=S_le) then
E:=FCE+'<='+Brexpression(NC,TL) elseif (TL=S_eq) then
E:=FCE+'=='+Brexpression(NC,TL) elseif (TL=S_ne) then
E:=FCE+'<>'+Brexpression(NC,TL) elseif (TL=S_ge) then
E:=FCE+'>='+Brexpression(NC,TL) elseif (TL=S_gt) then
E:=FCE+'>'+Brexpression(NC,TL) elseif (TL=S_plus) then
E:=FCE+S_plus+Brexpression(NC,TL) elseif (TL=S_catenate) then
E:=FCE+S_catenate+Brexpression(NC,TL) elseif (TL=S_minus) then
E:=FCE+S_minus+Brexpression(NC,TL) elseif (TL=S_mult) thenbegin if Pos(' ',FCE)>0 then
FCE:=FCE;
E:=FCE+S_mult+Brexpression(NC,TL) end elseif (TL=S_divnat) then
E:=FCE+S_divnat+Brexpression(NC,TL) elseif (TL=S_divrat) then
E:=FCE+S_divrat+Brexpression(NC,TL) elseif (TL=S_power) then
E:=FCE+S_power+Brexpression(NC,TL) else
E:=T.Text; end; end; end;
ExprDepth:=ExprDepth-1; end;
Expression:=E end; //---------------------------------------------------------------- // //list of exprs // //---------------------------------------------------------------- function explist(var T:TMemTree):JString; var
C:TMemTree;
E:JString; begin
E:=''; if T<>nilthenbegin
E:=E+SetColor+'5'+T.Text+SetNoColor;
C:=T.Sibling; While C<>nildobegin
E:=E+Para+SetColor+'5'+level(C.Text)+SetNoColor;
C:=C.Sibling; end; end;
explist:=E; end; //---------------------------------------------------------------- // //expr type // //---------------------------------------------------------------- function exptyp(T:TMemTree):Verb; var
FC,NC:TMemTree;
E:Verb; var
TL:JString; begin if T=nilthen
TL:='' else
TL:=LowerCase(T.Text);
E:=uebertraegt; if T<>nilthenbegin
FC:=T.Child; if FC<>nilthen
NC:=FC.Sibling else
NC:=nil; if (TL=S_or) then
E:=entscheidet elseif (TL=S_and) then
E:=entscheidet elseif (TL=S_not) then
E:=entscheidet elseif (TL=S_Fak) then
E:=berechnet elseif (TL=S_Star) then
E:=uebertraegt elseif (TL=S_lt) then
E:=vergleicht elseif (TL=S_le) then
E:=vergleicht elseif (TL=S_eq) then
E:=vergleicht elseif (TL=S_ne) then
E:=vergleicht elseif (TL=S_ge) then
E:=vergleicht elseif (TL=S_gt) then
E:=vergleicht elseif (TL=S_plus) then
E:=berechnet elseif (TL=S_minus) then
E:=berechnet elseif (TL=S_mult) then
E:=berechnet elseif (TL=S_divnat) then
E:=berechnet elseif (TL=S_divrat) then
E:=berechnet elseif (TL=S_power) then
E:=berechnet elseif (TL=S_subscript) then
E:=selektiert elseif (TL=S_substring) then
E:=selektiert elseif (TL=S_interval) then
E:=selektiert elseif (TL=S_max) then
E:=sucht elseif (TL=S_min) then
E:=sucht elseif (TL=S_convert) then
E:=berechnet elseif (TL=S_extension) then
E:=loest elseif (TL=S_mod) then
E:=berechnet elseif (TL=S_sqrt) then
E:=berechnet elseif (TL=S_abs) then
E:=berechnet elseif (TL=S_log) then
E:=berechnet elseif (TL=S_log10) then
E:=berechnet elseif (TL=S_function) thenbegin if (FC.Text=S_Sum) then
E:=berechnet elseif (FC.Text=S_Prod) then
E:=berechnet else
E:=ruft end elsebegin
E:=exptyp(FC); if E=uebertraegt then
E:=exptyp(NC); end; end;
exptyp:=E end; //---------------------------------------------------------------- // //Assigns = Block // //---------------------------------------------------------------- function Command(var N:TMemTree):JString; var
FC,NC:TMemTree;
E,EF,B,Func:JString;
V:Verb; begin
Command:=''; if N<>nilthenbegin if N.Line=0 then
N.Line:=WinLnr;
E:=''; if IsBlock(N) thenbegin
ThisBlock:=N.Text;
N:=N.Child;
E:=CheckPara(E);
LastFunc:='' end;
FC:=N.Child; if IsUnion(N) thenbegin
E:=E+Command(FC);
NC:=FC.Sibling;
E:=E+Command(NC); end elseif IsIf(N) thenbegin
E:=level(folge(wenn)+inspacenorm);
lvl:=lvl+1;
E:=CheckPara(E+Expression(FC)+inspacenorm+Para+inspacenorm);
NC:=FC.Sibling; if NC<>nilthenbegin
E:=E+Command(NC); while NC.Sibling<>nildobegin
NC:=NC.Sibling;
E:=E+Command(NC); end; end;
E:=CheckPara(E);
lvl:=lvl-1; end elseif IsAssign(N) thenbegin
NC:=FC.Sibling; if IsCall(FC) thenbegin
Func:=TempParent(FC);
EF:=Expression(NC); if Func=LastFunc thenbegin
E:=E+' , '+EF; end elsebegin if LastFunc<>''then
E:=E+Paranorm;
E:=E+level(Func+Inspacenorm+EF); end;
LastFunc:=Func; end elsebegin if LastFunc<>''then
E:=E+Paranorm;
V:=berechnet;
E:=E+level(folge(V)+inspacenorm);
B:=Expression(FC)+':='+Expression(NC);
E:=CheckPara(E+Inspacenorm+B); end;
E:=E+Para end; //else //error(100,'Block inkonsistent');
Command:=E; end; end; //---------------------------------------------------------------- // //interpret // //---------------------------------------------------------------- function interpret(var p:TMemTree):JString; var
FC,NC:TMemTree;
LA,LB,LC,LD,Tx,Erg:JString; begin
Erg:=''; if p<>nilthenbegin
Tx:=p.Text;
FC:=p.Child; if FC<>nilthen
NC:=FC.Sibling else
NC:=nil; if IsBlock(p) thenbegin
Erg:=Command(p); //Erg:=CheckPara(Erg); end elseif IsExpose(p) thenbegin
lvl:=lvl+1;
LA:=interpret(FC);
lvl:=lvl-1; if LA<>''thenbegin
Erg:=level(item(3,folge(mehrmals)))+Paranorm+LA;
Erg:=Erg+level(item(3,folge(ausgefuehrt))); end; end elseif IsCompose(p) thenbegin
LA:=interpret(FC);
LB:=interpret(NC);
Erg:=Erg+CheckPara(LA)+LB; end elseif IsOr(p) thenbegin
LA:=level(item(3,folge(entweder)))+Para;
lvl:=lvl+1;
LB:=interpret(FC);
lvl:=lvl-1;
LC:=level(item(3,folge(oder)))+Para;
lvl:=lvl+1;
LD:=interpret(NC);
lvl:=lvl-1; if LB<>''then
Erg:=LA+LB+LC+LD else
Erg:=LD end; end;
interpret:=Erg end; //---------------------------------------------------------------- // //display res // //---------------------------------------------------------------- procedure displayres(var Root:TMemTree;var RE:TEde); var
Method,FileTree,Compl,Extree,IFTRee,TreeBug:TMemTree;
SE,M,H,WL:JString;
Debug:boolean; begin //set address of richedit window
Duration:=0;
Durmax:=0;
Durmin:=100000;
Durn:=0;
Duravg:=0;
edt:=@RE;
WinLnr:=0;
Callsofexpr:=0;
StartRtfSource(RE);
WinLnr:=1;
lastfolgeline:=-2;
lastphrase:=keine;
lvl:=0;
lastlevel:=-1;
Debug:=false; if Debug thenbegin
winlines(0,Underline+'Baumnotation'+UnderLineOff+Para);
traverse(Root); end;
FileTree:=Root;
Method:=FileTree.Child; whilenot Debug and (Method<>nil) dobegin
M:=Method.Text;
Compl:=Method.Child;
Method:=Method.Sibling;
IFTRee:=Method.Child;
Method:=Method.Sibling; if Method<>nilthenbegin
Extree:=Method;
TreeBug:=Method.Sibling;
lvl:=1;
ExprDepth:=0;
H:=SetColor+'5'+M+SetNoColor; //Metainformation
winlines(2,Normal+Underline+'Analyse von "'+H+'"'+UnderLineOff+Para);
lvl:=2;
winlines(2,Underline+'Komplexität'+UnderLineOff+Para);
lvl:=3;
winlines(0,Middle+Omega+Normal+'('+Expression(Compl)+')'+Para); //Schnittstellen
lvl:=2;
winlines(2,Normal+Underline+'Schnittstellen'+UnderLineOff+Para);
lvl:=3;
SE:=explist(IFTRee); if SE<>''then
winlines(0,trim(SE)+Para) elsebegin
lvl:=2;
winlines(0,level(folge(keine))+Para); end; //Seiteneffekte
lvl:=2;
winlines(2,Normal+Underline+'Seiteneffekte'+UnderLineOff+Para);
lvl:=3;
ThisBlock:='';
LastFunc:='';
SE:=interpret(Extree); //WL:=MidStr(SE,length(SE)-7,8); //rework {} if Pos('}',SE)>0 then
SE:=SE+Inspacenorm+RtfParagraph; if SE<>''thenbegin
lvl:=0;
winlines(0,SE) end elsebegin
lvl:=2;
winlines(0,level(folge(keine))+Para); end; if TreeBug<>nilthenbegin
lvl:=2;
winlines(2,Underline+'Probleme'+UnderLineOff+Para);
lvl:=3;
WL:=explist(TreeBug.Child);
winlines(0,WL+Para);//nur für Debug
winlines(0,Para);
Method:=TreeBug.Sibling;//TreeBug.Sibling end else
Method:=nil;
lvl:=2; end; end;
CloseRtfSource(); end; //---------------------------------------------------------------- // //Ende dieser Quelle // //---------------------------------------------------------------- end.
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.24Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.