Ich versuche, pyparsing
zu verwenden, um Funktionsaufrufe im folgenden Format zu analysieren:
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?
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:
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:
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:
Ich nehme an, 'h ()' ist ein gültiger Funktionsaufruf, nur keine Argumente. Mit Optional
können Sie erlauben, dass Argumente optional sind:
Jetzt können Sie "f (g (x), y, h ())" analysieren.
Willkommen bei pyparsing!
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):