Wie funktioniert das "infix"?

9

Ich spiele mit den Deklarationen infixr , infixl und infix . Ich verstehe, wie infixr und infixl funktioniert:

%Vor%

Aber ich verstehe nicht, wie das Schlüsselwort infix funktioniert. Habe ich Recht damit, dass Sie mit infix immer die Reihenfolge in Klammern angeben müssen? Wenn ja, warum ist das numerische Argument notwendig, wenn man berücksichtigt, dass Klammern die höchste Priorität haben?

    
Andrey Bushman 04.01.2015, 20:39
quelle

2 Antworten

19

tl; dr

r und l beziehen sich auf die Assoziativität, die angegebene Zahl bezieht sich auf die Rangfolge des Operators. Wenn Sie die Assoziativität nicht angeben, erhalten Sie einen Operator, der nur durch explizite Klammern verknüpft werden kann oder wenn die Assoziativität nicht eindeutig ist.

Unsere Testdatenstruktur

Verwenden wir eine Datenstruktur, um Operatoren zu definieren und zu verstehen, wie Assoziativität funktioniert:

%Vor%

Es enthält die Zeichenfolge, die mit den folgenden Operatoren erstellt wurde.

Assoziativität mit infixr und infixl

Definieren wir nun rechts- und linksassoziative Operatoren:

%Vor%

Dieser Operator wird die Zeichenfolge des resultierenden Operators konstruieren, indem er den zugehörigen Termen explizit die Klammern hinzufügt.

Wenn wir es testen, sehen wir, dass es richtig funktioniert:

%Vor%

"Assoziativität" mit infix

Eine infix -Deklaration spezifiziert keine Assoziativität. Was sollte in diesen Fällen passieren? Mal sehen:

%Vor%

Und dann versuchen wir es:

%Vor%

Woops, wir bekommen:

  

Precedence Parsing Fehler           kann ?:' [infix 6] and ?: '[infix 6] im selben Infix-Ausdruck nicht mischen

Wie Sie sehen, hat der Sprachparser bemerkt, dass wir die Assoziativität des Operators nicht angegeben haben und nicht wissen, was zu tun ist.

Wenn wir stattdessen den letzten Begriff entfernen:

%Vor%

Dann beschwert sich der Compiler nicht.

Um den ursprünglichen Ausdruck zu korrigieren, müssten wir explizit Klammern hinzufügen; zum Beispiel:

%Vor%

Live-Demo

    
Shoe 04.01.2015, 21:16
quelle
4

Weil

%Vor%

funktioniert gut.

    
Ry︁ 04.01.2015 20:45
quelle

Tags und Links