2016-02-16 4 views
0

Je dois donner une haute préséance et une associativité gauche à l'application de fonction dans mon analyseur OCaml. J'ai un tas de jetons différents pour qu'il corresponde tels quePriorité d'application OCaml et associativité

%token LET REC EQ IN FUN ARROW 
%token IF THEN ELSE 
%token PLUS MINUS MUL DIV LT LE NE AND OR 
%token LPAREN RPAREN 

et j'ai donné toutes ces priorité et l'associativité en utilisant %left, right ... Cependant, depuis exp que j'utilise pour correspondre avec ISN » t un jeton, je me demandais comment je le ferais dans ce cas:

exp: 
| exp exp     { App($1,$2)} 

J'ai tous mes matchs pour exp, na pas fait un tas de différents exp2s de EXP1 et ainsi de suite et que vous voulez savoir s'il est possible de donner expexp la plus haute priorité a Sd gauche assoc.

J'ai posté ceci sur un autre forum pour ma classe et a obtenu:

Vous pouvez associer un jeton fictif avec les règles d'application de la fonction comme suit:

rule: .... %precc DUMMY_FUN_APP 

Et puis spécifiez associativité en utilisant% à gauche et la jeton fictif.

Mais je ne suis pas vraiment sûr de ce que cela signifie, donc si quelqu'un pourrait élaborer sur ce sujet ou me donner une autre solution qui serait géniale.

Répondre

0

Vous ne dites pas quel générateur d'analyseur vous utilisez. Si vous utilisez ocamlyacc, vous pouvez regarder la grammaire réelle d'OCaml pour des idées. Vous pouvez trouver la grammaire ici: https://github.com/ocaml/ocaml/blob/trunk/parsing/parser.mly

Dans parser.mly, les jetons sont listés dans l'ordre de priorité de bas en haut. Certains des jetons sont des jetons factices répertoriés uniquement pour établir une priorité. Ces jetons sont ensuite référencés à l'intérieur des règles de syntaxe en utilisant %prec token_name.

Voici les dernières lignes de la liste de jetons:

%nonassoc below_SHARP 
%nonassoc SHARP   /* simple_expr/toplevel_directive */ 
%nonassoc below_DOT 
%nonassoc DOT 
/* Finally, the first tokens of simple_expr are above everything else. */ 
%nonassoc BACKQUOTE BANG BEGIN CHAR FALSE FLOAT INT INT32 INT64 
      LBRACE LBRACELESS LBRACKET LBRACKETBAR LIDENT LPAREN 
      NEW NATIVEINT PREFIXOP STRING TRUE UIDENT 

Notez que le jeton below_SHARP mannequin a priorité très élevé.

Voici les règles pertinentes pour l'application de la fonction:

expr: 
    | simple_expr simple_labeled_expr_list 
     { mkexp(Pexp_apply($1, List.rev $2)) } 

simple_labeled_expr_list: 
    labeled_simple_expr 
     { [$1] } 
    | simple_labeled_expr_list labeled_simple_expr 
     { $2 :: $1 } 

labeled_simple_expr: 
    simple_expr %prec below_SHARP 
     { ("", $1) } 

Pour ce que ça vaut, je l'ai toujours trouvé yacc et leur priorité delcarations d'être extrêmement difficile à comprendre, sauf dans les cas simples.

+0

J'ai fini par utiliser la version avec plusieurs expressions, oui j'utilisais yacc –