%{ open Gui open User %} %token VAR %token LVAR %token LPAREN %token RPAREN %token LANGLE %token RANGLE %token FUN %token ARROW %token COLON %token COMMA %token DARROW %token EOI %token INT %token SHIFT %token SLASH /*優先順位と連結性をここに書く(下に行くほど強くなる)*/ /*開始記号の定義*/ %type start %type vars %type terms %type types %type envs %start start vars terms types envs %% start: | judge EOI {$1} vars: | var EOI {$1} terms: | term EOI {$1} types: | typ EOI {$1} envs: | env EOI {$1} judge: | env DARROW term {judge $1 (Type.make_meta "A") $3 (Type.make_meta "T") (Type.make_meta "A")} | term {judge empty (Type.make_meta "A") $1 (Type.make_meta "T") (Type.make_meta "A")} term: | simple_term {$1} | app {$1} | FUN var ARROW term {term_abs $2 $4} | SHIFT var ARROW term {term_shift $2 $4} simple_term: | LVAR {Term.make_meta $1} | VAR {term_var (var $1)} | LANGLE term RANGLE {term_reset ($2)} | LPAREN term RPAREN {$2} app: | simple_term simple_term {term_app $1 $2} | app simple_term {term_app $1 $2} var: | VAR {var $1} | LVAR {Var.make_meta $1} typ: | LVAR {Type.make_meta $1} | VAR {tvar $1} | typ SLASH typ ARROW typ SLASH typ {tfun $1 $3 $5 $7} | LPAREN typ RPAREN {$2} env: | LVAR {Env.make_meta $1} | var COLON typ COMMA env {cons $1 $3 $5} | var COLON typ {cons $1 $3 empty} | LPAREN env RPAREN {$2}