Gibt es Gründe, ich konnte keine Sprache unterstützt Infix, Postfix und Prefix-Funktionen und vieles mehr erstellen?

StackOverflow https://stackoverflow.com/questions/427040

Frage

Ich habe grüble über eine Sprache zu schaffen, die sehr gut geeignet, um die Schaffung von DSLs wären, durch Definitionen von Funktionen, mit denen der Infix, Postfix, Präfix sind, oder auch aus mehreren Worten bestehen.

: Zum Beispiel könnten Sie ein Infix Multiplikationsoperator wie folgt (wobei mehrfach (X, Y) bereits definiert ist) definieren
a * b => multiply(a,b)

oder ein Postfix "squared" Operator:

a squared => a * a

oder ein C oder Java-Stil ternärer Operator, die mit Variablen durchsetzt zwei Schlüsselwörter beinhaltet:

a ? b : c => if a==true then b else c

Offensichtlich gibt es viel Raum für Zweideutigkeiten in einer solchen Sprache, aber wenn es statisch typisiert ist (mit Typinferenz), dann die meisten Unklarheiten beseitigt werden könnten, und diejenigen, die einen Syntaxfehler in Betracht gezogen werden bleiben könnte (vom korrigiert werden Hinzufügen von Klammern gegebenenfalls).

Gibt es einen Grund, warum ich nicht bin zu sehen, dass würde diese äußerst schwierig, unmöglich oder nur eine einfache schlechte Idee machen?

Edit: Eine Reihe von Menschen haben mich auf Sprachen hingewiesen, dass diese oder so etwas tun kann, aber ich bin wirklich daran interessiert, Zeiger, wie ich meine eigenen Parser für sie umsetzen könnte, oder Probleme, die ich könnte auftreten, wenn dies zu tun.

War es hilfreich?

Lösung

Dies ist nicht allzu schwer zu tun. Sie werden jeden Betreiber eine fixity (Infix, Präfix oder Postfix) und eine Vorrang zuweisen möchten. Machen Sie den Vortritt eine reelle Zahl; Sie werden mir später danken. Die Betreiber höherer Priorität binden stärker als Betreiber von niedrigerem Vorrang; in gleichen Ebenen Vorrang, können Sie Begriffsklärung mit Klammern benötigen, aber Sie werden es wahrscheinlich vorziehen, einige Betreiber zu erlauben, zu sein assoziative , so können Sie schreiben

x + y + z

ohne Klammern. Sobald Sie eine Unveränderlichkeit, einen Vorrang haben, und eine Assoziativität für jeden Betreiber, sollten Sie einen Operator-Vorrang-Parser schreiben. Diese Art von Parser ist ziemlich einfach zu schreiben; scannt Token von links nach rechts und verwendet einen Hilfsstapel. Es gibt eine Erklärung in dem Drachen Buch, aber ich habe noch nie sehr deutlich, zum Teil, weil der Drachen Buch einen sehr allgemeinen Fall von Operator-Vorrang-Analyse beschreibt. Aber ich glaube nicht, werden Sie es schwierig finden.

Ein weiterer Fall, dass Sie von vorsichtig sein wollen, werden, wenn Sie

prefix (e) postfix

wo prefix und postfix haben die gleiche Priorität. Dieser Fall erfordert auch Klammern Begriffsklärung.

Ihr Papier Unparsing Ausdrücke mit Präfix und Postfix-Operatoren hat ein Beispiel Parser in dem Rücken, und Sie können den Code herunterladen, aber in ML es geschrieben, so dass ihr Wirken nicht auf den Amateur offensichtlich. Aber das ganze Geschäft der Unveränderlichkeit und so weiter wird im Detail erläutert.

Andere Tipps

Was sind Sie Reihenfolge der Operationen tun?

a * b squared

Sie möchten vielleicht Scala überprüfen, die eine Art einzigartigen Ansatz für Operatoren und Methoden hat.

Haskell hat genau das, was Sie suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top