Scala - Erstellen eines grundlegenden dynamischen Funktionsparsers

8

Ich bin neu bei Scala, aber ich habe mich gefragt, ob es möglich ist, einen einfachen Equation-Parser in der Sprache zu implementieren.

Sagen wir, ich habe ein paar Funktionen (ähnlich wie Excel-Funktionen):

IF(Cond a=b, val_true, val_false)

MID(String, Start_pos, num_chars) - Zeichenfolge extrahieren

LEN(String) - Länge einer Zeichenkette

OR(cond1, cond2, ... condn)

AND(cond1, cond2, ... condn)

Die Idee wäre also, ich könnte eine Formel zur Laufzeit als String von einem Benutzer als Befehlszeilenargument übergeben, zusammen mit anderen Parametern wie IF(LEN(param1)=4,MID(param1,2,1), MID(param1,0,LEN(param1)))

Die Idee besteht darin, die Funktion auszuwerten. Wenn der Benutzer also die obige Formel und die Zeichenfolge "scat" bereitstellt, wäre die Ausgabe "a". Wenn die Zeichenfolge "scala" gegeben würde, wäre die Ausgabe "scala" ...

Wie einfach wäre das in Scala umzusetzen? Was ist der beste Designansatz? Ich weiß, dass es keine Funktionszeiger gibt (in C hätte ich die Formelzeichenfolge in eine Sammlung von Funktionspunkten geparst und von dort gegangen) ...

Jeder Rat, wie man sich diesem effizienten Scala-Stil nähert, würde geschätzt werden.

Prost!

    
NightWolf 20.03.2012, 01:13
quelle

1 Antwort

8

Diese Frage hat dazu geführt, mit Kombinatorparsern zu experimentieren. Angesichts der folgenden algebraischen Datentypen, die eine Teilmenge Ihrer Ausdrücke darstellen:

%Vor%

Die folgende Parserdefinition analysiert den angegebenen Ausdruck und gibt ein Expr -Objekt zurück:

%Vor%

Dann können die Ergebnisse analysiert und ausgewertet werden:

%Vor%

Beachten Sie, dass die Grammatik, die ich zur Verfügung gestellt habe, nur das Minimum ist, um Ihr Beispiel parsen zu lassen, und absolut keine Fehlerverwaltung oder Typprüfung. Prozessweise habe ich zuerst eine Grammatik ohne die Produktion ^^ ... entwickelt, die dein Beispiel analysiert, dann die Expr -Typen hinzugefügt, aber ohne die eval-Methode, dann die Produktion ^^ ... , dann habe ich schließlich die eval-Methoden hinzugefügt das Merkmal Expr und Unterklassen.

    
huynhjl 20.03.2012, 06:24
quelle