dtlc

dependently-typed lambda calculus toy
git clone git://git.rr3.xyz/dtlc
Log | Files | Refs | README | LICENSE

commit 991446f48de7909c6830189ac83c7f71f6662f07
parent 54b7bd3a98514dfd174af3d9cc56a6951ecd4b31
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Wed,  6 Dec 2023 11:44:07 -0800

New concrete syntax

Diffstat:
M.gitignore | 3+++
MMakefile | 4++--
Alexer.ml | 1167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlexer.mll | 37+++++++++++++++++++++++++------------
Mparser.ml | 733++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mparser.mly | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Araw.ml | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 1843 insertions(+), 256 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,3 +1,6 @@ *.cm* *.mli test +lexer.ml +parser.ml +parser.output diff --git a/Makefile b/Makefile @@ -10,4 +10,4 @@ parser.ml: parser.mly .PHONY: clean clean: - rm -f main *.o *.cm* lexer.ml parser.ml -\ No newline at end of file + rm -f main *.o *.cm* lexer.ml parser.ml parser.mli +\ No newline at end of file diff --git a/lexer.ml b/lexer.ml @@ -0,0 +1,1167 @@ +# 1 "lexer.mll" + +open Parser +exception LexerError of Lexing.position * string + +# 7 "lexer.ml" +let __ocaml_lex_tables = { + Lexing.lex_base = + "\000\000\113\000\226\000\083\001\108\000\059\001\226\001\083\002\ + \196\002\053\003\166\003\023\004\233\255\234\255\235\255\236\255\ + \238\255\239\255\241\255\242\255\052\000\000\000\001\000\247\255\ + \248\255\249\255\250\255\033\000\252\255\253\255\254\255\255\255\ + \246\255\245\255\244\255\237\255\240\255\243\255\221\000\255\003\ + \166\004\023\005\136\005\249\005\106\006\219\006\076\007\189\007\ + \046\008\159\008\016\009\129\009\242\009\099\010\224\255\221\001\ + \075\010\158\002\078\000\086\000\242\010\099\011\212\011\069\012\ + \182\012\039\013\152\013"; + Lexing.lex_backtrk = + "\255\255\032\000\032\000\030\000\255\255\255\255\030\000\030\000\ + \030\000\030\000\030\000\030\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\004\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \030\000\030\000\030\000\023\000\024\000\027\000\030\000\030\000\ + \025\000\030\000\030\000\026\000\028\000\029\000\255\255\255\255\ + \255\255\031\000\031\000\031\000\031\000\032\000\031\000\032\000\ + \031\000\032\000\031\000"; + Lexing.lex_default = + "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\255\255\255\255\000\000\ + \000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\000\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255"; + Lexing.lex_trans = + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\031\000\030\000\000\000\000\000\031\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \031\000\024\000\000\000\020\000\000\000\000\000\000\000\000\000\ + \019\000\018\000\012\000\013\000\026\000\022\000\025\000\000\000\ + \002\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\027\000\028\000\000\000\021\000\034\000\033\000\ + \023\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\017\000\037\000\016\000\032\000\003\000\ + \000\000\003\000\003\000\003\000\007\000\008\000\006\000\003\000\ + \003\000\010\000\003\000\003\000\003\000\011\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\009\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\015\000\000\000\014\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\061\000\061\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\036\000\ + \000\000\000\000\000\000\054\000\000\000\000\000\000\000\000\000\ + \054\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\000\000\000\000\000\000\000\000\035\000\ + \000\000\000\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\000\000\000\000\005\000\004\000\ + \060\000\000\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ + \029\000\003\000\003\000\000\000\054\000\000\000\000\000\000\000\ + \000\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\003\000\003\000\000\000\000\000\ + \000\000\003\000\000\000\054\000\059\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\058\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\057\000\054\000\054\000\000\000\000\000\056\000\ + \055\000\060\000\000\000\054\000\059\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\058\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\057\000\054\000\054\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \000\000\000\000\003\000\003\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \056\000\055\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\003\000\000\000\000\000\003\000\000\000\ + \000\000\003\000\000\000\003\000\000\000\000\000\003\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\039\000\038\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \053\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\054\000\000\000\ + \000\000\000\000\054\000\054\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\054\000\054\000\000\000\ + \000\000\000\000\054\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \039\000\038\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\052\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\000\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\039\000\038\000\003\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \049\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\039\000\038\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\046\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\039\000\038\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\044\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\039\000\038\000\003\000\000\000\ + \040\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\003\000\ + \000\000\000\000\003\000\000\000\000\000\003\000\000\000\003\000\ + \000\000\000\000\003\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\039\000\038\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\041\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\039\000\038\000\003\000\000\000\ + \003\000\003\000\042\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\039\000\038\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \043\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\039\000\038\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\039\000\ + \038\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \045\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \039\000\038\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\039\000\038\000\003\000\000\000\003\000\003\000\003\000\ + \003\000\047\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\039\000\038\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\048\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\039\000\038\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\039\000\038\000\003\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\050\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\039\000\038\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\051\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\039\000\038\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\039\000\ + \038\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \039\000\038\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\054\000\054\000\ + \000\000\000\000\000\000\054\000\000\000\000\000\054\000\000\000\ + \000\000\054\000\000\000\054\000\000\000\000\000\054\000\000\000\ + \000\000\054\000\000\000\054\000\054\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\054\000\000\000\000\000\000\000\ + \000\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\000\000\000\000\000\000\000\000\ + \000\000\039\000\038\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\000\000\000\000\000\000\ + \000\000\060\000\000\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\054\000\000\000\000\000\ + \000\000\000\000\054\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\062\000\062\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\000\000\000\000\ + \056\000\055\000\062\000\000\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\054\000\000\000\ + \000\000\000\000\000\000\054\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\062\000\062\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\000\000\ + \000\000\056\000\055\000\062\000\000\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\054\000\ + \000\000\000\000\000\000\000\000\054\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\054\000\054\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \000\000\000\000\056\000\055\000\064\000\000\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \054\000\000\000\000\000\000\000\000\000\054\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\054\000\054\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\000\000\000\000\056\000\055\000\064\000\000\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\054\000\000\000\000\000\000\000\000\000\054\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\000\000\000\000\056\000\055\000\066\000\000\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\054\000\000\000\000\000\000\000\000\000\054\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\066\000\066\000\066\000\066\000\066\000\066\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\000\000\000\000\056\000\055\000\066\000\ + \000\000\066\000\066\000\066\000\066\000\066\000\066\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\056\000\055\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000"; + Lexing.lex_check = + "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\000\000\000\000\255\255\255\255\000\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \000\000\000\000\255\255\000\000\255\255\255\255\255\255\255\255\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\000\000\021\000\022\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\020\000\000\000\027\000\000\000\ + \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\000\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\059\000\059\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\020\000\ + \255\255\255\255\255\255\001\000\255\255\255\255\255\255\255\255\ + \001\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\255\255\255\255\255\255\255\255\020\000\ + \255\255\255\255\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\001\000\255\255\255\255\000\000\000\000\ + \001\000\255\255\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\ + \001\000\001\000\001\000\001\000\004\000\004\000\004\000\004\000\ + \004\000\004\000\004\000\004\000\004\000\004\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\004\000\255\255\255\255\ + \000\000\004\000\004\000\255\255\002\000\255\255\255\255\255\255\ + \255\255\002\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\002\000\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\004\000\004\000\255\255\255\255\ + \255\255\004\000\255\255\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\002\000\255\255\255\255\001\000\ + \001\000\002\000\255\255\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\ + \002\000\002\000\002\000\002\000\002\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\038\000\255\255\ + \255\255\255\255\038\000\038\000\255\255\003\000\255\255\255\255\ + \255\255\255\255\003\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\038\000\038\000\255\255\ + \255\255\255\255\038\000\255\255\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\255\255\255\255\ + \002\000\002\000\003\000\255\255\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\005\000\005\000\ + \255\255\255\255\255\255\005\000\255\255\255\255\005\000\255\255\ + \255\255\005\000\255\255\005\000\255\255\255\255\005\000\255\255\ + \255\255\005\000\255\255\005\000\005\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\005\000\005\000\005\000\005\000\ + \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ + \005\000\005\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\006\000\255\255\255\255\255\255\ + \255\255\006\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\006\000\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\255\255\255\255\255\255\255\255\ + \255\255\003\000\003\000\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\006\000\255\255\255\255\255\255\ + \255\255\006\000\255\255\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\ + \006\000\006\000\006\000\006\000\006\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\055\000\255\255\ + \255\255\255\255\055\000\055\000\255\255\007\000\255\255\255\255\ + \255\255\255\255\007\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\055\000\055\000\255\255\ + \255\255\255\255\055\000\255\255\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\255\255\255\255\ + \006\000\006\000\007\000\255\255\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\057\000\ + \057\000\057\000\057\000\057\000\057\000\255\255\008\000\255\255\ + \255\255\255\255\255\255\008\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\255\255\057\000\ + \057\000\057\000\057\000\057\000\057\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\255\255\ + \255\255\007\000\007\000\008\000\255\255\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\009\000\ + \255\255\255\255\255\255\255\255\009\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \255\255\255\255\008\000\008\000\009\000\255\255\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \010\000\255\255\255\255\255\255\255\255\010\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\255\255\255\255\009\000\009\000\010\000\255\255\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\011\000\255\255\255\255\255\255\255\255\011\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\255\255\255\255\010\000\010\000\011\000\255\255\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\039\000\039\000\255\255\255\255\255\255\039\000\ + \255\255\255\255\039\000\255\255\255\255\039\000\255\255\039\000\ + \255\255\255\255\039\000\255\255\255\255\039\000\255\255\039\000\ + \039\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \040\000\255\255\255\255\255\255\255\255\040\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \255\255\255\255\255\255\255\255\255\255\011\000\011\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\255\255\255\255\255\255\255\255\040\000\255\255\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\041\000\255\255\255\255\255\255\255\255\041\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\255\255\255\255\040\000\040\000\041\000\255\255\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\042\000\255\255\255\255\255\255\255\255\042\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\255\255\255\255\041\000\041\000\042\000\ + \255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\043\000\255\255\255\255\255\255\255\255\ + \043\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\255\255\255\255\042\000\042\000\ + \043\000\255\255\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\044\000\255\255\255\255\255\255\ + \255\255\044\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\255\255\255\255\043\000\ + \043\000\044\000\255\255\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\045\000\255\255\255\255\ + \255\255\255\255\045\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\255\255\255\255\ + \044\000\044\000\045\000\255\255\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\046\000\255\255\ + \255\255\255\255\255\255\046\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\255\255\ + \255\255\045\000\045\000\046\000\255\255\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\047\000\ + \255\255\255\255\255\255\255\255\047\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \255\255\255\255\046\000\046\000\047\000\255\255\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \048\000\255\255\255\255\255\255\255\255\048\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\255\255\255\255\047\000\047\000\048\000\255\255\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\049\000\255\255\255\255\255\255\255\255\049\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\255\255\255\255\048\000\048\000\049\000\255\255\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\050\000\255\255\255\255\255\255\255\255\050\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\255\255\255\255\049\000\049\000\050\000\ + \255\255\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\051\000\255\255\255\255\255\255\255\255\ + \051\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\255\255\255\255\050\000\050\000\ + \051\000\255\255\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\052\000\255\255\255\255\255\255\ + \255\255\052\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\255\255\255\255\051\000\ + \051\000\052\000\255\255\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\053\000\255\255\255\255\ + \255\255\255\255\053\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\255\255\255\255\ + \052\000\052\000\053\000\255\255\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\056\000\056\000\ + \255\255\255\255\255\255\056\000\255\255\255\255\056\000\255\255\ + \255\255\056\000\255\255\056\000\255\255\255\255\056\000\255\255\ + \255\255\056\000\255\255\056\000\056\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\060\000\255\255\255\255\255\255\ + \255\255\060\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\255\255\255\255\255\255\255\255\ + \255\255\053\000\053\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\255\255\255\255\255\255\ + \255\255\060\000\255\255\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\061\000\255\255\255\255\ + \255\255\255\255\061\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\255\255\255\255\ + \060\000\060\000\061\000\255\255\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\062\000\255\255\ + \255\255\255\255\255\255\062\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\255\255\ + \255\255\061\000\061\000\062\000\255\255\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\063\000\ + \255\255\255\255\255\255\255\255\063\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \255\255\255\255\062\000\062\000\063\000\255\255\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \064\000\255\255\255\255\255\255\255\255\064\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\255\255\255\255\063\000\063\000\064\000\255\255\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\065\000\255\255\255\255\255\255\255\255\065\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\255\255\255\255\064\000\064\000\065\000\255\255\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\066\000\255\255\255\255\255\255\255\255\066\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\255\255\255\255\065\000\065\000\066\000\ + \255\255\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\066\000\066\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255"; + Lexing.lex_base_code = + ""; + Lexing.lex_backtrk_code = + ""; + Lexing.lex_default_code = + ""; + Lexing.lex_trans_code = + ""; + Lexing.lex_check_code = + ""; + Lexing.lex_code = + ""; +} + +let rec token lexbuf = + __ocaml_lex_token_rec lexbuf 0 +and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 37 "lexer.mll" + ( token lexbuf ) +# 998 "lexer.ml" + + | 1 -> +# 38 "lexer.mll" + ( Lexing.new_line lexbuf; token lexbuf ) +# 1003 "lexer.ml" + + | 2 -> +# 39 "lexer.mll" + ( EOF ) +# 1008 "lexer.ml" + + | 3 -> +# 41 "lexer.mll" + ( SEMICOLON ) +# 1013 "lexer.ml" + + | 4 -> +# 42 "lexer.mll" + ( COLON ) +# 1018 "lexer.ml" + + | 5 -> +# 43 "lexer.mll" + ( COMMA ) +# 1023 "lexer.ml" + + | 6 -> +# 44 "lexer.mll" + ( DOT ) +# 1028 "lexer.ml" + + | 7 -> +# 45 "lexer.mll" + ( EXCLAM ) +# 1033 "lexer.ml" + + | 8 -> +# 46 "lexer.mll" + ( AT ) +# 1038 "lexer.ml" + + | 9 -> +# 47 "lexer.mll" + ( COLON_EQ ) +# 1043 "lexer.ml" + + | 10 -> +# 48 "lexer.mll" + ( SINGLE_ARROW ) +# 1048 "lexer.ml" + + | 11 -> +# 49 "lexer.mll" + ( DOUBLE_ARROW ) +# 1053 "lexer.ml" + + | 12 -> +# 51 "lexer.mll" + ( HASH_LPAREN ) +# 1058 "lexer.ml" + + | 13 -> +# 52 "lexer.mll" + ( LPAREN ) +# 1063 "lexer.ml" + + | 14 -> +# 53 "lexer.mll" + ( RPAREN ) +# 1068 "lexer.ml" + + | 15 -> +# 55 "lexer.mll" + ( HASH_LBRACK ) +# 1073 "lexer.ml" + + | 16 -> +# 56 "lexer.mll" + ( LBRACK ) +# 1078 "lexer.ml" + + | 17 -> +# 57 "lexer.mll" + ( RBRACK ) +# 1083 "lexer.ml" + + | 18 -> +# 59 "lexer.mll" + ( HASH_LBRACE ) +# 1088 "lexer.ml" + + | 19 -> +# 60 "lexer.mll" + ( LBRACE ) +# 1093 "lexer.ml" + + | 20 -> +# 61 "lexer.mll" + ( RBRACE ) +# 1098 "lexer.ml" + + | 21 -> +# 63 "lexer.mll" + ( PLUS ) +# 1103 "lexer.ml" + + | 22 -> +# 64 "lexer.mll" + ( ASTERISK ) +# 1108 "lexer.ml" + + | 23 -> +# 66 "lexer.mll" + ( MATCH ) +# 1113 "lexer.ml" + + | 24 -> +# 68 "lexer.mll" + ( IF ) +# 1118 "lexer.ml" + + | 25 -> +# 69 "lexer.mll" + ( THEN ) +# 1123 "lexer.ml" + + | 26 -> +# 70 "lexer.mll" + ( ELSE ) +# 1128 "lexer.ml" + + | 27 -> +# 72 "lexer.mll" + ( IFF ) +# 1133 "lexer.ml" + + | 28 -> +# 73 "lexer.mll" + ( DO ) +# 1138 "lexer.ml" + + | 29 -> +# 75 "lexer.mll" + ( FN ) +# 1143 "lexer.ml" + + | 30 -> +# 77 "lexer.mll" + ( IDENT (Lexing.lexeme lexbuf) ) +# 1148 "lexer.ml" + + | 31 -> +# 79 "lexer.mll" + ( raise (LexerError (Lexing.lexeme_start_p lexbuf, "invalid terminator after integer literal")) ) +# 1153 "lexer.ml" + + | 32 -> +# 80 "lexer.mll" + ( INT (Z.of_string (Lexing.lexeme lexbuf)) ) +# 1158 "lexer.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_token_rec lexbuf __ocaml_lex_state + +;; + +# 102 "lexer.mll" + + +# 1168 "lexer.ml" diff --git a/lexer.mll b/lexer.mll @@ -38,33 +38,42 @@ rule token = parse | '\n' { Lexing.new_line lexbuf; token lexbuf } | eof { EOF } +| ";" { SEMICOLON } | ":" { COLON } - -| "=" { EQ } -| ";" { SEMICOLON } - +| "," { COMMA } +| "." { DOT } +| "!" { EXCLAM } +| "@" { AT } +| ":=" { COLON_EQ } | "->" { SINGLE_ARROW } | "=>" { DOUBLE_ARROW } -| "@(" { AT_LPAREN } | "#(" { HASH_LPAREN } +| "(" { LPAREN } +| ")" { RPAREN } + +| "#[" { HASH_LBRACK } +| "[" { LBRACK } +| "]" { RBRACK } -| "(" { LPAREN } -| ")" { RPAREN } -| "[" { LBRACK } -| "]" { RBRACK } -| "{" { LBRACE } -| "}" { RBRACE } +| "#{" { HASH_LBRACE } +| "{" { LBRACE } +| "}" { RBRACE } | "+" { PLUS } | "*" { ASTERISK } -| "let" { LET } +| "match" { MATCH } | "if" { IF } | "then" { THEN } | "else" { ELSE } +| "iff" { IFF } +| "do" { DO } + +| "fn" { FN } + | ident_start ident_cont* { IDENT (Lexing.lexeme lexbuf) } | number invalid_number_terminator { raise (LexerError (Lexing.lexeme_start_p lexbuf, "invalid terminator after integer literal")) } @@ -80,6 +89,10 @@ rule token = parse | "-" { MINUS } | "/" { SLASH } | "%" { PERCENT } +| "^" { CIRCUM } +| "~" { TILDE } +| "&" { AMP } +| "|" { PIPE } | "not" { NOT } | "and" { AND } | "or" { OR } diff --git a/parser.ml b/parser.ml @@ -1,132 +1,185 @@ type token = | EOF - | COLON - | EQ | SEMICOLON + | COLON + | COMMA + | DOT + | EXCLAM + | AT + | COLON_EQ | SINGLE_ARROW | DOUBLE_ARROW - | AT_LPAREN | HASH_LPAREN | LPAREN | RPAREN + | HASH_LBRACK | LBRACK | RBRACK + | HASH_LBRACE | LBRACE | RBRACE | PLUS | ASTERISK - | LET + | MATCH | IF | THEN | ELSE + | IFF + | DO + | FN | IDENT of ( # 16 "parser.mly" Surf.ident -# 26 "parser.ml" +# 34 "parser.ml" ) | INT of ( # 17 "parser.mly" Z.t -# 31 "parser.ml" +# 39 "parser.ml" ) open Parsing let _ = parse_error;; # 2 "parser.mly" open Surf -# 38 "parser.ml" +# 46 "parser.ml" let yytransl_const = [| 0 (* EOF *); - 257 (* COLON *); - 258 (* EQ *); - 259 (* SEMICOLON *); - 260 (* SINGLE_ARROW *); - 261 (* DOUBLE_ARROW *); - 262 (* AT_LPAREN *); - 263 (* HASH_LPAREN *); - 264 (* LPAREN *); - 265 (* RPAREN *); - 266 (* LBRACK *); - 267 (* RBRACK *); - 268 (* LBRACE *); - 269 (* RBRACE *); - 270 (* PLUS *); - 271 (* ASTERISK *); - 272 (* LET *); - 273 (* IF *); - 274 (* THEN *); - 275 (* ELSE *); + 257 (* SEMICOLON *); + 258 (* COLON *); + 259 (* COMMA *); + 260 (* DOT *); + 261 (* EXCLAM *); + 262 (* AT *); + 263 (* COLON_EQ *); + 264 (* SINGLE_ARROW *); + 265 (* DOUBLE_ARROW *); + 266 (* HASH_LPAREN *); + 267 (* LPAREN *); + 268 (* RPAREN *); + 269 (* HASH_LBRACK *); + 270 (* LBRACK *); + 271 (* RBRACK *); + 272 (* HASH_LBRACE *); + 273 (* LBRACE *); + 274 (* RBRACE *); + 275 (* PLUS *); + 276 (* ASTERISK *); + 277 (* MATCH *); + 278 (* IF *); + 279 (* THEN *); + 280 (* ELSE *); + 281 (* IFF *); + 282 (* DO *); + 283 (* FN *); 0|] let yytransl_block = [| - 276 (* IDENT *); - 277 (* INT *); + 284 (* IDENT *); + 285 (* INT *); 0|] let yylhs = "\255\255\ -\001\000\001\000\001\000\003\000\003\000\003\000\004\000\004\000\ -\004\000\005\000\005\000\006\000\006\000\007\000\007\000\008\000\ -\008\000\008\000\002\000\002\000\009\000\009\000\000\000" +\001\000\001\000\001\000\002\000\002\000\002\000\002\000\002\000\ +\003\000\003\000\006\000\006\000\006\000\007\000\007\000\009\000\ +\009\000\010\000\010\000\010\000\011\000\011\000\011\000\011\000\ +\013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ +\012\000\012\000\004\000\004\000\004\000\016\000\016\000\005\000\ +\005\000\005\000\008\000\014\000\014\000\014\000\017\000\015\000\ +\015\000\015\000\018\000\000\000" let yylen = "\002\000\ -\006\000\006\000\001\000\005\000\003\000\001\000\007\000\005\000\ -\001\000\003\000\001\000\003\000\001\000\002\000\001\000\001\000\ -\001\000\003\000\003\000\001\000\001\000\003\000\002\000" +\005\000\003\000\001\000\005\000\006\000\004\000\004\000\001\000\ +\003\000\001\000\003\000\003\000\001\000\003\000\001\000\003\000\ +\001\000\003\000\003\000\001\000\003\000\005\000\002\000\001\000\ +\001\000\001\000\003\000\003\000\003\000\001\000\003\000\003\000\ +\002\000\000\000\003\000\001\000\000\000\005\000\003\000\003\000\ +\001\000\000\000\005\000\003\000\001\000\000\000\003\000\003\000\ +\001\000\000\000\003\000\002\000" let yydefred = "\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\ -\017\000\023\000\003\000\000\000\000\000\000\000\000\000\015\000\ -\000\000\021\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\014\000\000\000\000\000\000\000\ -\000\000\000\000\018\000\000\000\000\000\005\000\000\000\000\000\ -\022\000\000\000\019\000\000\000\000\000\000\000\000\000\004\000\ -\000\000\008\000\000\000\000\000\000\000\001\000\002\000\007\000" +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\025\000\026\000\052\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\017\000\000\000\024\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\000\ +\030\000\000\000\000\000\019\000\000\000\028\000\032\000\000\000\ +\000\000\027\000\000\000\029\000\000\000\031\000\000\000\000\000\ +\000\000\000\000\002\000\000\000\000\000\009\000\011\000\000\000\ +\012\000\016\000\000\000\021\000\018\000\033\000\040\000\000\000\ +\047\000\044\000\051\000\048\000\000\000\006\000\007\000\000\000\ +\000\000\000\000\000\000\000\000\043\000\000\000\001\000\000\000\ +\000\000\004\000\000\000\022\000\005\000\039\000\000\000\035\000\ +\000\000\038\000" let yydgoto = "\002\000\ -\010\000\019\000\011\000\012\000\013\000\014\000\015\000\016\000\ -\020\000" +\014\000\025\000\016\000\090\000\026\000\017\000\018\000\019\000\ +\020\000\021\000\022\000\052\000\023\000\030\000\034\000\091\000\ +\031\000\035\000" -let yysindex = "\006\000\ -\005\255\000\000\254\254\036\255\005\255\254\254\031\255\000\000\ -\000\000\000\000\000\000\009\255\000\255\012\255\252\254\000\000\ -\254\254\000\000\006\255\032\255\052\255\023\255\045\255\056\255\ -\037\255\031\255\252\254\252\254\000\000\054\255\060\255\031\255\ -\031\255\061\255\000\000\031\255\031\255\000\000\012\255\252\254\ -\000\000\031\255\000\000\057\255\039\255\066\255\051\255\000\000\ -\067\255\000\000\005\255\031\255\039\255\000\000\000\000\000\000" +let yysindex = "\012\000\ +\099\255\000\000\245\254\099\255\099\255\023\255\099\255\099\255\ +\099\255\099\255\099\255\000\000\000\000\000\000\052\255\040\255\ +\066\255\024\255\063\255\053\255\000\000\073\255\000\000\120\255\ +\072\255\064\255\067\255\044\255\060\255\065\255\080\255\074\255\ +\084\255\076\255\096\255\075\255\077\255\091\255\099\255\099\255\ +\083\255\005\255\005\255\005\255\005\255\005\255\251\254\000\000\ +\000\000\073\255\073\255\000\000\099\255\000\000\000\000\099\255\ +\099\255\000\000\023\255\000\000\099\255\000\000\099\255\099\255\ +\099\255\099\255\000\000\106\255\005\255\000\000\000\000\053\255\ +\000\000\000\000\099\255\000\000\000\000\000\000\000\000\102\255\ +\000\000\000\000\000\000\000\000\087\255\000\000\000\000\099\255\ +\022\255\100\255\118\255\110\255\000\000\099\255\000\000\099\255\ +\099\255\000\000\005\255\000\000\000\000\000\000\116\255\000\000\ +\099\255\000\000" let yyrindex = "\000\000\ +\000\000\000\000\000\000\117\255\000\000\119\255\121\255\122\255\ +\000\000\000\000\127\255\000\000\000\000\000\000\003\000\182\000\ +\132\000\158\000\001\000\082\000\000\000\030\000\000\000\056\000\ +\034\255\000\000\000\000\126\255\000\000\000\000\128\255\000\000\ +\000\000\000\000\123\255\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\009\000\045\000\023\000\001\000\000\000\ -\000\000\000\000\000\000\027\255\053\255\000\000\000\000\000\000\ +\000\000\056\000\056\000\000\000\105\255\000\000\000\000\117\255\ +\004\255\000\000\119\255\000\000\000\000\000\000\122\255\000\000\ +\000\000\000\000\000\000\000\000\124\255\000\000\000\000\108\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\042\000\020\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" +\000\000\000\000\129\255\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\124\255\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000" let yygindex = "\000\000\ -\253\255\002\000\254\255\252\255\000\000\048\000\044\000\244\255\ -\000\000" +\253\255\255\255\224\255\045\000\013\000\238\255\000\000\004\000\ +\101\000\100\000\246\255\007\000\000\000\091\000\088\000\000\000\ +\000\000\000\000" -let yytablesize = 320 -let yytable = "\022\000\ -\013\000\023\000\029\000\005\000\025\000\017\000\001\000\024\000\ -\006\000\026\000\003\000\004\000\005\000\027\000\031\000\008\000\ -\009\000\018\000\030\000\012\000\006\000\007\000\011\000\038\000\ -\008\000\009\000\028\000\029\000\020\000\043\000\044\000\034\000\ -\032\000\046\000\047\000\020\000\003\000\004\000\005\000\048\000\ -\050\000\010\000\004\000\005\000\009\000\004\000\005\000\054\000\ -\056\000\055\000\008\000\009\000\033\000\035\000\037\000\021\000\ -\009\000\036\000\008\000\009\000\016\000\016\000\041\000\042\000\ -\045\000\049\000\016\000\016\000\051\000\052\000\053\000\040\000\ -\016\000\016\000\039\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +let yytablesize = 464 +let yytable = "\015\000\ +\030\000\027\000\003\000\028\000\042\000\075\000\033\000\036\000\ +\037\000\070\000\003\000\050\000\001\000\051\000\004\000\005\000\ +\024\000\006\000\042\000\032\000\007\000\008\000\076\000\038\000\ +\071\000\049\000\073\000\049\000\029\000\020\000\096\000\043\000\ +\012\000\013\000\041\000\067\000\089\000\015\000\068\000\051\000\ +\051\000\041\000\044\000\097\000\039\000\041\000\056\000\049\000\ +\041\000\049\000\040\000\041\000\039\000\049\000\049\000\034\000\ +\077\000\078\000\040\000\083\000\041\000\033\000\085\000\086\000\ +\087\000\079\000\089\000\042\000\080\000\081\000\045\000\092\000\ +\046\000\015\000\053\000\054\000\047\000\048\000\055\000\058\000\ +\059\000\015\000\004\000\005\000\095\000\006\000\015\000\057\000\ +\007\000\008\000\061\000\060\000\101\000\062\000\102\000\103\000\ +\063\000\064\000\066\000\069\000\012\000\013\000\065\000\106\000\ +\003\000\042\000\088\000\014\000\004\000\005\000\094\000\006\000\ +\042\000\093\000\007\000\008\000\042\000\098\000\099\000\042\000\ +\009\000\100\000\042\000\010\000\105\000\011\000\012\000\013\000\ +\042\000\004\000\005\000\010\000\006\000\046\000\042\000\007\000\ +\008\000\003\000\042\000\050\000\049\000\037\000\045\000\104\000\ +\072\000\074\000\036\000\012\000\013\000\082\000\084\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\013\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ +\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ @@ -136,38 +189,57 @@ let yytable = "\022\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ -\000\000\013\000\013\000\013\000\000\000\000\000\000\000\000\000\ -\000\000\013\000\006\000\006\000\000\000\000\000\013\000\013\000\ -\000\000\006\000\013\000\013\000\012\000\012\000\012\000\011\000\ -\011\000\011\000\006\000\006\000\012\000\000\000\000\000\011\000\ -\000\000\012\000\012\000\000\000\011\000\012\000\012\000\000\000\ -\011\000\011\000\010\000\010\000\010\000\009\000\009\000\009\000\ -\000\000\000\000\010\000\000\000\000\000\009\000\000\000\010\000\ -\000\000\000\000\000\000\010\000\010\000\000\000\009\000\009\000" +\000\000\030\000\030\000\030\000\030\000\030\000\000\000\030\000\ +\000\000\030\000\030\000\030\000\030\000\030\000\003\000\030\000\ +\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ +\030\000\000\000\030\000\000\000\030\000\030\000\020\000\020\000\ +\020\000\000\000\000\000\000\000\020\000\020\000\020\000\000\000\ +\000\000\020\000\000\000\000\000\020\000\000\000\000\000\020\000\ +\020\000\020\000\020\000\020\000\020\000\020\000\000\000\020\000\ +\034\000\034\000\034\000\000\000\000\000\000\000\034\000\034\000\ +\034\000\000\000\000\000\034\000\000\000\000\000\034\000\000\000\ +\000\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ +\000\000\034\000\015\000\015\000\015\000\000\000\000\000\000\000\ +\015\000\015\000\015\000\000\000\000\000\015\000\000\000\000\000\ +\015\000\000\000\000\000\015\000\015\000\000\000\015\000\015\000\ +\015\000\015\000\000\000\015\000\014\000\014\000\014\000\000\000\ +\000\000\000\000\014\000\014\000\014\000\000\000\000\000\014\000\ +\000\000\000\000\014\000\000\000\000\000\014\000\014\000\000\000\ +\014\000\014\000\014\000\014\000\010\000\014\000\010\000\000\000\ +\000\000\000\000\010\000\010\000\010\000\000\000\000\000\010\000\ +\000\000\000\000\010\000\000\000\000\000\010\000\000\000\000\000\ +\010\000\010\000\010\000\010\000\000\000\010\000\013\000\013\000\ +\013\000\000\000\000\000\000\000\013\000\000\000\013\000\000\000\ +\000\000\013\000\000\000\000\000\013\000\000\000\000\000\013\000\ +\000\000\000\000\013\000\013\000\013\000\013\000\008\000\013\000\ +\008\000\000\000\000\000\000\000\008\000\008\000\008\000\000\000\ +\000\000\008\000\000\000\000\000\008\000\000\000\000\000\008\000\ +\000\000\000\000\000\000\000\000\008\000\008\000\000\000\008\000" -let yycheck = "\004\000\ -\000\000\005\000\015\000\008\001\007\000\008\001\001\000\006\000\ -\000\000\001\001\006\001\007\001\008\001\014\001\009\001\020\001\ -\021\001\020\001\017\000\000\000\016\001\017\001\000\000\026\000\ -\020\001\021\001\015\001\040\000\002\001\032\000\033\000\009\001\ -\001\001\036\000\037\000\009\001\006\001\007\001\008\001\042\000\ -\045\000\000\000\007\001\008\001\000\000\007\001\008\001\051\000\ -\053\000\052\000\020\001\021\001\001\001\009\001\018\001\020\001\ -\021\001\002\001\020\001\021\001\008\001\009\001\009\001\004\001\ -\004\001\009\001\014\001\015\001\003\001\019\001\004\001\028\000\ -\020\001\021\001\027\000\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ +let yycheck = "\001\000\ +\000\000\005\000\000\000\005\000\001\001\011\001\008\000\009\000\ +\010\000\042\000\006\001\022\000\001\000\024\000\010\001\011\001\ +\028\001\013\001\015\001\007\000\016\001\017\001\028\001\011\000\ +\043\000\022\000\045\000\024\000\006\001\000\000\009\001\008\001\ +\028\001\029\001\001\001\039\000\069\000\039\000\040\000\050\000\ +\051\000\008\001\019\001\022\001\001\001\012\001\003\001\044\000\ +\015\001\046\000\007\001\018\001\001\001\050\000\051\000\000\000\ +\050\000\051\000\007\001\061\000\021\001\063\000\064\000\065\000\ +\066\000\053\000\099\000\002\001\056\000\057\000\008\001\075\000\ +\020\001\075\000\003\001\012\001\004\001\005\001\012\001\015\001\ +\001\001\000\000\010\001\011\001\088\000\013\001\088\000\028\001\ +\016\001\017\001\007\001\018\001\094\000\018\001\096\000\097\000\ +\001\001\023\001\008\001\017\001\028\001\029\001\026\001\105\000\ +\006\001\001\001\001\001\000\000\010\001\011\001\024\001\013\001\ +\008\001\012\001\016\001\017\001\012\001\018\001\001\001\015\001\ +\022\001\012\001\018\001\025\001\009\001\027\001\028\001\029\001\ +\012\001\010\001\011\001\000\000\013\001\015\001\008\001\016\001\ +\017\001\012\001\018\001\018\001\018\001\018\001\015\001\099\000\ +\044\000\046\000\018\001\028\001\029\001\059\000\063\000\255\255\ +\255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ +\255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ @@ -177,43 +249,62 @@ let yycheck = "\004\000\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ -\255\255\001\001\002\001\003\001\255\255\255\255\255\255\255\255\ -\255\255\009\001\002\001\003\001\255\255\255\255\014\001\015\001\ -\255\255\009\001\018\001\019\001\001\001\002\001\003\001\001\001\ -\002\001\003\001\018\001\019\001\009\001\255\255\255\255\009\001\ -\255\255\014\001\015\001\255\255\014\001\018\001\019\001\255\255\ -\018\001\019\001\001\001\002\001\003\001\001\001\002\001\003\001\ -\255\255\255\255\009\001\255\255\255\255\009\001\255\255\014\001\ -\255\255\255\255\255\255\018\001\019\001\255\255\018\001\019\001" +\255\255\001\001\002\001\003\001\004\001\005\001\255\255\007\001\ +\255\255\009\001\010\001\011\001\012\001\013\001\012\001\015\001\ +\016\001\017\001\018\001\019\001\020\001\021\001\022\001\023\001\ +\024\001\255\255\026\001\255\255\028\001\029\001\001\001\002\001\ +\003\001\255\255\255\255\255\255\007\001\008\001\009\001\255\255\ +\255\255\012\001\255\255\255\255\015\001\255\255\255\255\018\001\ +\019\001\020\001\021\001\022\001\023\001\024\001\255\255\026\001\ +\001\001\002\001\003\001\255\255\255\255\255\255\007\001\008\001\ +\009\001\255\255\255\255\012\001\255\255\255\255\015\001\255\255\ +\255\255\018\001\019\001\020\001\021\001\022\001\023\001\024\001\ +\255\255\026\001\001\001\002\001\003\001\255\255\255\255\255\255\ +\007\001\008\001\009\001\255\255\255\255\012\001\255\255\255\255\ +\015\001\255\255\255\255\018\001\019\001\255\255\021\001\022\001\ +\023\001\024\001\255\255\026\001\001\001\002\001\003\001\255\255\ +\255\255\255\255\007\001\008\001\009\001\255\255\255\255\012\001\ +\255\255\255\255\015\001\255\255\255\255\018\001\019\001\255\255\ +\021\001\022\001\023\001\024\001\001\001\026\001\003\001\255\255\ +\255\255\255\255\007\001\008\001\009\001\255\255\255\255\012\001\ +\255\255\255\255\015\001\255\255\255\255\018\001\255\255\255\255\ +\021\001\022\001\023\001\024\001\255\255\026\001\001\001\002\001\ +\003\001\255\255\255\255\255\255\007\001\255\255\009\001\255\255\ +\255\255\012\001\255\255\255\255\015\001\255\255\255\255\018\001\ +\255\255\255\255\021\001\022\001\023\001\024\001\001\001\026\001\ +\003\001\255\255\255\255\255\255\007\001\008\001\009\001\255\255\ +\255\255\012\001\255\255\255\255\015\001\255\255\255\255\018\001\ +\255\255\255\255\255\255\255\255\023\001\024\001\255\255\026\001" let yynames_const = "\ EOF\000\ - COLON\000\ - EQ\000\ SEMICOLON\000\ + COLON\000\ + COMMA\000\ + DOT\000\ + EXCLAM\000\ + AT\000\ + COLON_EQ\000\ SINGLE_ARROW\000\ DOUBLE_ARROW\000\ - AT_LPAREN\000\ HASH_LPAREN\000\ LPAREN\000\ RPAREN\000\ + HASH_LBRACK\000\ LBRACK\000\ RBRACK\000\ + HASH_LBRACE\000\ LBRACE\000\ RBRACE\000\ PLUS\000\ ASTERISK\000\ - LET\000\ + MATCH\000\ IF\000\ THEN\000\ ELSE\000\ + IFF\000\ + DO\000\ + FN\000\ " let yynames_block = "\ @@ -224,172 +315,386 @@ let yynames_block = "\ let yyact = [| (fun _ -> failwith "parser") ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 4 : 'patt0) in - let _4 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in - let _6 = (Parsing.peek_val __caml_parser_env 0 : Surf.expr) in + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'expr1) in + let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _5 = (Parsing.peek_val __caml_parser_env 0 : Surf.expr) in Obj.repr( -# 25 "parser.mly" - ( Let (_2, _4, _6) ) -# 234 "parser.ml" +# 29 "parser.mly" + ( Let (_1, _3, _5) ) +# 325 "parser.ml" : Surf.expr)) ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 4 : 'expr1) in - let _4 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in - let _6 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : Surf.expr) in Obj.repr( -# 26 "parser.mly" - ( If (_2, _4, _6) ) -# 243 "parser.ml" +# 30 "parser.mly" + ( Seq (_1, _3) ) +# 333 "parser.ml" : Surf.expr)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in Obj.repr( -# 27 "parser.mly" +# 31 "parser.mly" ( _1 ) -# 250 "parser.ml" +# 340 "parser.ml" : Surf.expr)) ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 3 : 'patt0) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'expr2) in + let _4 = (Parsing.peek_val __caml_parser_env 1 : 'cases) in Obj.repr( -# 29 "parser.mly" - ( Fn (_2, _5) ) -# 258 "parser.ml" +# 33 "parser.mly" + ( Match(_1, _4) ) +# 348 "parser.ml" : 'expr1)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr2) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + let _2 = (Parsing.peek_val __caml_parser_env 4 : 'expr1) in + let _4 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _6 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in Obj.repr( -# 30 "parser.mly" - ( Hint (_1, _3) ) -# 266 "parser.ml" +# 34 "parser.mly" + ( If (_2, _4, _6) ) +# 357 "parser.ml" : 'expr1)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr2) in + let _2 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _4 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in Obj.repr( -# 31 "parser.mly" - ( _1 ) -# 273 "parser.ml" +# 35 "parser.mly" + ( Iff (_2, _4) ) +# 365 "parser.ml" : 'expr1)) ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 5 : Surf.ident) in - let _4 = (Parsing.peek_val __caml_parser_env 3 : 'expr1) in - let _7 = (Parsing.peek_val __caml_parser_env 0 : 'expr2) in + let _2 = (Parsing.peek_val __caml_parser_env 2 : 'expr1_list) in + let _4 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in Obj.repr( -# 33 "parser.mly" - ( Pi (Some _2, _4, _7) ) -# 282 "parser.ml" - : 'expr2)) +# 36 "parser.mly" + ( Fn (_2, _4) ) +# 373 "parser.ml" + : 'expr1)) ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 3 : 'expr2) in - let _5 = (Parsing.peek_val __caml_parser_env 0 : 'expr2) in + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr2) in Obj.repr( -# 34 "parser.mly" - ( Pi (None, _2, _5) ) -# 290 "parser.ml" +# 37 "parser.mly" + ( _1 ) +# 380 "parser.ml" + : 'expr1)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr3) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr2) in + Obj.repr( +# 39 "parser.mly" + ( Annot(_1, _3) ) +# 388 "parser.ml" : 'expr2)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr3) in Obj.repr( -# 35 "parser.mly" +# 40 "parser.mly" ( _1 ) -# 297 "parser.ml" +# 395 "parser.ml" : 'expr2)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr3) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr4) in + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr4) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr3) in Obj.repr( -# 37 "parser.mly" - ( Plus (_1, _3) ) -# 305 "parser.ml" +# 42 "parser.mly" + ( FnType ([_1], _3) ) +# 403 "parser.ml" + : 'expr3)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'tuple) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr3) in + Obj.repr( +# 43 "parser.mly" + ( FnType (_1, _3) ) +# 411 "parser.ml" : 'expr3)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr4) in Obj.repr( -# 38 "parser.mly" - ( _1 ) -# 312 "parser.ml" +# 44 "parser.mly" + ( _1 ) +# 418 "parser.ml" : 'expr3)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr4) in let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr5) in Obj.repr( -# 40 "parser.mly" - ( Asterisk (_1, _3) ) -# 320 "parser.ml" +# 46 "parser.mly" + ( Add (_1, _3) ) +# 426 "parser.ml" : 'expr4)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr5) in Obj.repr( -# 41 "parser.mly" +# 47 "parser.mly" ( _1 ) -# 327 "parser.ml" +# 433 "parser.ml" : 'expr4)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 1 : 'expr5) in - let _2 = (Parsing.peek_val __caml_parser_env 0 : 'expr6) in + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr5) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr6) in Obj.repr( -# 43 "parser.mly" - ( Apposition (_1, _2) ) -# 335 "parser.ml" +# 49 "parser.mly" + ( Mul (_1, _3) ) +# 441 "parser.ml" : 'expr5)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr6) in Obj.repr( -# 44 "parser.mly" +# 50 "parser.mly" ( _1 ) -# 342 "parser.ml" +# 448 "parser.ml" : 'expr5)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : Surf.ident) in + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr7) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expr7) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr7_apposition) in Obj.repr( -# 46 "parser.mly" - ( Var _1 ) -# 349 "parser.ml" +# 52 "parser.mly" + ( App (_1, _2 :: _3) ) +# 457 "parser.ml" : 'expr6)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : Z.t) in + let _2 = (Parsing.peek_val __caml_parser_env 1 : Surf.ident) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr7_apposition) in Obj.repr( -# 47 "parser.mly" - ( Int _1 ) -# 356 "parser.ml" +# 53 "parser.mly" + ( Cons (_2, _3) ) +# 465 "parser.ml" : 'expr6)) ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : Surf.expr) in + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr7) in Obj.repr( -# 48 "parser.mly" - ( _2 ) -# 363 "parser.ml" +# 54 "parser.mly" + ( _1 ) +# 472 "parser.ml" : 'expr6)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 2 : 'patt1) in - let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr7) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : Surf.ident) in Obj.repr( -# 51 "parser.mly" - ( Annot (_1, _3) ) -# 371 "parser.ml" - : 'patt0)) +# 56 "parser.mly" + ( Access (_1, _3) ) +# 480 "parser.ml" + : 'expr7)) ; (fun __caml_parser_env -> - let _1 = (Parsing.peek_val __caml_parser_env 0 : 'patt1) in + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'expr7) in + let _4 = (Parsing.peek_val __caml_parser_env 1 : Surf.expr) in Obj.repr( -# 52 "parser.mly" +# 57 "parser.mly" + ( Index (_1, _4) ) +# 488 "parser.ml" + : 'expr7)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'expr7) in + Obj.repr( +# 58 "parser.mly" + ( Deref _1 ) +# 495 "parser.ml" + : 'expr7)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr8) in + Obj.repr( +# 59 "parser.mly" ( _1 ) -# 378 "parser.ml" - : 'patt0)) +# 502 "parser.ml" + : 'expr7)) ; (fun __caml_parser_env -> let _1 = (Parsing.peek_val __caml_parser_env 0 : Surf.ident) in Obj.repr( -# 54 "parser.mly" - ( Wild _1 ) -# 385 "parser.ml" - : 'patt1)) +# 61 "parser.mly" + ( Ident _1 ) +# 509 "parser.ml" + : 'expr8)) ; (fun __caml_parser_env -> - let _2 = (Parsing.peek_val __caml_parser_env 1 : 'patt0) in + let _1 = (Parsing.peek_val __caml_parser_env 0 : Z.t) in Obj.repr( -# 55 "parser.mly" +# 62 "parser.mly" + ( Int _1 ) +# 516 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'variants) in + Obj.repr( +# 63 "parser.mly" + ( VariantType _2 ) +# 523 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expr1_list) in + Obj.repr( +# 64 "parser.mly" + ( TupleType _2 ) +# 530 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expr1_list) in + Obj.repr( +# 65 "parser.mly" + ( RecordType _2 ) +# 537 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'tuple) in + Obj.repr( +# 66 "parser.mly" + ( Tuple _1 ) +# 544 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : 'fields) in + Obj.repr( +# 67 "parser.mly" + ( Record _2 ) +# 551 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : Surf.expr) in + Obj.repr( +# 68 "parser.mly" ( _2 ) -# 392 "parser.ml" - : 'patt1)) +# 558 "parser.ml" + : 'expr8)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 1 : 'expr7) in + let _2 = (Parsing.peek_val __caml_parser_env 0 : 'expr7_apposition) in + Obj.repr( +# 71 "parser.mly" + ( _1 :: _2 ) +# 566 "parser.ml" + : 'expr7_apposition)) +; (fun __caml_parser_env -> + Obj.repr( +# 72 "parser.mly" + ( [] ) +# 572 "parser.ml" + : 'expr7_apposition)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'case) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'cases) in + Obj.repr( +# 75 "parser.mly" + ( _1 :: _3 ) +# 580 "parser.ml" + : 'cases)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'case) in + Obj.repr( +# 76 "parser.mly" + ( [_1] ) +# 587 "parser.ml" + : 'cases)) +; (fun __caml_parser_env -> + Obj.repr( +# 77 "parser.mly" + ( [] ) +# 593 "parser.ml" + : 'cases)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 4 : 'expr2) in + let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _5 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + Obj.repr( +# 79 "parser.mly" + ( Case (_1, Some (_3), _5) ) +# 602 "parser.ml" + : 'case)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr2) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + Obj.repr( +# 80 "parser.mly" + ( Case (_1, None, _3) ) +# 610 "parser.ml" + : 'case)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr1_list) in + Obj.repr( +# 83 "parser.mly" + ( _1 :: _3 ) +# 618 "parser.ml" + : 'expr1_list)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + Obj.repr( +# 84 "parser.mly" + ( [_1] ) +# 625 "parser.ml" + : 'expr1_list)) +; (fun __caml_parser_env -> + Obj.repr( +# 85 "parser.mly" + ( [] ) +# 631 "parser.ml" + : 'expr1_list)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 3 : 'expr1) in + let _4 = (Parsing.peek_val __caml_parser_env 1 : 'expr1_list) in + Obj.repr( +# 88 "parser.mly" + ( _2 :: _4 ) +# 639 "parser.ml" + : 'tuple)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'variant) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'variants) in + Obj.repr( +# 91 "parser.mly" + ( _1 :: _3 ) +# 647 "parser.ml" + : 'variants)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'variant) in + Obj.repr( +# 92 "parser.mly" + ( [_1] ) +# 654 "parser.ml" + : 'variants)) +; (fun __caml_parser_env -> + Obj.repr( +# 93 "parser.mly" + ( [] ) +# 660 "parser.ml" + : 'variants)) +; (fun __caml_parser_env -> + let _2 = (Parsing.peek_val __caml_parser_env 1 : Surf.ident) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr1_list) in + Obj.repr( +# 95 "parser.mly" + ( Variant (_2, _3) ) +# 668 "parser.ml" + : 'variant)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'field) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'fields) in + Obj.repr( +# 98 "parser.mly" + ( _1 :: _3 ) +# 676 "parser.ml" + : 'fields)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 0 : 'field) in + Obj.repr( +# 99 "parser.mly" + ( [_1] ) +# 683 "parser.ml" + : 'fields)) +; (fun __caml_parser_env -> + Obj.repr( +# 100 "parser.mly" + ( [] ) +# 689 "parser.ml" + : 'fields)) +; (fun __caml_parser_env -> + let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr1) in + let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr1) in + Obj.repr( +# 102 "parser.mly" + ( Field (_1, _3) ) +# 697 "parser.ml" + : 'field)) (* Entry expr0 *) ; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0))) |] diff --git a/parser.mly b/parser.mly @@ -3,55 +3,102 @@ open Surf %} %token EOF -%token COLON -%token EQ SEMICOLON +%token SEMICOLON COLON COMMA DOT EXCLAM AT COLON_EQ %token SINGLE_ARROW DOUBLE_ARROW -%token AT_LPAREN HASH_LPAREN -%token LPAREN RPAREN -%token LBRACK RBRACK -%token LBRACE RBRACE +%token HASH_LPAREN LPAREN RPAREN +%token HASH_LBRACK LBRACK RBRACK +%token HASH_LBRACE LBRACE RBRACE %token PLUS ASTERISK -%token LET +%token MATCH %token IF THEN ELSE +%token IFF DO +%token FN %token <Surf.ident> IDENT %token <Z.t> INT %start expr0 %type <Surf.expr> expr0 +%nonassoc PREC_EXPR4 +%nonassoc PREC_TUPLE +%nonassoc SINGLE_ARROW + %% -expr0: - | LET patt0 EQ expr1 SEMICOLON expr0 { Let ($2, $4, $6) } - | IF expr1 THEN expr1 ELSE expr1 { If ($2, $4, $6) } +expr0: (* Sequencing *) + | expr1 COLON_EQ expr1 SEMICOLON expr0 { Let ($1, $3, $5) } + | expr1 SEMICOLON expr0 { Seq ($1, $3) } | expr1 { $1 } -expr1: - | AT_LPAREN patt0 RPAREN SINGLE_ARROW expr1 { Fn ($2, $5) } - | expr2 COLON expr1 { Hint ($1, $3) } +expr1: (* Control flow *) + | expr2 MATCH LBRACE cases RBRACE { Match($1, $4) } + | IF expr1 THEN expr1 ELSE expr1 { If ($2, $4, $6) } + | IFF expr1 DO expr1 { Iff ($2, $4) } + | FN expr1_list SINGLE_ARROW expr1 { Fn ($2, $4) } | expr2 { $1 } -expr2: - | HASH_LPAREN IDENT COLON expr1 RPAREN SINGLE_ARROW expr2 { Pi (Some $2, $4, $7) } - | HASH_LPAREN expr2 RPAREN SINGLE_ARROW expr2 { Pi (None, $2, $5) } +expr2: (* Type annotations (right-associative) *) + | expr3 COLON expr2 { Annot($1, $3) } | expr3 { $1 } -expr3: - | expr3 PLUS expr4 { Plus ($1, $3) } - | expr4 { $1 } +expr3: (* Function arrow (right-associative) *) + | expr4 SINGLE_ARROW expr3 { FnType ([$1], $3) } + | tuple SINGLE_ARROW expr3 { FnType ($1, $3) } + | expr4 %prec PREC_EXPR4 { $1 } expr4: - | expr4 ASTERISK expr5 { Asterisk ($1, $3) } + | expr4 PLUS expr5 { Add ($1, $3) } | expr5 { $1 } expr5: - | expr5 expr6 { Apposition ($1, $2) } + | expr5 ASTERISK expr6 { Mul ($1, $3) } | expr6 { $1 } expr6: - | IDENT { Var $1 } + | expr7 expr7 expr7_apposition { App ($1, $2 :: $3) } + | AT IDENT expr7_apposition { Cons ($2, $3) } + | expr7 { $1 } +expr7: + | expr7 DOT IDENT { Access ($1, $3) } + | expr7 DOT LPAREN expr0 RPAREN { Index ($1, $4) } + | expr7 EXCLAM { Deref $1 } + | expr8 { $1 } +expr8: + | IDENT { Ident $1 } | INT { Int $1 } + | HASH_LBRACK variants RBRACK { VariantType $2 } + | HASH_LPAREN expr1_list RPAREN { TupleType $2 } + | HASH_LBRACE expr1_list RBRACE { RecordType $2 } + | tuple %prec PREC_TUPLE { Tuple $1 } + | LBRACE fields RBRACE { Record $2 } | LPAREN expr0 RPAREN { $2 } -patt0: - | patt1 COLON expr1 { Annot ($1, $3) } - | patt1 { $1 } -patt1: - | IDENT { Wild $1 } - | LPAREN patt0 RPAREN { $2 } +expr7_apposition: + | expr7 expr7_apposition { $1 :: $2 } + | { [] } + +cases: (* Optional trailing semicolon *) + | case SEMICOLON cases { $1 :: $3 } + | case { [$1] } + | { [] } +case: + | expr2 IF expr1 DOUBLE_ARROW expr1 { Case ($1, Some ($3), $5) } + | expr2 DOUBLE_ARROW expr1 { Case ($1, None, $3) } + +expr1_list: (* Optional trailing comma *) + | expr1 COMMA expr1_list { $1 :: $3 } + | expr1 { [$1] } + | { [] } + +tuple: (* Nonempty; trailing comma mandatory for 1-tuples *) + | LPAREN expr1 COMMA expr1_list RPAREN { $2 :: $4 } + +variants: (* Optional trailing semicolon *) + | variant SEMICOLON variants { $1 :: $3 } + | variant { [$1] } + | { [] } +variant: + | AT IDENT expr1_list { Variant ($2, $3) } + +fields: (* Optional trailing semicolon *) + | field SEMICOLON fields { $1 :: $3 } + | field { [$1] } + | { [] } +field: + | expr1 COLON_EQ expr1 { Field ($1, $3) } %% diff --git a/raw.ml b/raw.ml @@ -0,0 +1,52 @@ +open Common + +type expr = +| Let of expr * expr * expr +| Seq of expr * expr +| Match of expr * case list +| If of expr * expr * expr +| Iff of expr * expr +| Fn of expr list * expr +| Annot of expr * expr +| FnType of expr list * expr +| Add of expr * expr +| Mul of expr * expr +| App of expr * expr list +| Cons of ident * expr_list +| Access of expr * ident +| Index of expr * expr +| Deref of expr +| Ident of ident +| Int of Z.t +| VariantType of variant list +| TupleType of expr list +| RecordType of expr list +| Tuple of expr list +| Record of field list +and case = Case of {patt: expr; guard: expr option; body: expr} +and variant = Variant of ident * expr list +and field = Field of expr * expr + +let rec string_of_expr m e = + let sp = string_of_patt in + let se = string_of_expr in + let (c, s) = match e with + | Let (p, a, b) -> (0, "let " ^ sp 0 p ^ " = " ^ se 1 a ^ "; " ^ se 0 b) + | If (c, t, f) -> (0, "if " ^ se 1 c ^ " then " ^ se 1 t ^ " else " ^ se 1 f) + | Fn (p, e) -> (1, "@(" ^ sp 0 p ^ ") -> " ^ se 1 e) + | Pi (p, e) -> (1, "#(" ^ sp 0 p ^ ") -> " ^ se 1 e) + | Hint (a, b) -> (1, se 2 a ^ " : " ^ se 1 b) + | Plus (a, b) -> (2, se 2 a ^ " + " ^ se 3 b) + | Asterisk (a, b) -> (3, se 3 a ^ " * " ^ se 4 b) + | Apposition (a, b) -> (4, se 4 a ^ " " ^ se 5 b) + | Var x -> (5, x) + | Int z -> (5, Z.to_string z) in + if c < m then "(" ^ s ^ ")" else s + +and string_of_patt m p = + let sp = string_of_patt in + let se = string_of_expr in + let (c, s) = match p with + | Annot (p, e) -> (0, sp 1 p ^ " : " ^ se 1 e) + | Wild x -> (1, x) in + if c < m then "(" ^ s ^ ")" else s