Geschachtelte Funktionsaufrufe mit Hilfe von pyparsing analysieren

8

Ich versuche, pyparsing zu verwenden, um Funktionsaufrufe im folgenden Format zu analysieren:

%Vor%

Das ist einfach. Da es sich jedoch um einen rekursiven Parser handelt, sollte es auch leicht zu parsen sein:

%Vor%

Das kann ich nicht bekommen. Hier ist ein heruntergekommenes Beispiel:

%Vor%

Und hier ist die Ausgabe:

%Vor%

Warum interpretiert mein Parser den Funktor des inneren Ausdrucks als eigenständigen Bezeichner?

    
JasonFruit 16.04.2012, 05:05
quelle

3 Antworten

4

Die Definition von arg sollte mit dem Element angeordnet werden, das mit einem anderen Element auf der linken Seite beginnt. Daher wird es bevorzugt angepasst:

%Vor%     
JasonFruit 16.04.2012, 05:28
quelle
11

Es ist schön, herauszufinden, dass identifier in Ihrer Definition von expression masking arg maskiert hat. Hier sind einige andere Tipps zu Ihrem Parser:

x + ZeroOrMore(',' + x) ist ein sehr häufiges Muster in pyparsing-Parsern, also enthält pyparsing eine Hilfsmethode delimitedList , mit der Sie diesen Ausdruck durch delimitedList(x) ersetzen können. Tatsächlich macht delimitedList eine andere Sache - sie unterdrückt die begrenzenden Kommas (oder andere Begrenzer, wenn sie mit dem optionalen delim -Argument angegeben werden), basierend auf der Vorstellung, dass die Begrenzer nützlich sind beim Parsen, aber nur Krempel-Token beim Versuch um anschließend die geparsten Daten zu durchsuchen. Sie können Args also als args = delimitedList(arg) umschreiben, und Sie erhalten nur die Argumente in einer Liste, keine Kommas, die Sie "übertreten" müssen.

Sie können die Klasse Group verwenden, um eine tatsächliche Struktur in Ihren analysierten Token zu erstellen. Dadurch wird Ihre Verschachtelungshierarchie für Sie erstellt, ohne dass Sie diese Liste durchgehen müssen, um nach '(' und ')' zu suchen, wenn Sie eine Ebene in der Verschachtelung von Funktionen durchlaufen haben:

%Vor%

Da Ihre Argumente Group ed für Sie sind, können Sie die Parens weiter unterdrücken, da sie wie die Trennkommas ihre Arbeit während des Parsens erledigen, aber mit der Gruppierung Ihrer Token sind sie nicht mehr notwendig:

%Vor%

Ich nehme an, 'h ()' ist ein gültiger Funktionsaufruf, nur keine Argumente. Mit Optional können Sie erlauben, dass Argumente optional sind:

%Vor%

Jetzt können Sie "f (g (x), y, h ())" analysieren.

Willkommen bei pyparsing!

    
PaulMcG 17.04.2012 09:19
quelle
0

Pauls Post hat sehr geholfen. Nur für die Referenz von anderen kann das gleiche verwendet werden, um for loops wie folgt zu definieren (vereinfachter Pseudo-Parser hier, um die Struktur zu zeigen):

%Vor%     
Ioannis Filippidis 24.07.2013 22:06
quelle

Tags und Links