Laden...

File parsen: Vorgehensweise?

Erstellt von MastaOfDisasta vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.625 Views
M
MastaOfDisasta Themenstarter:in
20 Beiträge seit 2005
vor 19 Jahren
File parsen: Vorgehensweise?

Moin Moin,

ich hab hier eine Datei, die ich parsen muss. Die Datei ist eine .adm Datei von Windows, die eine festgelegte Syntax hat.

Ein Beispiel:


CATEGORY !!NetMeeting

    	CATEGORY !!AppSharing
	        POLICY !!DisableAppSharing
		KEYNAME "Software\Policies\Microsoft\Conferencing"
		EXPLAIN !!DisableAppSharing_Help
		 VALUENAME "NoAppSharing"
	        END POLICY
	END CATEGORY

END CATEGORY	

Zur Syntax:
Alle Wörter in Großbuchstaben sind Schlüsselwörter. Müssen nicht unbedingt groß geschrieben werden, ich erwähne das nur, damit man besser sieht, was erreicht werden soll.
Bisher bin ich so vorgegangen, dass ich davon ausgegangen bin, dass genau ein Schlüsselwort pro Zeile existiert und ich die Datei daher zeilenweise eingelesen habe und je nachdem, welches Schlüsselwort am Anfang der Zeile steht eine bestimmte Aktion ausgelöst habe.
Jetzt hab ich das parsen auf einem anderen System getestet und bin natürlich direkt gegen die Wand gelaufen 🙄
Solange jeweils nur ein Schlüsselwort in einer Zeile steht funktioniert das ganze wunderbar, aber auf dem anderen System durfte ich zu meinem Erschrecken feststellen, dass die Datei nicht zwingend zeilenweise aufgebaut sein muss. Es sind auch Konstrukte wie untenstehend möglich:


CATEGORY !!NetMeeting CATEGORY !!AppSharing POLICY !!DisableAppSharing
		KEYNAME "Software\Policies\Microsoft\Conferencing"
		EXPLAIN !!DisableAppSharing_Help
		 VALUENAME "NoAppSharing"
	        END POLICY END CATEGORY 
END CATEGORY	

Wie man sieht können auch mehrere Schlüsselwörter in einer Zeile stehen. Ein Zeilenumbruch ist nicht zwingend erforderlich.
Jetzt darf ich das Parsen also komplett umbauen.
Wie geht man mit sowas am besten um?

Greetz
MoD

Life is a piece of shit, when you look at it!

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo MastaOfDisasta,

wenn das Parsen bei dir im Prinzip gut geht, nur die Zeilenumbrüche das Problem sind, würde ich einfach in einem Preprocessing-Schritt vor jedem Schlüsselwort einen zusätzlichen Zeilenumbruch einfügen.

herbivore

M
MastaOfDisasta Themenstarter:in
20 Beiträge seit 2005
vor 19 Jahren

Hahahaha

Man bin ich dämlich, dass ich da nicht selber drauf gekommen bin, danke 🙂

Da ich keine sonderliche Lust hab das ganze wieder umzubauen werd ich wohl die Lösung nutzen. Trotzdem würde mich interessieren, wie man bei sowas sinnvollerweise vorgeht, denn ich glaube nicht, dass das wirklich ideal ist, was ich da treibe.
Also änder ich meine Frage mal in eine allgemeine Frage: Wie würdet ihr vorgehen um so eine Datei zu parsen?

Greetz
MoD

Life is a piece of shit, when you look at it!

M
456 Beiträge seit 2004
vor 19 Jahren

In der Compilertechnik gibt es ja da eine ganz typische Vorgehensweise. Dein Text wird erst in einem Scanner (manchmal auch Tokenizer oder Lexer genannt) in einzelne Tokens zerlegt.
Hast du - mal als Beispiel - eine C-Funfktion die so aussieht:

float func(float f)
{
  return f*f;
}

dann zerlegt der Lexer sie in eine Tokenliste die wie folgt aussieht:

float
func
(
float
f
)
{
return
f
\*
f
;
}

Der Scanner ist meist nichts weiter als ein endlicher Automat der Whitespaces überspringt und die eingelesenen Symbole einer Tokenliste hinzufügt.

Erst nach diesem Schritt wird erst "richtig" geparst.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

O
98 Beiträge seit 2005
vor 19 Jahren

Es kommt auf das Problem an das du hast. Wenn du nen Rechenausdruck hast dann ist ein Binärer Baum ganz hilfreich.
Hast du z.B. eine Struktur wie ein XML-Document dann kommst du mit Rekursion sehr gut durch.

Hier mal die Seite von meine Prof. Schau unter Informatik III (Compiler Bau)
da kannst du dir ein paar ideen anschauen.

http://www.inf.fh-flensburg.de/lang/lehrver.htm

M
456 Beiträge seit 2004
vor 19 Jahren

Schau mal hier in deiner Frameworkinstallation:

C:\Programme\Microsoft.NET\SDK\v1.1\Tool Developers Guide\Samples\clisp

Die Dateien Lexer.cs und Parser.cs demonstrieren die typische Vorgehensweise ganz gut.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.