%{ open Structs;; open Tactic;; %} /* Description des lexèmes définis dans lexer.mll */ %token LPAREN RPAREN RARROW TILDE FALSE %token EOF %token VAR_NAME %token TYPE_NAME %token DOT INTRO ASSUMPTION APPLY ELIM CUT %token FUN MAPS_TO VDOTS EXF %token AMPERSAND /* L'ordre de définition définit la priorité */ %right RARROW %nonassoc TILDE %start main_type %type main_type %start main_tactic %type main_tactic %start main_lambda %type main_lambda %start main_two_lambda %type main_two_lambda %% main_type: | ty EOF { $1 } main_tactic: | tactic EOF { $1 } main_lambda: | lambda EOF { $1 } main_two_lambda: | lambda AMPERSAND lambda { $1, $3 } /* Types */ ty: | LPAREN ty RPAREN { $2 } | ty RARROW ty { TImpl ($1, $3) } | TYPE_NAME { TSimple $1 } | TILDE ty { TImpl ($2, TFalse) } | FALSE { TFalse } /* Tactiques */ tactic: | INTRO VAR_NAME DOT { Intro $2 } | ASSUMPTION DOT { Assumption } | APPLY VAR_NAME DOT { Apply $2 } | ELIM VAR_NAME DOT { Elim $2 } | CUT ty DOT { Cut $2 } /* Lambda-termes */ lambda_arg: /* Expression pouvant être en argument d'une fonction */ | VAR_NAME { LVar $1 } | LPAREN lambda RPAREN { $2 } /* Application d'une fonction */ lambda_app: | lambda_app lambda_arg { LApp ($1, $2) } | lambda_arg { $1 } lambda: | lambda_app { $1 } | FUN VAR_NAME VDOTS ty MAPS_TO lambda { LFun ($2, $4, $6) } | FUN LPAREN VAR_NAME VDOTS ty RPAREN MAPS_TO lambda { LFun ($3, $5, $8) } | EXF LPAREN VAR_NAME VDOTS ty RPAREN { LExf (LVar $3, $5) }