Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zuweisungsscanner???? (https://www.delphipraxis.net/44918-zuweisungsscanner.html)

Feechan 26. Apr 2005 20:05


Zuweisungsscanner????
 
Hallo!
Ich hänge seit einer Woche an diesem blöden Zuweisungsscanner und weiß echt nicht weiter, das ist die Aufgabe:
Ich soll eine Art Zuweisungsscanner implementieren, der aus einem edit-feld die einzelnen Bestandteile rauszieht, in einem Array in einer zweiten Unit speichert und dass ganze dann in einer Listbox wiedergibt. Dabei soll das ganze ungefähr so aussehen:

Eingetippt: a:=b;
Ausgabe:
a
:=
b
;

oder:

anna:=34 + jojo;

=>
anna
:=
34
+
jojo
;

Hier ist schon etwas quelltext:
Delphi-Quellcode:
unit zScanclss;

interface

type tTokenfolge=array[1..100] of string;
type tOperatormenge = set of '*'..'/'; //Menge von Zeichen (=char) von .. bis
                                       // bezogen auf den ASCII-Code
type tZuweisungsScanner = class
    private
      Tokenfolge: tTokenfolge;
      index : integer; // Aktueller Tokenfolgenindex
      Operatormenge: tOperatormenge;
    public
      constructor create;
      function isOperator(c: char): boolean;
      procedure makeTokenfolge(quelle : string);
      function getTokenfolge: tTokenfolge;
end;

implementation

constructor tZuweisungsScanner.create;
begin
 Operatormenge := ['*','+','-','/'];
 index:=0; // Noch kein Token ermittelt.
end;

function tZuweisungsScanner.isOperator(c: char): boolean;
begin
  result := (c in Operatormenge); // Ist c in der Menge enthalten?
end;

procedure tZuweisungsScanner.makeTokenfolge(quelle : string);
var l,x:integer;
begin
l:=length(quelle);
for x:=1 to l do begin
Tokenfolge[x]:=quelle[x];
end;
end;

function tZuweisungsScanner.getTokenfolge: tTokenfolge;
var i:integer;
begin
result[1]:=tokenfolge[1];
i:=1;
while tokenfolge[i+1]<>':' do begin
result[1]:=result[i];
inc(i);
end;
result[2]:=':=';
//while
end;

end.
Da stellt sich mir immer die Frage: :wiejetzt:
Könnt ihr mir da helfen? Wär echt super!
Bye!
Fee

Feechan 26. Apr 2005 20:21

Re: Zuweisungsscanner????
 
wies aussieht könnt ihr mir da auch nicht weiterhelfen..... trotzdem danke

SirThornberry 26. Apr 2005 20:26

Re: Zuweisungsscanner????
 
ich glaub du gehst das ganze bischen falsch an... gehe den gesammtstring per schleife, zeischen für zeischen durch und sobald von buchstaben zu zahlen, zahlen zu operator etc. wechselt stopfst du das bisher gelesene in die liste.

Feechan 26. Apr 2005 20:28

Re: Zuweisungsscanner????
 
hört sich logisch an aber wie soll ich das bitte machen?

SirThornberry 26. Apr 2005 20:32

Re: Zuweisungsscanner????
 
warte mal ca. ne viertel stunde dann hab ich das fertig

DGL-luke 26. Apr 2005 20:34

Re: Zuweisungsscanner????
 
du kannst mit s[i] mit i € IN; i >= 1 auf die einzelnen Zeichen eines strings zuweisen. wenn du das ganze in ner for schleife ablaufen lässt, kriegst du eins nach dem anderen.
wenn dir das nicht reicht, kriegst du gerne code von mir, wie ich das mal gemacht habe.

EDIT: formulierung geändert.

SirThornberry 26. Apr 2005 20:38

Re: Zuweisungsscanner????
 
So siehts aus:
Delphi-Quellcode:
procedure doit(AStr: String; ADestList: TStrings);
type
  TCharType = (ctZahl, ctBuchstabe, ctOther);
  function LGetCharType(AChar: Char): TCharType;
  begin
    if pos(AChar, '1234567890') > 0 then
      result := ctZahl
    else if pos(AnsiLowerCase(AChar), 'abcdefghijklmnopqrstuvwxyz') > 0 then
      result := ctBuchstabe
    else
      result := ctOther;
  end;
var LTmpStr: String;
    LCurrType, LType: TCharType;
    LCount: Integer;
begin
  AStr := StringReplace(AStr, ' ', '', [rfReplaceAll]);
  if (AStr <> '') then
  begin
    LTmpStr := '';
    LCurrType := LGetCharType(AStr[1]);
    for LCount := 1 to length(AStr) do
    begin
      LType := LGetCharType(AStr[LCount]);
      if LType <> LCurrType then
      begin
        if LTmpStr <> '' then
        begin
          ADestList.Add(LTmpStr);
          LTmpStr := '';
        end;
        LCurrType := LType;
      end;
      LTmpStr := LTmpStr + AStr[LCount];
    end;
    if LTmpStr <> '' then
      ADestList.Add(LTmpStr);
  end;
end;
beispielaufruf:
Delphi-Quellcode:
var LDestList: TStringList;
begin
  LDestList := TStringList.Create;
  doit('anna:=34 + jojo;', LDestList);
  ShowMessage(LDestList.Text);
  LDestList.Free;

Feechan 26. Apr 2005 20:39

Re: Zuweisungsscanner????
 
wow, danke sir tom... (vergessen ^^)
ich muss kurz weg, bin um neun wieder da, danke danke danke danke danke danke!!!!!!
:hello:

DGL-luke 26. Apr 2005 20:46

Re: Zuweisungsscanner????
 
das ganze kannst du kürzer auch haben.....
(und weniger c&p verdächtig)

Delphi-Quellcode:
type TCharSet:set of char; // eine Menge von Zeichen

function explode(s:string; chars:TCharSet);
var i:integer;
begin
 for i := 1 to length(s) do //den ganzen string durchlaufen
  if s[i] in chars then handle(i,s[i]); //wenn gefunden, dann index und character an handler übergeben.
end;

procedure handle(index:Integer;character:char);
begin
showmessage('am index ' + inttostr(i) + ' trat der char '+ character + ' auf.'); //Dialogbox mit Index und Character ausgeben
// hier irgendwas machen. zum besipiel die zuweisung auflösen.
end;
EDIT: für den in operator liebe ich delphi.......

SirThornberry 26. Apr 2005 20:51

Re: Zuweisungsscanner????
 
@DGL-luke: Dir ist aber schon aufgefallen das es nicht ein einzelnes zeischen ist was die verschiedenen teile von einander trennt?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz