%{ open Ast %} %token <int> CST %token <string> IDENT %token SET, LET, IN, PRINT %token EOF %token LP RP %token PLUS MINUS TIMES DIV %token EQ /* Définitions des priorités et associativités des tokens */ %nonassoc IN %left MINUS PLUS %left TIMES DIV %nonassoc uminus /* Point d'entrée de la grammaire */ %start prog /* Type des valeurs retournées par l'analyseur syntaxique */ %type < Ast.prg > prog %% prog: | instrs EOF {List.rev $1} ; instrs: | instr { [$1] } | instrs instr { $2::$1 } ; instr: | SET IDENT EQ expr { Set($2,$4)} | PRINT expr { Print($2) } ; expr: | CST { Cst($1) } | IDENT { Var($1) } | expr PLUS expr { Op(Sum,$1,$3) } | expr MINUS expr { Op(Diff,$1,$3) } | expr TIMES expr { Op(Prod,$1,$3) } | expr DIV expr { Op(Quot,$1,$3) } | MINUS expr %prec uminus { Op(Diff,Cst(0),$2) } | LET IDENT EQ expr IN expr { Letin($2,$4,$6) } | LP expr RP { $2 } ;