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 | +++ |
| M | Makefile | | | 4 | ++-- |
| A | lexer.ml | | | 1167 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | lexer.mll | | | 37 | +++++++++++++++++++++++++------------ |
| M | parser.ml | | | 733 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- |
| M | parser.mly | | | 103 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------- |
| A | raw.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