2009-03-12 5 views
2

Ich habe einen Quellcode in Fortran (fast irrelevant) und ich möchte die Funktionsnamen und Argumente analysieren.Funktion Parser mit RegEx in Python

zB mit

(\w+)\([^\(\)]+\) 

mit

a(b(1 + 2 * 2), c(3,4)) 

ich die folgenden: (wie erwartet)

b, 1 + 2 * 2 
c, 3,4 

wo ich

a, b(1 + 2 * 2), c(3,4) 
b, 1 + 2 * 2 
c, 3,4 
benötigen würde

Irgendwelche Vorschläge?

Vielen Dank für Ihre Zeit ...

+0

Ich glaube nicht, dass Sie dies nur mit regulären Ausdrücken tun können. Wie ihr Name andeutet, sind sie nur in der Lage, * reguläre * Ausdrücke zu handhaben; Ich bin nicht genug mit der Sprachtheorie beschäftigt, um zu wissen, wo Fortran fällt, aber ich schätze, Sie brauchen einen Skelett-Parser, um das richtig zu machen. – kquinn

Antwort

2

Ich glaube nicht, das ein Job für reguläre Ausdrücke ist ... sie kann nicht wirklich verschachtelte Muster behandeln.

Dies ist, weil Regexes in FSMs (Finite State Machines) kompiliert werden. Um beliebig verschachtelte Ausdrücke zu analysieren, können Sie keine FSM verwenden, da Sie unendlich viele Zustände benötigen, um die willkürliche Verschachtelung zu verfolgen. Siehe auch SO thread.

2

Dies ist eine nichtlineare Grammatik - Sie müssen in der Lage sein, eine Reihe zulässiger Regeln zu rekrutieren. Betrachten Sie pyparsing, um einfaches CFG (Context Free Grammar) Parsing über lesbare Spezifikationen zu machen.

Es ist eine Weile her, seit ich CFGs geschrieben habe, und ich bin wahrscheinlich rostig, also verweise ich Sie auf die Python EBNF, um eine Vorstellung davon zu bekommen, wie Sie eine für eine Teilmenge einer Sprachsyntax konstruieren können.

Bearbeiten: Wenn das Beispiel immer einfach sein wird, können Sie eine kleine Zustandsmaschine Klasse/Funktion, die über die Token-Eingabe-Zeichenfolge iteriert, wie @Devin Jeanpierre schlägt.

2

Es kann mit regulären Ausdrücken getan werden - verwenden Sie sie, um die Zeichenfolge zu tokenisieren und mit den Tokens zu arbeiten. d.h. siehe re.Scanner. Alternativ verwenden Sie einfach Pyparsing.

+0

Richtig, Sie können Ihre eigene Zustandsmaschine tokenisieren und verwenden, Sie können es tun, aber das ist technisch nicht nur mit regulären Ausdrücken. – cdleary

+0

Tatsache ist, dass ich in der Frage "nur Regex" nicht sah, nur "Regex". Das re-Modul enthält einen Scanner und hat seit Ewigkeiten - nicht, dass es dokumentiert ist (bleh). –

+0

Oooh coole undokumentierte Funktionen! +1 von mir für die Anweisung, dass ich schaue. :-) – cdleary

1

Sie können dies nicht nur mit regulären Ausdrücken tun. Es ist irgendwie rekursiv. Sie sollten zuerst die äußerste Funktion und ihre Argumente zusammenbringen, den Namen der Funktion ausgeben und dann das Gleiche tun (den Funktionsnamen, dann seine Argumente) mit all seinen Argumenten vergleichen. Regex allein sind nicht genug.

2

Sie können einen Blick auf PLY (Python Lex-Yacc) werfen, es ist (meiner Meinung nach) sehr einfach zu bedienen und gut dokumentiert, und es kommt mit einer calculator example, die ein guter Ausgangspunkt sein könnte.