Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Unerwünschte Zeichen ? (https://www.delphipraxis.net/154865-unerwuenschte-zeichen.html)

Nils_13 28. Sep 2010 15:26

Unerwünschte Zeichen ?
 
Hi,

ich muss eine Syntaxanalyse durchführen von einer ganz einfach Sprache. Das geht alles super, habe auf dem Gebiet ja auch schon etwas Erfahrung und weiß was man so falsch machen kann. Doch eins ist fatal: Der Lexer generiert mir seltsamerweise leere Zeilen. Es geht nicht darum dass diese leeren Zeilen schlecht sind weil sie nicht perfekt sind, sondern es geht darum dass der Parser deshalb anschließend durcheinander kommt. Denn ich will mit leeren Zeilen nichts mehr zu tun haben, da sie nur Ärger machen und sowieso keinen Sinn haben (der Lexer weist den Tokens die Position im Originaltext zu um am Ende einen Fehler genau positionieren zu können - daher sind leere Zeilen auf alle Fälle sinnlos und fehleranfällig sowieso). Ich habe zur einfachen Übersicht ein paar Grundfunktionen, zum Beispiel eine die mir die Tokens am Ende zu einem Gesamttokenarray hinzufügt. Diese Prozedur prüft natürlich auch zur Sicherheit nochmal ob denn Trim(<TokenString>) = '' ist. Doch scheinbar kommt da irgendetwas durch, was kein '' aber dafür unsichtbar ist. Ich habe stupide schon über eine Schleife geschaut, wie viele Zeichen es denn gibt die NICHT zum zulässigen Alphabet gehören. Es waren genauso viele wie ich leere Zeilen habe. Also gibt es irgendwo ein Zeichen, welches meine if-Abfrage austrickst. Habt Ihr eine Idee, welches Zeichen das sein kann und wie man unerwünschte und irrelevante Zeichen in dem Kontext einfach los wird ? Bin da etwas am verzweifeln, zumal ich nicht mal rauskriege welches Zeichen mir da einen Streich spielt.

Gruß,
Nils

shmia 28. Sep 2010 15:55

AW: Unerwünschte Zeichen ?
 
Möchtest du vielleicht alle Zeichen eliminieren, die nicht erlaubt sind?

Delphi-Quellcode:
// entfernt alle Zeichen aus <S>, die nicht in <Chars> sind
function StrKeepChars(const S: string; const Chars: TSysCharSet): string; // aus der JCL
var
  Source, Dest: PChar;
  Len, Index: Integer;
begin
  Len := Length(S);
  SetLength(Result, Len);
  UniqueString(Result);
  Source := PChar(S);
  Dest := PChar(Result);
  for Index := 0 to Len-1 do
  begin
    if Source^ in Chars then
    begin
      Dest^ := Source^;
      Inc(Dest,SizeOf(Char));
    end;
    Inc(Source,SizeOf(Char));
  end;
  SetLength(Result, (Longint(Dest) - Longint(PChar(Result))) div SizeOf(Char));
end;

clean_string := StrKeepChars(bad_string, ['0'..'9', 'A'-'Z', 'a'-'z', '!', '"']);

Nils_13 28. Sep 2010 15:59

AW: Unerwünschte Zeichen ?
 
Das funktioniert doch schon mal sehr gut, vielen Dank. Die unerwünschten Leerzeilen sind eliminiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 Uhr.

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