Je suis Ocaml Newbie et j'essaie d'écrire une grammaire de type Ocaml simple, et je ne peux pas comprendre cela. Ma grammaire permet de faire quelque chose comme ceci: Cependant, si je veux utiliser la fonction, je peux écrire: merci! P> p> (sous-7) 3 code> mais je peux 'mais je peux' mais je peux " t écrire
sub 7 3 code>, qui me bugs vraiment. Pour une raison quelconque, il est interprété comme si j'écris
sub (7 3) code> (qui traiterait
7 code> en fonction de l'argument
3 code>). Les sections correspondantes sont les suivantes: p>
3 Réponses :
Le compilateur OCAML fonctionne l'application de fonction comme suit: (à partir de où sur la raison pour laquelle votre tentative d'utilisation ocaml / analyse / parser.mly code>)
simple_expr code> est Un sous-ensemble des valeurs expr utér pouvant évaluer à une fonction sans avoir besoin de parenthèses. Cela exclut toutes les constructions non entre crochets d'être utilisées en ligne avec un appel de fonction. Il clarifie également l'associativité des sous-expressions, car la deuxième subexpression est explicitement une liste. P>
% est laissée sur code> pour obtenir la bonne associativité ne fonctionne pas, des commentaires de l'analyseur d'OCAML: P>
We will only use associativities with operators of the kind x * x -> x
for example, in the rules of the form expr: expr BINOP expr
in all other cases, we define two precedences if needed to resolve
conflicts.
Quelle était la solution que vous avez utilisée?
Si vous êtes arrivé à cette question et que vous pensiez enfin que vous aviez enfin atteint ce moment où vous trouvez exactement ce que vous recherchez, alors déçus, voici une réponse plus explicite:
Vous ne pouvez pas utiliser% précisé pour le raison que le thelema a mentionné. Vous devez donc définir l'associativité dans la mise en place d'un ensemble de règles récursif. p>
Voici un parser simplifié.Lly p> Le travail récursif est vraiment pour attraper le cas que nous nous préoccupons de cette question, cependant Il est facile de voir comment il peut être appliqué pour définir l'association pour le reste des expressions également. p> Le gist de cette approche consiste à tenter de faire correspondre le modèle en question par rapport aux modèles définis dans le cas de démarrage (EXP), et que vous laissez un appel à l'affaire de réussite immédiatement (EXP2) en tant que capture. tous les motifs si votre motif ne correspond à cela pas avant de cela; Continuant avec cette approche jusqu'à ce que le motif correspond enfin. Cela implique que le modèle de priorité la plus élevée existe dans le cas le plus éloigné - dans cet exemple, exp8. P> Dans cet exemple, le cas d'application (application de fonction) est en exp 7. Cela est dû au fait que l'application est définie pour avoir la plus haute associativité de tout motif dans cet exemple. La raison pour laquelle il n'a pas de priorité sur les cas en exp8 est due à une évaluation d'une évaluation approfondie des appels d'expression, et non des appels de valeur. Si EXP8 n'existait pas, nous aurions un look infini sur nos mains. P> dans l'hypothétique simple.ml, application de fonction est définie comme une expression de la propriété suivante: Appliquer Expr * Expr. Et puisque la demande est rescursive gauche, nous évaluons la bonne expression (exp8) et recouvre à gauche (Exp7). p> p>
On peut également utiliser des choses comme celles-ci pour éviter de casser les expressions dans de nombreux niveaux: