From b9ef4bb00ec4e9a6cb265d207fc8c3027b1724e3 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Sat, 30 Apr 2022 16:18:13 +0200 Subject: [PATCH] stuff --- W1/assign1.fo | 17 + W1/fasto/Fasto/AbSyn.fs | 303 ++ W1/fasto/Fasto/CallGraph.fs | 87 + W1/fasto/Fasto/CodeGen.fs | 877 ++++ W1/fasto/Fasto/CopyConstPropFold.fs | 208 + W1/fasto/Fasto/DeadBindingRemoval.fs | 239 + W1/fasto/Fasto/DeadFunctionRemoval.fs | 10 + W1/fasto/Fasto/Fasto.fsproj | 38 + W1/fasto/Fasto/Fasto.fsx | 252 + W1/fasto/Fasto/Inlining.fs | 140 + W1/fasto/Fasto/Interpreter.fs | 376 ++ W1/fasto/Fasto/Lexer.fs | 267 + W1/fasto/Fasto/Lexer.fsl | 118 + W1/fasto/Fasto/Mips.fs | 127 + W1/fasto/Fasto/Parser.fs | 887 ++++ W1/fasto/Fasto/Parser.fsi | 101 + W1/fasto/Fasto/Parser.fsp | 149 + W1/fasto/Fasto/Parser.fsyacc.output | 4640 +++++++++++++++++ W1/fasto/Fasto/RegAlloc.fs | 493 ++ W1/fasto/Fasto/SymTab.fs | 37 + W1/fasto/Fasto/SymTab.fsi | 38 + W1/fasto/Fasto/TypeChecker.fs | 391 ++ .../Fasto/bin/Debug/net6.0/FSharp.Core.dll | Bin 0 -> 3087488 bytes W1/fasto/Fasto/bin/Debug/net6.0/Fasto | Bin 0 -> 77184 bytes .../Fasto/bin/Debug/net6.0/Fasto.deps.json | 114 + W1/fasto/Fasto/bin/Debug/net6.0/Fasto.dll | Bin 0 -> 507904 bytes W1/fasto/Fasto/bin/Debug/net6.0/Fasto.pdb | Bin 0 -> 119116 bytes .../bin/Debug/net6.0/Fasto.runtimeconfig.json | 9 + .../bin/Debug/net6.0/FsLexYacc.Runtime.dll | Bin 0 -> 75264 bytes .../Debug/net6.0/cs/FSharp.Core.resources.dll | Bin 0 -> 33408 bytes .../Debug/net6.0/de/FSharp.Core.resources.dll | Bin 0 -> 34432 bytes .../Debug/net6.0/es/FSharp.Core.resources.dll | Bin 0 -> 33392 bytes .../Debug/net6.0/fr/FSharp.Core.resources.dll | Bin 0 -> 33920 bytes .../Debug/net6.0/it/FSharp.Core.resources.dll | Bin 0 -> 33920 bytes .../Debug/net6.0/ja/FSharp.Core.resources.dll | Bin 0 -> 35968 bytes .../Debug/net6.0/ko/FSharp.Core.resources.dll | Bin 0 -> 34944 bytes .../Debug/net6.0/pl/FSharp.Core.resources.dll | Bin 0 -> 34432 bytes .../net6.0/pt-BR/FSharp.Core.resources.dll | Bin 0 -> 32896 bytes .../Debug/net6.0/ru/FSharp.Core.resources.dll | Bin 0 -> 40576 bytes .../Debug/net6.0/tr/FSharp.Core.resources.dll | Bin 0 -> 32896 bytes .../net6.0/zh-Hans/FSharp.Core.resources.dll | Bin 0 -> 31360 bytes .../net6.0/zh-Hant/FSharp.Core.resources.dll | Bin 0 -> 30848 bytes ...CoreApp,Version=v6.0.AssemblyAttributes.fs | 3 + .../obj/Debug/net6.0/Fasto.AssemblyInfo.fs | 17 + .../net6.0/Fasto.AssemblyInfoInputs.cache | 1 + .../Fasto/obj/Debug/net6.0/Fasto.assets.cache | Bin 0 -> 4298 bytes W1/fasto/Fasto/obj/Debug/net6.0/Fasto.dll | Bin 0 -> 507904 bytes .../Fasto.fsproj.AssemblyReference.cache | Bin 0 -> 71325 bytes .../Debug/net6.0/Fasto.fsproj.CopyComplete | 0 .../Fasto.fsproj.CoreCompileInputs.cache | 1 + .../net6.0/Fasto.fsproj.FileListAbsolute.txt | 27 + .../Debug/net6.0/Fasto.genruntimeconfig.cache | 1 + W1/fasto/Fasto/obj/Debug/net6.0/Fasto.pdb | Bin 0 -> 119116 bytes W1/fasto/Fasto/obj/Debug/net6.0/apphost | Bin 0 -> 77184 bytes .../Fasto/obj/Fasto.fsproj.nuget.dgspec.json | 74 + W1/fasto/Fasto/obj/Fasto.fsproj.nuget.g.props | 19 + .../Fasto/obj/Fasto.fsproj.nuget.g.targets | 6 + W1/fasto/Fasto/obj/fsac.cache | 2 + W1/fasto/Fasto/obj/project.assets.json | 296 ++ W1/fasto/Fasto/obj/project.nuget.cache | 13 + W1/fasto/Makefile | 6 + W1/fasto/README.txt | 22 + W1/fasto/bin/Mars4_5.jar | Bin 0 -> 4169142 bytes W1/fasto/bin/compilerun.sh | 35 + W1/fasto/bin/fasto.sh | 20 + W1/fasto/bin/mars.sh | 20 + W1/fasto/bin/runtests.sh | 152 + W1/fasto/doc/GroupProj-2022.pdf | Bin 0 -> 184054 bytes W1/fasto/tests/assign1.asm | 623 +++ W1/fasto/tests/assign1.fo | 17 + W1/fasto/tests/assign1.in | 5 + W1/fasto/tests/assign1.out | 1 + W1/fasto/tests/comprehension.asm | 605 +++ W1/fasto/tests/comprehension.fo | 8 + W1/fasto/tests/comprehension.in | 1 + W1/fasto/tests/comprehension.out | 1 + W1/fasto/tests/copyConstPropFold0.asm | 171 + W1/fasto/tests/copyConstPropFold0.fo | 9 + W1/fasto/tests/copyConstPropFold0.in | 1 + W1/fasto/tests/copyConstPropFold0.out | 1 + W1/fasto/tests/copyConstPropFold1.asm | 220 + W1/fasto/tests/copyConstPropFold1.fo | 6 + W1/fasto/tests/copyConstPropFold1.in | 0 W1/fasto/tests/copyConstPropFold1.out | 1 + W1/fasto/tests/dead_bnd_rem.asm | 175 + W1/fasto/tests/dead_bnd_rem.fo | 16 + W1/fasto/tests/dead_bnd_rem.in | 1 + W1/fasto/tests/dead_bnd_rem.out | 1 + W1/fasto/tests/fail_parse.err | 1 + W1/fasto/tests/fail_parse.fo | 3 + W1/fasto/tests/fib.asm | 239 + W1/fasto/tests/fib.fo | 8 + W1/fasto/tests/fib.in | 1 + W1/fasto/tests/fib.out | 1 + W1/fasto/tests/filter-on-2darr.asm | 474 ++ W1/fasto/tests/filter-on-2darr.fo | 17 + W1/fasto/tests/filter-on-2darr.in | 1 + W1/fasto/tests/filter-on-2darr.out | 2 + W1/fasto/tests/filter.asm | 431 ++ W1/fasto/tests/filter.fo | 13 + W1/fasto/tests/filter.in | 1 + W1/fasto/tests/filter.out | 1 + W1/fasto/tests/inline_map.asm | 458 ++ W1/fasto/tests/inline_map.fo | 19 + W1/fasto/tests/inline_map.in | 1 + W1/fasto/tests/inline_map.out | 1 + W1/fasto/tests/inline_shadow.asm | 246 + W1/fasto/tests/inline_shadow.fo | 15 + W1/fasto/tests/inline_shadow.in | 0 W1/fasto/tests/inline_shadow.out | 2 + W1/fasto/tests/io_mssp.asm | 897 ++++ W1/fasto/tests/io_mssp.fo | 44 + W1/fasto/tests/io_mssp.in | 8 + W1/fasto/tests/io_mssp.out | 11 + W1/fasto/tests/iota.asm | 393 ++ W1/fasto/tests/iota.fo | 10 + W1/fasto/tests/iota.in | 0 W1/fasto/tests/iota.out | 1 + W1/fasto/tests/lambda.asm | 368 ++ W1/fasto/tests/lambda.fo | 10 + W1/fasto/tests/lambda.in | 1 + W1/fasto/tests/lambda.out | 2 + W1/fasto/tests/map_red_io.asm | 477 ++ W1/fasto/tests/map_red_io.fo | 20 + W1/fasto/tests/map_red_io.in | 5 + W1/fasto/tests/map_red_io.out | 2 + W1/fasto/tests/multilet.asm | 174 + W1/fasto/tests/multilet.fo | 3 + W1/fasto/tests/multilet.in | 1 + W1/fasto/tests/multilet.out | 1 + W1/fasto/tests/neg_simple.err | 1 + W1/fasto/tests/neg_simple.fo | 2 + W1/fasto/tests/negate.asm | 319 ++ W1/fasto/tests/negate.fo | 11 + W1/fasto/tests/negate.in | 0 W1/fasto/tests/negate.out | 5 + W1/fasto/tests/ordchr.asm | 427 ++ W1/fasto/tests/ordchr.fo | 11 + W1/fasto/tests/ordchr.in | 4 + W1/fasto/tests/ordchr.out | 1 + W1/fasto/tests/proj_figure3.asm | 382 ++ W1/fasto/tests/proj_figure3.fo | 11 + W1/fasto/tests/proj_figure3.in | 1 + W1/fasto/tests/proj_figure3.out | 1 + W1/fasto/tests/reduce.asm | 236 + W1/fasto/tests/reduce.fo | 5 + W1/fasto/tests/reduce.in | 0 W1/fasto/tests/reduce.out | 1 + W1/fasto/tests/replicate.asm | 257 + W1/fasto/tests/replicate.fo | 5 + W1/fasto/tests/replicate.in | 0 W1/fasto/tests/replicate.out | 7 + W1/fasto/tests/scan.asm | 280 + W1/fasto/tests/scan.fo | 8 + W1/fasto/tests/scan.in | 0 W1/fasto/tests/scan.out | 1 + W1/fasto/tests/short_circuit.asm | 193 + W1/fasto/tests/short_circuit.fo | 6 + W1/fasto/tests/short_circuit.in | 0 W1/fasto/tests/short_circuit.out | 1 + W1/fasto/tools/emacs/README.md | 8 + W1/fasto/tools/emacs/fasto-mode.el | 362 ++ W1/fasto/tools/vim/README.txt | 13 + W1/fasto/tools/vim/fasto.vim | 22 + W1/report/fasto.sty | 50 + W1/report/main.aux | 9 +- W1/report/main.fdb_latexmk | 184 +- W1/report/main.fls | 285 +- W1/report/main.listing | 18 + W1/report/main.log | 598 ++- W1/report/main.pdf | Bin 28488 -> 50646 bytes W1/report/main.pyg | 1 + W1/report/main.synctex.gz | Bin 1270 -> 58822 bytes W1/report/main.tex | 120 +- 174 files changed, 20605 insertions(+), 100 deletions(-) create mode 100644 W1/assign1.fo create mode 100644 W1/fasto/Fasto/AbSyn.fs create mode 100644 W1/fasto/Fasto/CallGraph.fs create mode 100644 W1/fasto/Fasto/CodeGen.fs create mode 100644 W1/fasto/Fasto/CopyConstPropFold.fs create mode 100644 W1/fasto/Fasto/DeadBindingRemoval.fs create mode 100644 W1/fasto/Fasto/DeadFunctionRemoval.fs create mode 100644 W1/fasto/Fasto/Fasto.fsproj create mode 100644 W1/fasto/Fasto/Fasto.fsx create mode 100644 W1/fasto/Fasto/Inlining.fs create mode 100644 W1/fasto/Fasto/Interpreter.fs create mode 100644 W1/fasto/Fasto/Lexer.fs create mode 100644 W1/fasto/Fasto/Lexer.fsl create mode 100644 W1/fasto/Fasto/Mips.fs create mode 100644 W1/fasto/Fasto/Parser.fs create mode 100644 W1/fasto/Fasto/Parser.fsi create mode 100644 W1/fasto/Fasto/Parser.fsp create mode 100644 W1/fasto/Fasto/Parser.fsyacc.output create mode 100644 W1/fasto/Fasto/RegAlloc.fs create mode 100644 W1/fasto/Fasto/SymTab.fs create mode 100644 W1/fasto/Fasto/SymTab.fsi create mode 100644 W1/fasto/Fasto/TypeChecker.fs create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/FSharp.Core.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/Fasto create mode 100644 W1/fasto/Fasto/bin/Debug/net6.0/Fasto.deps.json create mode 100644 W1/fasto/Fasto/bin/Debug/net6.0/Fasto.dll create mode 100644 W1/fasto/Fasto/bin/Debug/net6.0/Fasto.pdb create mode 100644 W1/fasto/Fasto/bin/Debug/net6.0/Fasto.runtimeconfig.json create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/FsLexYacc.Runtime.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/cs/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/de/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/es/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/fr/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/it/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/ja/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/ko/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/pl/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/pt-BR/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/ru/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/tr/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/zh-Hans/FSharp.Core.resources.dll create mode 100755 W1/fasto/Fasto/bin/Debug/net6.0/zh-Hant/FSharp.Core.resources.dll create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.fs create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.AssemblyInfo.fs create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.AssemblyInfoInputs.cache create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.assets.cache create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.dll create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.fsproj.AssemblyReference.cache create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.fsproj.CopyComplete create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.fsproj.CoreCompileInputs.cache create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.fsproj.FileListAbsolute.txt create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.genruntimeconfig.cache create mode 100644 W1/fasto/Fasto/obj/Debug/net6.0/Fasto.pdb create mode 100755 W1/fasto/Fasto/obj/Debug/net6.0/apphost create mode 100644 W1/fasto/Fasto/obj/Fasto.fsproj.nuget.dgspec.json create mode 100644 W1/fasto/Fasto/obj/Fasto.fsproj.nuget.g.props create mode 100644 W1/fasto/Fasto/obj/Fasto.fsproj.nuget.g.targets create mode 100644 W1/fasto/Fasto/obj/fsac.cache create mode 100644 W1/fasto/Fasto/obj/project.assets.json create mode 100644 W1/fasto/Fasto/obj/project.nuget.cache create mode 100644 W1/fasto/Makefile create mode 100644 W1/fasto/README.txt create mode 100644 W1/fasto/bin/Mars4_5.jar create mode 100755 W1/fasto/bin/compilerun.sh create mode 100755 W1/fasto/bin/fasto.sh create mode 100755 W1/fasto/bin/mars.sh create mode 100755 W1/fasto/bin/runtests.sh create mode 100644 W1/fasto/doc/GroupProj-2022.pdf create mode 100644 W1/fasto/tests/assign1.asm create mode 100644 W1/fasto/tests/assign1.fo create mode 100644 W1/fasto/tests/assign1.in create mode 100644 W1/fasto/tests/assign1.out create mode 100644 W1/fasto/tests/comprehension.asm create mode 100644 W1/fasto/tests/comprehension.fo create mode 100644 W1/fasto/tests/comprehension.in create mode 100644 W1/fasto/tests/comprehension.out create mode 100644 W1/fasto/tests/copyConstPropFold0.asm create mode 100644 W1/fasto/tests/copyConstPropFold0.fo create mode 100644 W1/fasto/tests/copyConstPropFold0.in create mode 100644 W1/fasto/tests/copyConstPropFold0.out create mode 100644 W1/fasto/tests/copyConstPropFold1.asm create mode 100644 W1/fasto/tests/copyConstPropFold1.fo create mode 100644 W1/fasto/tests/copyConstPropFold1.in create mode 100644 W1/fasto/tests/copyConstPropFold1.out create mode 100644 W1/fasto/tests/dead_bnd_rem.asm create mode 100644 W1/fasto/tests/dead_bnd_rem.fo create mode 100644 W1/fasto/tests/dead_bnd_rem.in create mode 100644 W1/fasto/tests/dead_bnd_rem.out create mode 100644 W1/fasto/tests/fail_parse.err create mode 100644 W1/fasto/tests/fail_parse.fo create mode 100644 W1/fasto/tests/fib.asm create mode 100644 W1/fasto/tests/fib.fo create mode 100644 W1/fasto/tests/fib.in create mode 100644 W1/fasto/tests/fib.out create mode 100644 W1/fasto/tests/filter-on-2darr.asm create mode 100644 W1/fasto/tests/filter-on-2darr.fo create mode 100644 W1/fasto/tests/filter-on-2darr.in create mode 100644 W1/fasto/tests/filter-on-2darr.out create mode 100644 W1/fasto/tests/filter.asm create mode 100644 W1/fasto/tests/filter.fo create mode 100644 W1/fasto/tests/filter.in create mode 100644 W1/fasto/tests/filter.out create mode 100644 W1/fasto/tests/inline_map.asm create mode 100644 W1/fasto/tests/inline_map.fo create mode 100644 W1/fasto/tests/inline_map.in create mode 100644 W1/fasto/tests/inline_map.out create mode 100644 W1/fasto/tests/inline_shadow.asm create mode 100644 W1/fasto/tests/inline_shadow.fo create mode 100644 W1/fasto/tests/inline_shadow.in create mode 100644 W1/fasto/tests/inline_shadow.out create mode 100644 W1/fasto/tests/io_mssp.asm create mode 100644 W1/fasto/tests/io_mssp.fo create mode 100644 W1/fasto/tests/io_mssp.in create mode 100644 W1/fasto/tests/io_mssp.out create mode 100644 W1/fasto/tests/iota.asm create mode 100644 W1/fasto/tests/iota.fo create mode 100644 W1/fasto/tests/iota.in create mode 100644 W1/fasto/tests/iota.out create mode 100644 W1/fasto/tests/lambda.asm create mode 100644 W1/fasto/tests/lambda.fo create mode 100644 W1/fasto/tests/lambda.in create mode 100644 W1/fasto/tests/lambda.out create mode 100644 W1/fasto/tests/map_red_io.asm create mode 100644 W1/fasto/tests/map_red_io.fo create mode 100644 W1/fasto/tests/map_red_io.in create mode 100644 W1/fasto/tests/map_red_io.out create mode 100644 W1/fasto/tests/multilet.asm create mode 100644 W1/fasto/tests/multilet.fo create mode 100644 W1/fasto/tests/multilet.in create mode 100644 W1/fasto/tests/multilet.out create mode 100644 W1/fasto/tests/neg_simple.err create mode 100644 W1/fasto/tests/neg_simple.fo create mode 100644 W1/fasto/tests/negate.asm create mode 100644 W1/fasto/tests/negate.fo create mode 100644 W1/fasto/tests/negate.in create mode 100644 W1/fasto/tests/negate.out create mode 100644 W1/fasto/tests/ordchr.asm create mode 100644 W1/fasto/tests/ordchr.fo create mode 100644 W1/fasto/tests/ordchr.in create mode 100644 W1/fasto/tests/ordchr.out create mode 100644 W1/fasto/tests/proj_figure3.asm create mode 100644 W1/fasto/tests/proj_figure3.fo create mode 100644 W1/fasto/tests/proj_figure3.in create mode 100644 W1/fasto/tests/proj_figure3.out create mode 100644 W1/fasto/tests/reduce.asm create mode 100644 W1/fasto/tests/reduce.fo create mode 100644 W1/fasto/tests/reduce.in create mode 100644 W1/fasto/tests/reduce.out create mode 100644 W1/fasto/tests/replicate.asm create mode 100644 W1/fasto/tests/replicate.fo create mode 100644 W1/fasto/tests/replicate.in create mode 100644 W1/fasto/tests/replicate.out create mode 100644 W1/fasto/tests/scan.asm create mode 100644 W1/fasto/tests/scan.fo create mode 100644 W1/fasto/tests/scan.in create mode 100644 W1/fasto/tests/scan.out create mode 100644 W1/fasto/tests/short_circuit.asm create mode 100644 W1/fasto/tests/short_circuit.fo create mode 100644 W1/fasto/tests/short_circuit.in create mode 100644 W1/fasto/tests/short_circuit.out create mode 100644 W1/fasto/tools/emacs/README.md create mode 100644 W1/fasto/tools/emacs/fasto-mode.el create mode 100644 W1/fasto/tools/vim/README.txt create mode 100644 W1/fasto/tools/vim/fasto.vim create mode 100644 W1/report/fasto.sty create mode 100644 W1/report/main.listing create mode 100644 W1/report/main.pyg diff --git a/W1/assign1.fo b/W1/assign1.fo new file mode 100644 index 0000000..f6c4aee --- /dev/null +++ b/W1/assign1.fo @@ -0,0 +1,17 @@ +fun int mul(int x, int y) = + if y == 0 then 0 + else if y < 0 then mul(x, y+1) - x + else mul(x, y-1) + x + +fun int readInt(int i) = read(int) + +fun int squareSum(int x, int y) = x + mul(y, y) + +fun int main() = + let n = read(int) in + if n == 0 then let a = write("Incorrect Input!") in 0 + else if n < 0 then let a = write("Incorrect Input!") in 0 + else + let arr = map(readInt, iota(n)) in + let dif = map(fn int (int x) => if x == 0 then arr[x] else arr[x] - arr[x-1], iota(n)) in + write(reduce(squareSum, 0, dif)) diff --git a/W1/fasto/Fasto/AbSyn.fs b/W1/fasto/Fasto/AbSyn.fs new file mode 100644 index 0000000..c0bf3bd --- /dev/null +++ b/W1/fasto/Fasto/AbSyn.fs @@ -0,0 +1,303 @@ +module AbSyn + +(* + Types and utilities for the abstract syntax tree (AbSyn) of Fasto. + Fasto er et funktionelt array-sprog til oversættelse, F-A-S-T-O. + Fasto er også et spansk ord, der betyder "pomp" eller "pragt". + Derfor skal vi programmere en "pragtfuld" oversætter for Fasto. + + The abstract syntax of a (Fasto) program is a representation of the (Fasto) + program in terms of a data type in another programming language (F#). + + Some expressions in Fasto (e.g. array constants, indexing operations, map, + reduce) are implicitly typed, their types are not explicitly stated in the + program text. Their types are infered at run-time by an interpreter, or at + compile-time by a type-checker. + + In support of this, this module defines type-parameterized datatypes for + expressions "Exp<'T>", let declarations "Dec<'T>", function arguments + "FunArg<'T>", function declaration "FunDec<'T>", and program "Prog<'T>". + These datatypes are instantiated over the "unit" and "Type" types to provide + an abstract syntax tree without type information, e.g., "UntypedProg = Prog", + and another abstract syntax tree in which the inferred type information + is made explicit in the representation "TypedProg = Prog". + + For example: + - interpretation uses the untyped version "TypedProg", + - the type checking phase receives as input an untype program ("UntypedProg") + and produces a typed program ("TypedProg") + - the other compiler phases work on the typed program. + + Note that semantically we use two different AbSyns, but we avoid code duplication + by means of the afore-mentioned type parameterization. + + Also our AbSyn stores not just the program structure, but also the positions of + the program substructures in the original program text. This is useful for + reporting errors at later passes of the compiler, e.g. type errors. + + This module also provides pretty printing functionality, printing a valid Fasto + program given its abstract syntax. "pp" is used in this module as a shorthand + for "prettyPrint". +*) + +(*** Helper Functions ***) +let toCString (s : string) : string = + let escape c = + match c with + | '\\' -> "\\\\" + | '"' -> "\\\"" + | '\n' -> "\\n" + | '\t' -> "\\t" + | _ -> System.String.Concat [c] + String.collect escape s + +// Doesn't actually support all escapes. Too badefacilliteter. +let fromCString (s : string) : string = + let rec unescape l: char list = + match l with + | [] -> [] + | '\\' :: 'n' :: l' -> '\n' :: unescape l' + | '\\' :: 't' :: l' -> '\t' :: unescape l' + | '\\' :: c :: l' -> c :: unescape l' + | c :: l' -> c :: unescape l' + Seq.toList s |> unescape |> System.String.Concat + +(* position: (line, column) *) +type Position = int * int + +type Type = + Int + | Bool + | Char + | Array of Type + +type Value = + IntVal of int + | BoolVal of bool + | CharVal of char + | ArrayVal of Value list * Type + (* Type corresponds to the element-type of the array *) + +(* Indentifies value types (for type checking) *) +let valueType = function + | (IntVal _) -> Int + | (BoolVal _) -> Bool + | (CharVal _) -> Char + | (ArrayVal (_,tp)) -> Array tp + +(* pretty printing types *) +let rec ppType = function + | Int -> "int" + | Char -> "char" + | Bool -> "bool" + | Array tp -> "[" + ppType tp + "]" + +(* Parameter declaration *) +type Param = + Param of string * Type + +type Exp<'T> = + Constant of Value * Position + | StringLit of string * Position + | ArrayLit of Exp<'T> list * 'T * Position + | Var of string * Position + | Plus of Exp<'T> * Exp<'T> * Position + | Minus of Exp<'T> * Exp<'T> * Position + | Equal of Exp<'T> * Exp<'T> * Position + | Less of Exp<'T> * Exp<'T> * Position + | If of Exp<'T> * Exp<'T> * Exp<'T> * Position + | Apply of string * Exp<'T> list * Position + | Let of Dec<'T> * Exp<'T> * Position + | Index of string * Exp<'T> * 'T * Position + + (* dirty I/O *) + | Read of Type * Position + | Write of Exp<'T> * 'T * Position + + (* Project implementations *) + | Times of Exp<'T> * Exp<'T> * Position + | Divide of Exp<'T> * Exp<'T> * Position + | Negate of Exp<'T> * Position + | And of Exp<'T> * Exp<'T> * Position + | Or of Exp<'T> * Exp<'T> * Position + | Not of Exp<'T> * Position + + (* Array constructors/combinators implementations *) + | Iota of Exp<'T> * Position + + (* map (f, array) + the first 'T corresponds to the mapped array element type, + which is the same as the f's input type; + the second 'T corresponds to the result-array element type, + which is the same as the f's result type. + *) + | Map of FunArg<'T> * Exp<'T> * 'T * 'T * Position + + (* reduce (f, acc, array) + the 'T argument corresponds to the array element type, + which is the same as the f's result type. + *) + | Reduce of FunArg<'T> * Exp<'T> * Exp<'T> * 'T * Position + + (* replicate(n, a); the 'T argument is the type of the + the second expression (i.e., a's type) + *) + | Replicate of Exp<'T> * Exp<'T> * 'T * Position + + (* filter (p, array) + p is a predicate, i.e., a function of type alpha -> bool + the 'T argument corresponds to the array element type, + which is the same as the f's input type (alpha); + *) + | Filter of FunArg<'T> * Exp<'T> * 'T * Position + + (* scan (f, acc, array); the 'T argument is as in reduce's case *) + | Scan of FunArg<'T> * Exp<'T> * Exp<'T> * 'T * Position + +and Dec<'T> = + Dec of string * Exp<'T> * Position + +and FunArg<'T> = + FunName of string + | Lambda of Type * Param list * Exp<'T> * Position + +(* A function declaration is a tuple of: +(i) function name, +(ii) return type, +(iii) formal arguments names & types, +(iv) function's body, +(v) Position. *) +type FunDec<'T> = + FunDec of string * Type * Param list * Exp<'T> * Position + + +(* Functions for extracting function properties *) +let getFunName (FunDec(fid, _, _, _, _)) = fid +let getFunRTP (FunDec(_, rtp, _, _, _)) = rtp +let getFunArgs (FunDec(_, _, arg, _, _)) = arg +let getFunBody (FunDec(_, _, _, bdy, _)) = bdy +let getFunPos (FunDec(_, _, _, _, pos)) = pos + +type Prog<'T> = FunDec<'T> list + +(****************************************************) +(********** Pretty-Printing Functionality ***********) +(****************************************************) + +let rec indent = function + | 0 -> "" + | n -> " " + indent (n-1) + +let ppParam = function + | Param(id, tp) -> ppType tp + " " + id + +let rec ppParams = function + | [] -> "" + | [bd] -> ppParam bd + | bd::l -> ppParam bd + ", " + ppParams l + +let rec ppVal d = function + | IntVal n -> sprintf "%i" n + | BoolVal b -> sprintf "%b" b + | CharVal c -> "'" + toCString (string c) + "'" + | ArrayVal (vals, t) -> "{ " + (String.concat ", " (List.map (ppVal d) vals)) + " }" + +let newLine exp = match exp with + | Let _ -> "" + | _ -> "\n" + +let rec ppExp d = function + | Constant(v, _) -> ppVal d v + | StringLit(s,_) -> "\"" + toCString s + "\"" + | ArrayLit(es, t, _) -> "{ " + (String.concat ", " (List.map (ppExp d) es)) + " }" + | Var (id, _) -> id + | Plus (e1, e2, _) -> "(" + ppExp d e1 + " + " + ppExp d e2 + ")" + | Minus (e1, e2, _) -> "(" + ppExp d e1 + " - " + ppExp d e2 + ")" + | Times (e1, e2, _) -> "(" + ppExp d e1 + " * " + ppExp d e2 + ")" + | Divide (e1, e2, _) -> "(" + ppExp d e1 + " / " + ppExp d e2 + ")" + | And (e1, e2, _) -> "(" + ppExp d e1 + " && " + ppExp d e2 + ")" + | Or (e1, e2, _) -> "(" + ppExp d e1 + " || " + ppExp d e2 + ")" + | Not (e, _) -> "not("+ppExp d e + ")" + | Negate (e, _) -> "~(" + ppExp d e + ")" + | Equal (e1, e2, _) -> "(" + ppExp d e1 + " == " + ppExp d e2 + ")" + | Less (e1, e2, _) -> "(" + ppExp d e1 + " < " + ppExp d e2 + ")" + | If (e1, e2, e3, _) -> ("if (" + ppExp d e1 + ")\n" + + indent (d+2) + "then " + ppExp (d+2) e2 + "\n" + + indent (d+2) + "else " + ppExp (d+2) e3 + "\n" + + indent d) + | Apply (id, args, _) -> (id + "(" + + (String.concat ", " (List.map (ppExp d) args)) + ")") + | Let (Dec(id, e1, _), e2, _) -> ("\n" + indent (d+1) + "let " + id + " = " + + ppExp (d+2) e1 + " in" + newLine e2 + + indent (d+1) + ppExp d e2) + | Index (id, e, t, _) -> id + "[" + ppExp d e + "]" + | Iota (e, _) -> "iota(" + ppExp d e + ")" + | Replicate (e, el, t, pos) -> "replicate(" + ppExp d e + ", " + ppExp d el + ")" + | Map (f, e, _, _, _) -> "map(" + ppFunArg d f + ", " + ppExp d e + ")" + | Filter (f, arr, _, _) -> ("filter(" + ppFunArg d f + ", " + ppExp d arr + ")") + | Reduce (f, el, lst, _, _) -> + "reduce(" + ppFunArg d f + ", " + ppExp d el + ", " + ppExp d lst + ")" + | Scan (f, acc, arr, _, pos) -> ("scan(" + ppFunArg d f + + ", " + ppExp d acc + + ", " + ppExp d arr + ")") + | Read (t, _) -> "read(" + ppType t + ")" + | Write (e, t, _) -> "write(" + ppExp d e + ")" + +and ppFunArg d = function + | FunName s -> s + | Lambda (rtp, args, body, _) -> ("fn " + ppType rtp + " (" + + ppParams args + ") => " + ppExp (d+2) body) + +(* pretty prints a function declaration *) +let ppFun d = function + | FunDec(id, rtp, args, body, _) -> ( "fun " + ppType rtp + " " + id + + "(" + ppParams args + ") =" + + indent (d+1) + ppExp(d+1) body ) + +(* Pretty pringint a program *) +let ppProg (p : Prog<'T>) = (String.concat "\n\n" (List.map (ppFun 0) p)) + "\n" + +let expPos = function + | Constant (_, p) -> p + | StringLit (_, p) -> p + | ArrayLit (_, _, p) -> p + | Var (_, p) -> p + | Plus (_, _, p) -> p + | Minus (_, _, p) -> p + | Equal (_, _, p) -> p + | Less (_, _, p) -> p + | If (_, _, _, p) -> p + | Apply (_, _, p) -> p + | Let (_, _, p) -> p + | Index (_, _, _, p) -> p + | Iota (_, p) -> p + | Replicate (_, _, _, p) -> p + | Map (_, _, _, _, p) -> p + | Filter (_, _, _, p) -> p + | Reduce (_, _, _, _, p) -> p + | Scan (_, _, _, _, p) -> p + | Read (_, p) -> p + | Write (_, _, p) -> p + | Times (_, _, p) -> p + | Divide (_, _, p) -> p + | And (_, _, p) -> p + | Or (_, _, p) -> p + | Not (_, p) -> p + | Negate (_, p) -> p + + + +type UntypedExp = Exp +type TypedExp = Exp + +type UntypedDec = Dec +type TypedDec = Dec + +type UntypedFunDec = FunDec +type TypedFunDec = FunDec + +type UntypedFunArg = FunArg +type TypedFunArg = FunArg + +type UntypedProg = Prog +type TypedProg = Prog diff --git a/W1/fasto/Fasto/CallGraph.fs b/W1/fasto/Fasto/CallGraph.fs new file mode 100644 index 0000000..0178adb --- /dev/null +++ b/W1/fasto/Fasto/CallGraph.fs @@ -0,0 +1,87 @@ +module CallGraph + +type CallGraph = (string * string list) list + + +let callsOf (caller : string) + (graph : CallGraph) = + match List.tryFind (fun (x,_) -> x = caller) graph with + | None -> [] + | Some (_, calls) -> calls + +let calls (caller : string) + (callee : string) + (graph : CallGraph) = + List.exists (fun x -> x=callee) (callsOf caller graph) + +open AbSyn + + +(* Remove duplicate elements in a list. Quite slow - O(n^2) - + but our lists here will be small. *) +let rec nub = function + | [] -> [] + | x::xs -> if List.exists (fun y -> y = x) xs + then nub xs + else x :: nub xs + +let rec expCalls = function + | Constant _ -> [] + | StringLit _ -> [] + | ArrayLit (es, _, _) -> List.concat (List.map expCalls es) + | Var _ -> [] + | Plus (e1, e2, _) -> expCalls e1 @ expCalls e2 + | Minus (e1, e2, _) -> expCalls e1 @ expCalls e2 + | Equal (e1, e2, _) -> expCalls e1 @ expCalls e2 + | Less (e1, e2, _) -> expCalls e1 @ expCalls e2 + | If (e1, e2, e3, _) -> expCalls e1 @ expCalls e2 @ expCalls e3 + | Apply (fname, es, _) -> fname :: List.concat (List.map expCalls es) + | Let ( Dec(_, e, _), body, _) -> expCalls e @ expCalls body + | Index (_, e, _, _) -> expCalls e + | Iota (e, _) -> expCalls e + | Map (farg, e, _, _, _) -> fargCalls farg @ expCalls e + | Filter (farg, e, _, _) -> fargCalls farg @ expCalls e + | Reduce (farg, e1, e2, _, _) -> fargCalls farg @ expCalls e1 @ expCalls e2 + | Replicate (n, e, _, _) -> expCalls n @ expCalls e + | Scan (farg, e1, e2, _, _) -> fargCalls farg @ expCalls e1 @ expCalls e2 + | Times (e1, e2, _) -> expCalls e1 @ expCalls e2 + | Divide (e1, e2, _) -> expCalls e1 @ expCalls e2 + | And (e1, e2, _) -> expCalls e1 @ expCalls e2 + | Or (e1, e2, _) -> expCalls e1 @ expCalls e2 + | Not (e, _) -> expCalls e + | Negate (e, _) -> expCalls e + | Read _ -> [] + | Write (e, _, _) -> expCalls e + +and fargCalls = function + | Lambda (_, _, body, _) -> expCalls body + | FunName s -> [s] + +(* Get the direct function calls of a single function *) + +let functionCalls = function + | FunDec (fname, _, _, body, _) -> (fname, nub (expCalls body)) + +(* Expand the direct function call graph to its transitive closure. *) +let rec transitiveClosure (graph : CallGraph) = + let grow ((caller : string), + (callees : string list)) = + let calleecalls = + List.concat (List.map (fun callee -> + callsOf callee graph) callees) + let newCalls = (List.filter (fun call -> + not (List.exists (fun x -> x = call) callees) + ) calleecalls) + if List.isEmpty newCalls + then ((caller, callees), + false) + else ((caller, callees @ nub newCalls), + true) + let (graph', changes) = List.unzip (List.map grow graph) + let changed = List.exists (fun x -> x) changes + if changed + then transitiveClosure graph' + else graph' + +let callGraph (prog : TypedProg) = + transitiveClosure (List.map functionCalls prog) diff --git a/W1/fasto/Fasto/CodeGen.fs b/W1/fasto/Fasto/CodeGen.fs new file mode 100644 index 0000000..d4dc31d --- /dev/null +++ b/W1/fasto/Fasto/CodeGen.fs @@ -0,0 +1,877 @@ +(* Code generator for Fasto *) + +module CodeGen + +(* + compile : TypedProg -> Mips.Instruction list + + (* for debugging *) + compileExp : TypedExp + -> SymTab + -> Mips.reg + -> Mips.Instruction list +*) + +open AbSyn + +exception MyError of string * Position + +type VarTable = SymTab.SymTab + +(* Name generator for labels and temporary symbolic registers *) +(* Example usage: val tmp = newName "tmp" (* might produce _tmp_5_ *) *) + +let mutable counter = 0 + +let newName base_name = + counter <- counter + 1 + "_" + base_name + "_" + string counter + "_" + +let newReg reg_name = Mips.RS (newName reg_name) + +let newLab lab_name = newName lab_name + +(* Table storing all string literals, with labels given to them *) +let stringTable : ((Mips.addr*string) list) ref = ref [] +(* could also contain "\n", ",", "Index out of bounds in line ", but the + format is a bit different (length and dummy pointer come first) *) + +(* Building a string in the heap, including initialisation code *) +let buildString ( label : Mips.addr + , str : string + ) : (Mips.Instruction list * Mips.Instruction list) = + let data = [ Mips.ALIGN 2 (* means: word-align *) + ; Mips.LABEL label (* pointer *) + ; Mips.SPACE 4 (* sizeof(Int) *) + ; Mips.ASCIIZ str] + let initR = Mips.RS (label + "_init") + let addrR = Mips.RS (label + "_addr") + let initcode = [ Mips.LA(addrR, label) + ; Mips.LI(initR, String.length str) + ; Mips.SW(initR, addrR, 0) ] + (initcode, data) + +(* Link register *) +let RA = Mips.RN 31 +(* Register for stack pointer *) +let SP = Mips.RN 29 +(* Register for heap pointer *) +let HP = Mips.RN 28 +(* Constant-zero register *) +let RZ = Mips.RN 0 + +(* General scratch-pad registers *) +let RN2 = Mips.RN 2 +let RN4 = Mips.RN 4 +let RN5 = Mips.RN 5 +let RN6 = Mips.RN 6 + +(* Suggested register division *) +let minReg = 2 (* lowest usable register *) +let maxCaller = 15 (* highest caller-saves register *) +let maxReg = 25 (* highest allocatable register *) + +(* Syscall numbers for MARS, to be put in $2 *) +let sysPrintInt = 1 (* print integer in $4 *) +let sysPrintString = 4 (* print NUL-terminated string starting at $4 *) +let sysReadInt = 5 (* read integer into $2 *) +let sysExit = 10 (* terminate execution *) +let sysPrintChar = 11 (* print character in $4 *) +let sysReadChar = 12 (* read character into $2 *) + +(* Determine the size of an element in an array based on its type *) +type ElemSize = ESByte | ESWord + +let getElemSize (tp : Type) : ElemSize = + match tp with + | Char -> ESByte + | Bool -> ESByte + | _ -> ESWord + +let elemSizeToInt (elmsz : ElemSize) : int = + match elmsz with + | ESByte -> 1 + | ESWord -> 4 + +(* Pick the correct instruction from the element size. *) +let mipsLoad elem_size = match elem_size with + | ESByte -> Mips.LB + | ESWord -> Mips.LW + +let mipsStore elem_size = match elem_size with + | ESByte -> Mips.SB + | ESWord -> Mips.SW + +(* generates the code to check that the array index is within bounds *) +let checkBounds ( arr_beg : Mips.reg + , ind_reg : Mips.reg + , (line : int, c : int) + ) : Mips.Instruction list = + let size_reg = newReg "size_reg" + let tmp_reg = newReg "tmp_reg" + let err_lab = newLab "error_lab" + let safe_lab = newLab "safe_lab" + [ Mips.LW(size_reg, arr_beg, 0) + ; Mips.BGEZ(ind_reg, safe_lab) (* check that ind_reg >= 0 *) + ; Mips.LABEL(err_lab) + ; Mips.LI(RN5, line) + ; Mips.LA(RN6, "_Msg_IllegalIndex_") + ; Mips.J "_RuntimeError_" + ; Mips.LABEL(safe_lab) + ; Mips.SUB(tmp_reg, ind_reg, size_reg) + ; Mips.BGEZ(tmp_reg, err_lab) (* check that ind_reg < -size_reg *) + ] + +(* dynalloc(size_reg, place, ty) generates code for allocating arrays of heap + memory by incrementing the HP register (heap pointer) by a number of words. + The arguments for this function are as follows: + + size_reg: contains the logical array size (number of array elements) + place: will contain the address of new allocation (old HP) + ty: char/bool elements take 1 byte, int elements take 4 bytes + *) +let dynalloc (size_reg : Mips.reg, + place : Mips.reg, + ty : Type ) + : Mips.Instruction list = + let tmp_reg = newReg "tmp" + + (* Use old HP as allocation address. *) + let code1 = [ Mips.MOVE (place, HP) ] + + (* For char/bool: Align address to 4-byte boundary by rounding up. *) + (* (By adding 3 and rounding down using SRA/SLL.) *) + (* For int and arrays: Multiply logical size by 4, no alignment. *) + let code2 = + match getElemSize ty with + | ESByte -> [ Mips.ADDI(tmp_reg, size_reg, 3) + ; Mips.SRA (tmp_reg, tmp_reg, 2) + ; Mips.SLL (tmp_reg, tmp_reg, 2) ] + | ESWord -> [ Mips.SLL (tmp_reg, size_reg, 2) ] + + (* Make space for array size (+4). Increase HP. *) + (* Save size of allocation in header. *) + let code3 = + [ Mips.ADDI (tmp_reg, tmp_reg, 4) + ; Mips.ADD (HP, HP, tmp_reg) + ; Mips.SW (size_reg, place, 0) ] + + code1 @ code2 @ code3 + +(* Pushing arguments on the stack: *) +(* For each register 'r' in 'rs', copy them to registers from +'firstReg' and counting up. Return the full code and the next unused +register (firstReg + num_args). *) +let applyRegs ( fid : Mips.addr + , args : Mips.reg list + , place: Mips.reg + , pos : Position ) + : Mips.Instruction list = + let regs_num = List.length args + let caller_regs = List.map (fun n -> Mips.RN (n + minReg)) [0..regs_num-1] + // List.tabulate (regs_num, fun n -> n + minReg) + (* zipWith Mips.MOVE = + zipWith (fun (regDest, regSrc) -> Mips.MOVE (regDest, regSrc)) *) + let move_code = List.map Mips.MOVE (List.zip caller_regs args) + if regs_num > maxCaller - minReg + then raise (MyError("Number of arguments passed to " + fid + + " exceeds number of caller registers", pos)) + else move_code @ [ Mips.JAL(fid,caller_regs); Mips.MOVE(place, RN2) ] + + +(* Compile 'e' under bindings 'vtable', putting the result in register 'place'. *) +let rec compileExp (e : TypedExp) + (vtable : VarTable) + (place : Mips.reg) + : Mips.Instruction list = + match e with + | Constant (IntVal n, pos) -> + if n < 0 then + compileExp (Negate (Constant (IntVal (-n), pos), pos)) vtable place + else if n < 32768 then + [ Mips.LI (place, n) ] + else + [ Mips.LUI (place, n / 65536) + ; Mips.ORI (place, place, n % 65536) ] + | Constant (BoolVal p, _) -> + (* TODO project task 1: represent `true`/`false` values as `1`/`0` *) + failwith "Unimplemented code generation of boolean constants" + | Constant (CharVal c, pos) -> [ Mips.LI (place, int c) ] + + (* Create/return a label here, collect all string literals of the program + (in stringTable), and create them in the data section before the heap + (Mips.ASCIIZ) *) + | StringLit (strLit, pos) -> + (* Convert string literal into label; only use valid characters. *) + let normalChars0 = //String.filter System.Char.IsLetterOrDigit strLit + String.map (fun c -> if System.Char.IsLetterOrDigit c then c else 'a') strLit + let normalChars = normalChars0 + "__str__" + let label = newLab (normalChars.Substring (0, 7)) + let () = stringTable := (label, strLit)::(!stringTable) + [ Mips.LA (place, label) + ; Mips.COMMENT (label + ": string \"" + toCString strLit + "\"") ] + + | Constant (ArrayVal (vs, tp), pos) -> + (* Create corresponding ArrayLit expression to re-use code. *) + let arraylit = ArrayLit (List.map (fun v -> Constant (v, pos)) vs, tp, pos) + compileExp arraylit vtable place + + | ArrayLit (elems, tp, pos) -> + let elem_size = getElemSize tp + let size_reg = newReg "size_reg" + let addr_reg = newReg "addr_reg" + let tmp_reg = newReg "tmp_reg" + + (* Store size of literal in size_reg, dynamically allocate that. *) + (* Let addr_reg contain the address for the first array element. *) + let header = [ Mips.LI (size_reg, List.length elems) ] @ + dynalloc (size_reg, place, tp) @ + [ Mips.ADDI (addr_reg, place, 4) ] + + let compileElem elem_exp = + let elem_code = compileExp elem_exp vtable tmp_reg + elem_code @ + [ mipsStore elem_size (tmp_reg, addr_reg, 0) + ; Mips.ADDI (addr_reg, addr_reg, elemSizeToInt elem_size) ] + + let elems_code = List.concat (List.map compileElem elems) + header @ elems_code + + | Var (vname, pos) -> + match SymTab.lookup vname vtable with + | None -> raise (MyError ("Name " + vname + " not found", pos)) + | Some reg_name -> [Mips.MOVE (place, reg_name)] + + | Plus (e1, e2, pos) -> + let t1 = newReg "plus_L" + let t2 = newReg "plus_R" + let code1 = compileExp e1 vtable t1 + let code2 = compileExp e2 vtable t2 + code1 @ code2 @ [Mips.ADD (place,t1,t2)] + + | Minus (e1, e2, pos) -> + let t1 = newReg "minus_L" + let t2 = newReg "minus_R" + let code1 = compileExp e1 vtable t1 + let code2 = compileExp e2 vtable t2 + code1 @ code2 @ [Mips.SUB (place,t1,t2)] + + (* TODO project task 1: + Look in `AbSyn.fs` for the expression constructors `Times`, ... + `Times` is very similar to `Plus`/`Minus`. + For `Divide`, you may ignore division by zero for a quick first + version, but remember to come back and clean it up later. + `Not` and `Negate` are simpler; you can use `Mips.XORI` for `Not` + *) + | Times (_, _, _) -> + failwith "Unimplemented code generation of multiplication" + + | Divide (_, _, _) -> + failwith "Unimplemented code generation of division" + + | Not (_, _) -> + failwith "Unimplemented code generation of not" + + | Negate (_, _) -> + failwith "Unimplemented code generation of negate" + + | Let (dec, e1, pos) -> + let (code1, vtable1) = compileDec dec vtable + let code2 = compileExp e1 vtable1 place + code1 @ code2 + + | If (e1, e2, e3, pos) -> + let thenLabel = newLab "then" + let elseLabel = newLab "else" + let endLabel = newLab "endif" + let code1 = compileCond e1 vtable thenLabel elseLabel + let code2 = compileExp e2 vtable place + let code3 = compileExp e3 vtable place + code1 @ [Mips.LABEL thenLabel] @ code2 @ + [ Mips.J endLabel; Mips.LABEL elseLabel ] @ + code3 @ [Mips.LABEL endLabel] + + (* special case for length *) + | Apply ("length", [arr], pos) -> + let arr_addr = newReg "len_arr" + let code1 = compileExp arr vtable arr_addr + code1 @ [ Mips.LW(place,arr_addr, 0) ] + | Apply (f, args, pos) -> + (* Convention: args in regs (2..15), result in reg 2 *) + let compileArg arg = + let arg_reg = newReg "arg" + (arg_reg, compileExp arg vtable arg_reg) + let (arg_regs, argcode) = List.unzip (List.map compileArg args) + let applyCode = applyRegs(f, arg_regs, place, pos) + List.concat argcode @ (* Evaluate args *) + applyCode (* Jump to function and store result in place *) + + (* dirty I/O. Read and Write: supported for basic types: Int, Char, + Bool via system calls. Write of an Array(Chars) is also + supported. The others are the user's responsibility. + *) + | Read(tp, pos) -> + match tp with + | Int -> [ Mips.JAL ("getint", [RN2]) + ; Mips.MOVE(place, RN2) + ] + | Char -> [ Mips.JAL ("getchar", [RN2]) + ; Mips.MOVE(place, RN2) + ] + | Bool -> + (* Note: the following inputs booleans as integers, with 0 + interpreted as false and everything else as true. This + differs from the interpreter! *) + let tl = newLab "true_lab" + let fl = newLab "false_lab" + let ml = newLab "merge_lab" + let v = newReg "bool_var" + [ Mips.JAL ("getint", [RN2]) + ; Mips.MOVE(v, RN2) + ; Mips.BEQ (v, RZ,fl) + ; Mips.J tl + ; Mips.LABEL fl + ; Mips.MOVE(place, RZ) + ; Mips.J ml + ; Mips.LABEL tl + ; Mips.LI (place, 1) + ; Mips.J ml + ; Mips.LABEL ml + ] + | _ -> raise (MyError("Read on an incompatible type: " + ppType tp, pos)) + + | Write(e, tp, pos) -> + let tmp = newReg "tmp" + let codeexp = compileExp e vtable tmp @ [ Mips.MOVE (place, tmp) ] + match tp with + | Int -> codeexp @ [ Mips.MOVE(RN2,place); Mips.JAL("putint", [RN2]) ] + | Char -> codeexp @ [ Mips.MOVE(RN2,place); Mips.JAL("putchar",[RN2]) ] + | Bool -> + let tlab = newLab "wBoolF" + codeexp @ + [ Mips.LA (RN2, "_true") + ; Mips.BNE (place, RZ, tlab) + ; Mips.LA (RN2, "_false") + ; Mips.LABEL tlab + ; Mips.JAL ("putstring", [RN2]) + ] + + | Array Char -> + codeexp @ [ Mips.MOVE (RN2, tmp) + ; Mips.JAL("putstring", [RN2]) ] + | _ -> raise (MyError("Write on an incompatible type: " + ppType tp, pos)) + + (* Comparison checking, later similar code for And and Or. *) + | Equal (e1, e2, pos) -> + let t1 = newReg "eq_L" + let t2 = newReg "eq_R" + let code1 = compileExp e1 vtable t1 + let code2 = compileExp e2 vtable t2 + let falseLabel = newLab "false" + code1 @ code2 @ + [ Mips.LI (place, 0) + ; Mips.BNE (t1,t2,falseLabel) + ; Mips.LI (place, 1) + ; Mips.LABEL falseLabel + ] + + | Less (e1, e2, pos) -> + let t1 = newReg "lt_L" + let t2 = newReg "lt_R" + let code1 = compileExp e1 vtable t1 + let code2 = compileExp e2 vtable t2 + code1 @ code2 @ [Mips.SLT (place,t1,t2)] + + (* TODO project task 1: + Look in `AbSyn.fs` for the expression constructors of `And` and `Or`. + The implementation of `And` and `Or` is more complicated than `Plus` + because you need to ensure the short-circuit semantics, e.g., + in `e1 || e2` if the execution of `e1` will evaluate to `true` then + the code of `e2` must not be executed. Similarly for `And` (&&). + *) + | And (_, _, _) -> + failwith "Unimplemented code generation of &&" + + | Or (_, _, _) -> + failwith "Unimplemented code generation of ||" + + (* Indexing: + 1. generate code to compute the index + 2. check index within bounds + 3. add the start address with the index + 4. get the element at that address + *) + | Index (arr_name, i_exp, ty, pos) -> + let ind_reg = newReg "arr_ind" + let ind_code = compileExp i_exp vtable ind_reg + let arr_reg = newReg "arr_reg" + + (* Let arr_reg be the start of the data segment *) + let arr_beg = + match SymTab.lookup arr_name vtable with + | None -> raise (MyError ("Name " + arr_name + " not found", pos)) + | Some reg_name -> reg_name + let init_code = [ Mips.ADDI(arr_reg, arr_beg, 4) ] + + (* code to check bounds *) + let check_code = checkBounds(arr_beg, ind_reg, pos) + + (* for INT/ARRAY: ind *= 4 else ind is unchanged *) + (* array_var += index; place = *array_var *) + let load_code = + match getElemSize ty with + | ESByte -> [ Mips.ADD(arr_reg, arr_reg, ind_reg) + ; Mips.LB(place, arr_reg, 0) ] + | ESWord -> [ Mips.SLL(ind_reg, ind_reg, 2) + ; Mips.ADD(arr_reg, arr_reg, ind_reg) + ; Mips.LW(place, arr_reg, 0) ] + ind_code @ init_code @ check_code @ load_code + + (* Second-Order Array Combinators (SOACs): + iota, map, reduce + *) + | Iota (n_exp, (line, _)) -> + let size_reg = newReg "size_reg" + let n_code = compileExp n_exp vtable size_reg + (* size_reg is now the integer n. *) + + (* Check that array size N >= 0: + if N >= 0 then jumpto safe_lab + jumpto "_IllegalArrSizeError_" + safe_lab: ... + *) + let safe_lab = newLab "safe_lab" + let checksize = [ Mips.BGEZ (size_reg, safe_lab) + ; Mips.LI (RN5, line) + ; Mips.LA (RN6, "_Msg_IllegalArraySize_") + ; Mips.J "_RuntimeError_" + ; Mips.LABEL (safe_lab) + ] + + let addr_reg = newReg "addr_reg" + let i_reg = newReg "i_reg" + let init_regs = [ Mips.ADDI (addr_reg, place, 4) + ; Mips.MOVE (i_reg, RZ) ] + (* addr_reg is now the position of the first array element. *) + + (* Run a loop. Keep jumping back to loop_beg until it is not the + case that i_reg < size_reg, and then jump to loop_end. *) + let loop_beg = newLab "loop_beg" + let loop_end = newLab "loop_end" + let tmp_reg = newReg "tmp_reg" + let loop_header = [ Mips.LABEL (loop_beg) + ; Mips.SUB (tmp_reg, i_reg, size_reg) + ; Mips.BGEZ (tmp_reg, loop_end) + ] + (* iota is just 'arr[i] = i'. arr[i] is addr_reg. *) + let loop_iota = [ Mips.SW (i_reg, addr_reg, 0) ] + let loop_footer = [ Mips.ADDI (addr_reg, addr_reg, 4) + ; Mips.ADDI (i_reg, i_reg, 1) + ; Mips.J loop_beg + ; Mips.LABEL loop_end + ] + n_code + @ checksize + @ dynalloc (size_reg, place, Int) + @ init_regs + @ loop_header + @ loop_iota + @ loop_footer + + | Map (farg, arr_exp, elem_type, ret_type, pos) -> + let size_reg = newReg "size_reg" (* size of input/output array *) + let arr_reg = newReg "arr_reg" (* address of array *) + let elem_reg = newReg "elem_reg" (* address of single element *) + let res_reg = newReg "res_reg" + let arr_code = compileExp arr_exp vtable arr_reg + + let get_size = [ Mips.LW (size_reg, arr_reg, 0) ] + + let addr_reg = newReg "addr_reg" (* address of element in new array *) + let i_reg = newReg "i_reg" + let init_regs = [ Mips.ADDI (addr_reg, place, 4) + ; Mips.MOVE (i_reg, RZ) + ; Mips.ADDI (elem_reg, arr_reg, 4) + ] + let loop_beg = newLab "loop_beg" + let loop_end = newLab "loop_end" + let tmp_reg = newReg "tmp_reg" + let loop_header = [ Mips.LABEL (loop_beg) + ; Mips.SUB (tmp_reg, i_reg, size_reg) + ; Mips.BGEZ (tmp_reg, loop_end) ] + (* map is 'arr[i] = f(old_arr[i])'. *) + let src_size = getElemSize elem_type + let dst_size = getElemSize ret_type + let loop_map = + [ mipsLoad src_size (res_reg, elem_reg, 0) + ; Mips.ADDI(elem_reg, elem_reg, elemSizeToInt src_size) + ] + @ applyFunArg(farg, [res_reg], vtable, res_reg, pos) + @ + [ mipsStore dst_size (res_reg, addr_reg, 0) + ; Mips.ADDI (addr_reg, addr_reg, elemSizeToInt dst_size) + ] + + let loop_footer = + [ Mips.ADDI (i_reg, i_reg, 1) + ; Mips.J loop_beg + ; Mips.LABEL loop_end + ] + arr_code + @ get_size + @ dynalloc (size_reg, place, ret_type) + @ init_regs + @ loop_header + @ loop_map + @ loop_footer + + (* reduce(f, acc, {x1, x2, ...xn}) = f(f(f(acc,x1),x2),...xn) *) + | Reduce (binop, acc_exp, arr_exp, tp, pos) -> + let arr_reg = newReg "arr_reg" (* address of array *) + let size_reg = newReg "size_reg" (* size of input array *) + let i_reg = newReg "ind_var" (* loop counter *) + let tmp_reg = newReg "tmp_reg" (* several purposes *) + let loop_beg = newLab "loop_beg" + let loop_end = newLab "loop_end" + + let arr_code = compileExp arr_exp vtable arr_reg + let header1 = [ Mips.LW(size_reg, arr_reg, 0) ] + + (* Compile initial value into place (will be updated below) *) + let acc_code = compileExp acc_exp vtable place + + (* Set arr_reg to address of first element instead. *) + (* Set i_reg to 0. While i < size_reg, loop. *) + let loop_code = + [ Mips.ADDI(arr_reg, arr_reg, 4) + ; Mips.MOVE(i_reg, RZ) + ; Mips.LABEL(loop_beg) + ; Mips.SUB(tmp_reg, i_reg, size_reg) + ; Mips.BGEZ(tmp_reg, loop_end) + ] + (* Load arr[i] into tmp_reg *) + let elem_size = getElemSize tp + let load_code = + [ mipsLoad elem_size (tmp_reg, arr_reg, 0) + ; Mips.ADDI (arr_reg, arr_reg, elemSizeToInt elem_size) + ] + (* place := binop(place, tmp_reg) *) + let apply_code = + applyFunArg(binop, [place; tmp_reg], vtable, place, pos) + + arr_code @ header1 @ acc_code @ loop_code @ load_code @ apply_code @ + [ Mips.ADDI(i_reg, i_reg, 1) + ; Mips.J loop_beg + ; Mips.LABEL loop_end + ] + + (* TODO project task 2: + `replicate (n, a)` + `filter (f, arr)` + `scan (f, ne, arr)` + Look in `AbSyn.fs` for the shape of expression constructors + `Replicate`, `Filter`, `Scan`. + General Hint: write down on a piece of paper the C-like pseudocode + for implementing them, then translate that to Mips pseudocode. + To allocate heap space for an array you may use `dynalloc` defined + above. For example, if `sz_reg` is a register containing an integer `n`, + and `ret_type` is the element-type of the to-be-allocated array, then + `dynalloc (sz_reg, arr_reg, ret_type)` will alocate enough space for + an n-element array of element-type `ret_type` (including the first + word that holds the length, and the necessary allignment padding), and + will place in register `arr_reg` the start address of the new array. + Since you need to allocate space for the result arrays of `Replicate`, + `Map` and `Scan`, then `arr_reg` should probably be `place` ... + + `replicate(n,a)`: You should allocate a new (result) array, and execute a + loop of count `n`, in which you store the value hold into the register + corresponding to `a` into each memory location corresponding to an + element of the result array. + If `n` is less than `0` then remember to terminate the program with + an error -- see implementation of `iota`. + *) + | Replicate (_, _, _, _) -> + failwith "Unimplemented code generation of replicate" + + (* TODO project task 2: see also the comment to replicate. + (a) `filter(f, arr)`: has some similarity with the implementation of map. + (b) Use `applyFunArg` to call `f(a)` in a loop, for every element `a` of `arr`. + (c) If `f(a)` succeeds (result in the `true` value) then (and only then): + - set the next element of the result array to `a`, and + - increment a counter (initialized before the loop) + (d) It is useful to maintain two array iterators: one for the input array `arr` + and one for the result array. (The latter increases slower because + some of the elements of the input array are skipped because they fail + under the predicate). + (e) The last step (after the loop writing the elments of the result array) + is to update the logical size of the result array to the value of the + counter computed in step (c). You do this of course with a + `Mips.SW(counter_reg, place, 0)` instruction. + *) + | Filter (_, _, _, _) -> + failwith "Unimplemented code generation of filter" + + (* TODO project task 2: see also the comment to replicate. + `scan(f, ne, arr)`: you can inspire yourself from the implementation of + `reduce`, but in the case of `scan` you will need to also maintain + an iterator through the result array, and write the accumulator in + the current location of the result iterator at every iteration of + the loop. + *) + | Scan (_, _, _, _, _) -> + failwith "Unimplemented code generation of scan" + +and applyFunArg ( ff : TypedFunArg + , args : Mips.reg list + , vtable : VarTable + , place : Mips.reg + , pos : Position + ) : Mips.Instruction list = + match ff with + | FunName s -> + let tmp_reg = newReg "tmp_reg" + applyRegs(s, args, tmp_reg, pos) @ [Mips.MOVE(place, tmp_reg)] + + | Lambda (_, parms, body, lampos) -> + let rec bindParams parms args vtable' = + match (parms, args) with + | (Param (pname,_)::parms', arg::args') -> + bindParams parms' args' (SymTab.bind pname arg vtable') + | _ -> vtable' + let vtable' = bindParams parms args vtable + let t = newReg "fun_arg_res" + compileExp body vtable' t @ [ Mips.MOVE(place, t) ] + +(* compile condition *) +and compileCond (c : TypedExp) + (vtable : VarTable) + (tlab : Mips.addr) + (flab : Mips.addr) + : Mips.Instruction list = + let t1 = newReg "cond" + let code1 = compileExp c vtable t1 + code1 @ [Mips.BNE (t1, RZ, tlab); Mips.J flab] + +(* compile let declaration *) +and compileDec (dec : TypedDec) + (vtable : VarTable) + : (Mips.Instruction list * VarTable) = + let (Dec (s,e,pos)) = dec + let t = newReg "letBind" + let code = compileExp e vtable t + let new_vtable = SymTab.bind s t vtable + (code, new_vtable) + +(* code for saving and restoring callee-saves registers *) +let rec stackSave (currentReg : int) + (maxReg : int) + (savecode : Mips.Instruction list) + (restorecode : Mips.Instruction list) + (offset : int) + : (Mips.Instruction list * Mips.Instruction list * int) = + if currentReg > maxReg + then (savecode, restorecode, offset) (* done *) + else stackSave (currentReg+1) + maxReg + (Mips.SW (Mips.RN currentReg, SP, offset) + :: savecode) (* save register *) + (Mips.LW (Mips.RN currentReg, SP, offset) + :: restorecode) (* restore register *) + (offset-4) (* adjust offset *) + +(* add function arguments to symbol table *) +and getArgs (parms : Param list) + (vtable : VarTable) + (nextReg : int) + : (Mips.Instruction list * VarTable) = + match parms with + | [] -> ([], vtable) + | (Param (v,_)::vs) -> + if nextReg > maxCaller + then raise (MyError ("Passing too many arguments!", (0,0))) + else let vname = newReg ("param_" + v) + let vtable1 = SymTab.bind v vname vtable (* (v,vname)::vtable *) + let (code2,vtable2) = getArgs vs vtable1 (nextReg + 1) + ([Mips.MOVE (vname, Mips.RN nextReg)] @ code2, vtable2) + +(* compile function declaration *) +and compileFun (fundec : TypedFunDec) : Mips.Prog = + let (FunDec (fname, resty, args, exp, (line,col))) = fundec + (* make a vtable from bound formal parameters, + then evaluate expression in this context, return it *) + (* arguments passed in registers, "move" into local vars. *) + let (argcode, vtable_local) = getArgs args (SymTab.empty ()) minReg + (* return value in register 2 *) + let rtmp = newReg (fname + "res") + let returncode = [Mips.MOVE (RN2,rtmp)] (* move return val to R2 *) + let body = compileExp exp vtable_local rtmp (* target expr *) + let (body1, _, maxr, spilled) = + RegAlloc.registerAlloc (* call register allocator *) + (argcode @ body @ returncode) + (Set.singleton (RN2)) 2 maxCaller maxReg 0 + let (savecode, restorecode, offset) = (* save/restore callee-saves *) + stackSave (maxCaller+1) maxr [] [] (-8 + (-4 * spilled)) + [Mips.COMMENT ("Function " + fname); + Mips.LABEL fname; (* function label *) + Mips.SW (RA, SP, -4)] (* save return address *) + @ savecode (* save callee-saves registers *) + @ [Mips.ADDI (SP,SP,offset)] (* SP adjustment *) + @ body1 (* code for function body *) + @ [Mips.ADDI (SP,SP,-offset)] (* move SP up *) + @ restorecode (* restore callee-saves registers *) + @ [Mips.LW (RA, SP, -4); (* restore return addr *) + Mips.JR (RA, [])] (* return *) + + +(* compile program *) +let compile (funs : TypedProg) : Mips.Instruction list = + let () = stringTable := [("_true","true"); ("_false","false")] + let funsCode = List.concat (List.map compileFun funs) + let (stringinit_sym, stringdata) = + List.unzip (List.map buildString (!stringTable)) + let (stringinit,_,_,_) = + match stringinit_sym with + | [] -> ([],Set.empty,0,0) + | _ -> RegAlloc.registerAlloc (* call register allocator *) + (List.concat stringinit_sym) + (Set.singleton (RN2)) 2 maxCaller maxReg 0 + let mips_prog = + [Mips.TEXT "0x00400000"; + Mips.GLOBL "main"] + (* initialisation: heap pointer and string pointers *) + @ (Mips.LA (HP, "_heap_"):: stringinit) + (* jump to main (and stop after returning) *) + @ [Mips.JAL ("main",[])] + @ (* stop code *) + [Mips.LABEL "_stop_"; + Mips.LI (RN2, sysExit); + Mips.SYSCALL] + @ (* code for functions *) + funsCode + (* pre-defined ord: char -> int and chr: int -> char *) + @ [Mips.LABEL "ord"; (* char returned unmodified, interpreted as int *) + Mips.JR (RA,[]); + Mips.LABEL "chr"; (* int values are truncated to 8 bit (ASCII), *) + Mips.ANDI (RN2, RN2, 255); + Mips.JR (RA,[])] + (* built-in read and write functions *) + @ [Mips.LABEL "putint"; (* putint function *) + Mips.ADDI(SP,SP,-8); + Mips.SW (RN2,SP,0); (* save used registers *) + Mips.SW (RN4,SP,4); + Mips.MOVE (RN4, RN2); (* convention: number to be written in r2 *) + Mips.LI (RN2, sysPrintInt); + Mips.SYSCALL; + Mips.LI (RN2, sysPrintString); + Mips.LA(RN4,"_space_"); + Mips.SYSCALL; (* write CR *) + Mips.LW (RN2,SP,0); (* reload used registers *) + Mips.LW (RN4,SP,4); + Mips.ADDI(SP,SP,8); + Mips.JR (RA,[]); + + Mips.LABEL "getint"; (* getint function *) + Mips.LI (RN2,sysReadInt); + Mips.SYSCALL; + Mips.JR (RA,[])] + @ (* putchar *) + [ Mips.LABEL "putchar"; + Mips.ADDI(SP,SP,-8); (* make space for 2 registers on the stack *) + Mips.SW (RN2,SP,0); (* save registers $2 and $4 to stack *) + Mips.SW (RN4,SP,4); + Mips.MOVE (RN4, RN2); (* put char in $4 for syscall to work on *) + Mips.LI(RN2, sysPrintChar); + Mips.SYSCALL; + Mips.LI (RN2, sysPrintString); + Mips.LA(RN4,"_space_"); (* the string we'll write is a space *) + Mips.SYSCALL; + Mips.LW (RN2,SP,0); (* reload registers $2 and $4 from stack *) + Mips.LW (RN4,SP,4); + Mips.ADDI(SP,SP,8); (* free stack space again *) + Mips.JR (RA,[]) + ] + @ (* getchar *) + [ Mips.LABEL "getchar"; + Mips.ADDI(SP,SP,-8); (* make space for 2 registers on the stack *) + Mips.SW (RN4,SP,0); (* save registers $4 and $5 to stack *) + Mips.SW (RN5,SP,4); + Mips.LI(RN2, sysReadChar); + Mips.SYSCALL; + Mips.MOVE(RN5,RN2); (* temporarily move the result in reg $5*) + Mips.LI (RN2, sysPrintString); + Mips.LA(RN4,"_cr_"); + Mips.SYSCALL; (* write CR *) + Mips.MOVE(RN2, RN5); (* put the result back in $2*) + Mips.LW (RN4, SP, 0); (* restore registers *) + Mips.LW (RN5, SP, 4); + Mips.ADDI(SP,SP,8); (* free stack space again *) + Mips.JR (RA,[]) + ] + @ (* putstring *) + [ Mips.LABEL "putstring"; + Mips.ADDI(SP, SP, -16); (* make space on stack for registers *) + Mips.SW (RN2, SP, 0); (* save registers $2,$4,$5,$6 to stack *) + Mips.SW (RN4, SP, 4); + Mips.SW (RN5, SP, 8); + Mips.SW (RN6, SP, 12); + Mips.LW (RN4, RN2, 0); (* $4 := size($2) *) + Mips.ADDI(RN5, RN2, 4); (* $5 := $2 + 4 *) + Mips.ADD (RN6, RN5, RN4); (* $6 := $5 + $4 *) + Mips.LI (RN2, sysPrintChar); + Mips.LABEL "putstring_begin"; + Mips.SUB (RN4, RN5, RN6); (* while ($5 < $6) { *) + Mips.BGEZ(RN4, "putstring_done"); (* *) + Mips.LB(RN4, RN5, 0); (* $4 := M[$5] *) + Mips.SYSCALL; (* putchar($4) *) + Mips.ADDI(RN5, RN5, 1); (* $5 := $5 + 1 *) + Mips.J "putstring_begin"; (* } *) + Mips.LABEL "putstring_done"; + Mips.LW (RN2, SP, 0); (* restore registers $2,$4,$5,$6 *) + Mips.LW (RN4, SP, 4); + Mips.LW (RN5, SP, 8); + Mips.LW (RN6, SP, 12); + Mips.ADDI(SP, SP, 16); (* free stack space again *) + Mips.JR (RA,[]) + ] + @ (* Fixed code for reporting runtime errors. + expects source line number in $5, pointer to error message in $6 *) + [Mips.LABEL "_RuntimeError_"; + Mips.LA (RN4, "_ErrMsg_"); + Mips.LI (RN2, sysPrintString); Mips.SYSCALL; + Mips.MOVE (RN4, RN5); + Mips.LI (RN2, sysPrintInt); Mips.SYSCALL; + Mips.LA (RN4, "_colon_space_"); + Mips.LI (RN2, sysPrintString); Mips.SYSCALL; + Mips.MOVE (RN4, RN6); + Mips.LI (RN2, sysPrintString); Mips.SYSCALL; + Mips.LA (RN4, "_cr_"); + Mips.LI (RN2, sysPrintString); Mips.SYSCALL; + Mips.J "_stop_"] + @ + [Mips.DATA ""; + Mips.COMMENT "Fixed strings for I/O"; + Mips.LABEL "_ErrMsg_"; + Mips.ASCIIZ "Runtime error at line "; + Mips.LABEL "_colon_space_"; + Mips.ASCIIZ ": "; + Mips.LABEL "_cr_"; + Mips.ASCIIZ "\n"; + Mips.LABEL "_space_"; + Mips.ASCIIZ " "] + @ + [Mips.COMMENT "Message strings for specific errors"; + Mips.LABEL "_Msg_IllegalArraySize_"; + Mips.ASCIIZ "negative array size"; + Mips.LABEL "_Msg_IllegalIndex_"; + Mips.ASCIIZ "array index out of bounds" + Mips.LABEL "_Msg_DivZero_"; + Mips.ASCIIZ "division by zero" + ] + @ (* String literals *) + (Mips.COMMENT "String Literals" :: + List.concat stringdata) + (* Heap (to allocate arrays in, word-aligned) *) + @ [Mips.ALIGN 2; + Mips.LABEL "_heap_"; + Mips.SPACE 100000] + mips_prog diff --git a/W1/fasto/Fasto/CopyConstPropFold.fs b/W1/fasto/Fasto/CopyConstPropFold.fs new file mode 100644 index 0000000..0afe02f --- /dev/null +++ b/W1/fasto/Fasto/CopyConstPropFold.fs @@ -0,0 +1,208 @@ +module CopyConstPropFold + + +(* + (* An optimisation takes a program and returns a new program. *) + val optimiseProgram : Fasto.KnownTypes.Prog -> Fasto.KnownTypes.Prog +*) + +open AbSyn + +(* A propagatee is something that we can propagate - either a variable + name or a constant value. *) +type Propagatee = + ConstProp of Value + | VarProp of string + +type VarTable = SymTab.SymTab + +let rec copyConstPropFoldExp (vtable : VarTable) + (e : TypedExp) = + match e with + (* Copy propagation is handled entirely in the following three + cases for variables, array indexing, and let-bindings. *) + | Var (name, pos) -> + (* TODO project task 3: + Should probably look in the symbol table to see if + a binding corresponding to the current variable `name` + exists and if so, it should replace the current expression + with the variable or constant to be propagated. + *) + failwith "Unimplemented copyConstPropFold for Var" + | Index (name, e, t, pos) -> + (* TODO project task 3: + Should probably do the same as the `Var` case, for + the array name, and optimize the index expression `e` as well. + *) + failwith "Unimplemented copyConstPropFold for Index" + | Let (Dec (name, e, decpos), body, pos) -> + let e' = copyConstPropFoldExp vtable e + match e' with + | Var (_, _) -> + (* TODO project task 3: + Hint: I have discovered a variable-copy statement `let x = a`. + I should probably record it in the `vtable` by + associating `x` with a variable-propagatee binding, + and optimize the `body` of the let. + *) + failwith "Unimplemented copyConstPropFold for Let with Var" + | Constant (_, _) -> + (* TODO project task 3: + Hint: I have discovered a constant-copy statement `let x = 5`. + I should probably record it in the `vtable` by + associating `x` with a constant-propagatee binding, + and optimize the `body` of the let. + *) + failwith "Unimplemented copyConstPropFold for Let with Constant" + | Let (_, _, _) -> + (* TODO project task 3: + Hint: this has the structure + `let y = (let x = e1 in e2) in e3` + Problem is, in this form, `e2` may simplify + to a variable or constant, but I will miss + identifying the resulting variable/constant-copy + statement on `y`. + A potential solution is to optimize directly the + restructured, semantically-equivalent expression: + `let x = e1 in let y = e2 in e3` + *) + failwith "Unimplemented copyConstPropFold for Let with Let" + | _ -> (* Fallthrough - for everything else, do nothing *) + let body' = copyConstPropFoldExp vtable body + Let (Dec (name, e', decpos), body', pos) + + | Times (_, _, _) -> + (* TODO project task 3: implement as many safe algebraic + simplifications as you can think of. You may inspire + yourself from the case of `Plus`. For example: + 1 * x = ? + x * 0 = ? + *) + failwith "Unimplemented copyConstPropFold for multiplication" + | And (e1, e2, pos) -> + (* TODO project task 3: see above. You may inspire yourself from + `Or` below, but that only scratches the surface of what's possible *) + failwith "Unimplemented copyConstPropFold for &&" + | Constant (x,pos) -> Constant (x,pos) + | StringLit (x,pos) -> StringLit (x,pos) + | ArrayLit (es, t, pos) -> + ArrayLit (List.map (copyConstPropFoldExp vtable) es, t, pos) + | Plus (e1, e2, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + let e2' = copyConstPropFoldExp vtable e2 + match (e1', e2') with + | (Constant (IntVal x, _), Constant (IntVal y, _)) -> + Constant (IntVal (x + y), pos) + | (Constant (IntVal 0, _), _) -> e2' + | (_, Constant (IntVal 0, _)) -> e1' + | _ -> Plus (e1', e2', pos) + | Minus (e1, e2, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + let e2' = copyConstPropFoldExp vtable e2 + match (e1', e2') with + | (Constant (IntVal x, _), Constant (IntVal y, _)) -> + Constant (IntVal (x - y), pos) + | (_, Constant (IntVal 0, _)) -> e1' + | _ -> Minus (e1', e2', pos) + | Equal (e1, e2, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + let e2' = copyConstPropFoldExp vtable e2 + match (e1', e2') with + | (Constant (IntVal v1, _), Constant (IntVal v2, _)) -> + Constant (BoolVal (v1 = v2), pos) + | _ -> + if false (* e1' = e2' *) (* <- this would be unsafe! (why?) *) + then Constant (BoolVal true, pos) + else Equal (e1', e2', pos) + | Less (e1, e2, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + let e2' = copyConstPropFoldExp vtable e2 + match (e1', e2') with + | (Constant (IntVal v1, _), Constant (IntVal v2, _)) -> + Constant (BoolVal (v1 < v2), pos) + | _ -> + if false (* e1' = e2' *) (* <- as above *) + then Constant (BoolVal false, pos) + else Less (e1', e2', pos) + | If (e1, e2, e3, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + match e1' with + | Constant (BoolVal b, _) -> + if b + then copyConstPropFoldExp vtable e2 + else copyConstPropFoldExp vtable e3 + | _ -> + If (e1', + copyConstPropFoldExp vtable e2, + copyConstPropFoldExp vtable e3, + pos) + | Apply (fname, es, pos) -> + Apply (fname, List.map (copyConstPropFoldExp vtable) es, pos) + | Iota (e, pos) -> + Iota (copyConstPropFoldExp vtable e, pos) + | Replicate (n, e, t, pos) -> + Replicate (copyConstPropFoldExp vtable n, + copyConstPropFoldExp vtable e, + t, pos) + | Map (farg, e, t1, t2, pos) -> + Map (copyConstPropFoldFunArg vtable farg, + copyConstPropFoldExp vtable e, + t1, t2, pos) + | Filter (farg, e, t1, pos) -> + Filter (copyConstPropFoldFunArg vtable farg, + copyConstPropFoldExp vtable e, + t1, pos) + | Reduce (farg, e1, e2, t, pos) -> + Reduce (copyConstPropFoldFunArg vtable farg, + copyConstPropFoldExp vtable e1, + copyConstPropFoldExp vtable e2, + t, pos) + | Scan (farg, e1, e2, t, pos) -> + Scan (copyConstPropFoldFunArg vtable farg, + copyConstPropFoldExp vtable e1, + copyConstPropFoldExp vtable e2, + t, pos) + | Divide (e1, e2, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + let e2' = copyConstPropFoldExp vtable e2 + match (e1', e2') with + | (Constant (IntVal x, _), Constant (IntVal y, _)) when y <> 0 -> + Constant (IntVal (x / y), pos) + | _ -> Divide (e1', e2', pos) + | Or (e1, e2, pos) -> + let e1' = copyConstPropFoldExp vtable e1 + let e2' = copyConstPropFoldExp vtable e2 + match (e1', e2') with + | (Constant (BoolVal a, _), Constant (BoolVal b, _)) -> + Constant (BoolVal (a || b), pos) + | _ -> Or (e1', e2', pos) + | Not (e, pos) -> + let e' = copyConstPropFoldExp vtable e + match e' with + | Constant (BoolVal a, _) -> Constant (BoolVal (not a), pos) + | _ -> Not (e', pos) + | Negate (e, pos) -> + let e' = copyConstPropFoldExp vtable e + match e' with + | Constant (IntVal x, _) -> Constant (IntVal (-x), pos) + | _ -> Negate (e', pos) + | Read (t, pos) -> Read (t, pos) + | Write (e, t, pos) -> Write (copyConstPropFoldExp vtable e, t, pos) + +and copyConstPropFoldFunArg (vtable : VarTable) + (farg : TypedFunArg) = + match farg with + | FunName fname -> FunName fname + | Lambda (rettype, paramls, body, pos) -> + (* Remove any bindings with the same names as the parameters. *) + let paramNames = (List.map (fun (Param (name, _)) -> name) paramls) + let vtable' = SymTab.removeMany paramNames vtable + Lambda (rettype, paramls, copyConstPropFoldExp vtable' body, pos) + +let copyConstPropFoldFunDec = function + | FunDec (fname, rettype, paramls, body, loc) -> + let body' = copyConstPropFoldExp (SymTab.empty ()) body + FunDec (fname, rettype, paramls, body', loc) + +let optimiseProgram (prog : TypedProg) = + List.map copyConstPropFoldFunDec prog diff --git a/W1/fasto/Fasto/DeadBindingRemoval.fs b/W1/fasto/Fasto/DeadBindingRemoval.fs new file mode 100644 index 0000000..4d73ec8 --- /dev/null +++ b/W1/fasto/Fasto/DeadBindingRemoval.fs @@ -0,0 +1,239 @@ +module DeadBindingRemoval + +(* + val removeDeadBindings : Fasto.KnownTypes.Prog -> Fasto.KnownTypes.Prog +*) + +open AbSyn + +type DBRtab = SymTab.SymTab + +let isUsed (name : string) (stab : DBRtab) = + match SymTab.lookup name stab with + | None -> false + | Some _ -> true + +let recordUse (name : string) (stab : DBRtab) = + match SymTab.lookup name stab with + | None -> SymTab.bind name () stab + | Some _ -> stab + +let rec unzip3 = function + | [] -> ([], [], []) + | (x,y,z)::l -> + let (xs, ys, zs) = unzip3 l + (x::xs, y::ys, z::zs) +let anytrue = List.exists (fun x -> x) + +(* Input: the expression to be optimised (by removing inner dead bindings) + The result is a three-tuple: + - bool refers to whether the expression _may_ contain I/O + operations (directly or indirectly). We always err on the safe side; + that is, we only return false if we are certain that + a dead binding to this expression is safe to remove. + - DBRtab is the symbol table that is synthesized from processing the + subexpressions -- its keys are the names that were used in subexpressions. + - the TypedExp is the resulting (optimised) expression + The idea is that you do a bottom-up traversal of AbSyn, and you record + any (variable) names that you find in the symbol table. You find such + names when (1) the expression is a `Var` expression or (2) an `Index` + expression. + Then, whenever you reach a `Let` expression, you check whether the body + of the let has used the variable name currently defined. If not, then + the current binding is unused and can be omitted/removed, _if_ + it contains no I/O operations. For example, assume the original + program is: + `let x = (let y = 4 + 5 in 6) in x * 2` + then one can observe that `y` is unused and the binding `let y = 4 + 5` + can be removed (because `y` is not subsequently used), resulting in the + optimised program: `let x = 6 in x * 2`. + The rest of the expression constructors mainly perform the AbSyn (bottom-up) + traversal by recursively calling `removeDeadBindingsInExp` on subexpressions + and joining the results. +*) +let rec removeDeadBindingsInExp (e : TypedExp) : (bool * DBRtab * TypedExp) = + match e with + | Constant (x, pos) -> (false, SymTab.empty(), Constant (x, pos)) + | StringLit (x, pos) -> (false, SymTab.empty(), StringLit (x, pos)) + | ArrayLit (es, t, pos) -> + let (ios, uses, es') = unzip3 (List.map removeDeadBindingsInExp es) + (anytrue ios, + List.fold SymTab.combine (SymTab.empty()) uses, + ArrayLit (es', t, pos) ) + (* ToDO: Task 3: implement the cases of `Var`, `Index` and `Let` expressions below *) + | Var (name, pos) -> + (* Task 3, Hints for the `Var` case: + - 1st element of result tuple: can a variable name contain IO? + - 2nd element of result tuple: you have discovered a name, hence + you need to record it in a new symbol table. + - 3rd element of the tuple: should be the optimised expression. + *) + failwith "Unimplemented removeDeadBindingsInExp for Var" + | Plus (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Plus (x', y', pos)) + | Minus (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Minus (x', y', pos)) + | Equal (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Equal (x', y', pos)) + | Less (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Less (x', y', pos)) + | If (e1, e2, e3, pos) -> + let (ios1, uses1, e1') = removeDeadBindingsInExp e1 + let (ios2, uses2, e2') = removeDeadBindingsInExp e2 + let (ios3, uses3, e3') = removeDeadBindingsInExp e3 + (ios1 || ios2 || ios3, + SymTab.combine (SymTab.combine uses1 uses2) uses3, + If (e1', e2', e3', pos)) + | Apply (fname, args, pos) -> + let (ios, uses, args') = unzip3 (List.map removeDeadBindingsInExp args) + (* Since we don't currently analyze the body of the called function, + we don't know if it might contain I/O. Thus, we always mark + a function call as non-removable, unless it is to a + known-safe builtin function, such as "length". + (However, if we perform function inlining before removing + dead bindings, being overly cautious here will generally + not cause us to miss many optimization opportunities.) *) + (anytrue ios || fname <> "length", + List.fold SymTab.combine (SymTab.empty()) uses, + Apply (fname, args', pos)) + | Index (name, e, t, pos) -> + (* Task 3, `Index` case: is similar to the `Var` case, except that, + additionally, you also need to recursively optimize the index + expression `e` and to propagate its results (in addition + to recording the use of `name`). + *) + failwith "Unimplemented removeDeadBindingsInExp for Index" + + | Let (Dec (name, e, decpos), body, pos) -> + (* Task 3, Hints for the `Let` case: + - recursively process the `e` and `body` subexpressions + of the Let-binding + - a Let-binding contains IO if at least one of `e` + and `body` does. + - a variable is used in a Let-binding if it is used + in either `e` or `body`, except that any uses in + `body` do not count if they refer to the local + binding of `name`. For example, in + `let x = y+1 in x*z`, + `x` is _not_ considered to be used in the + Let-expression, but `y` and `z` are. Consider how + to express this with the SymTab operations. + - the optimized expression will be either just the + optimized body (if it doesn't use `name` _and_ `e` + does not contain IO), or a new Let-expression + built from the optimized subexpressions + (otherwise). Note that the returned IO-flag and + used-variable table should describe the expression + *resulting* from the optmization, not the original + Let-expression. + + *) + failwith "Unimplemented removeDeadBindingsInExp for Let" + | Iota (e, pos) -> + let (io, uses, e') = removeDeadBindingsInExp e + (io, + uses, + Iota (e', pos)) + | Map (farg, e, t1, t2, pos) -> + let (eio, euses, e') = removeDeadBindingsInExp e + let (fio, fuses, farg') = removeDeadBindingsInFunArg farg + (eio || fio, + SymTab.combine euses fuses, + Map (farg', e', t1, t2, pos)) + | Filter (farg, e, t1, pos) -> + let (eio, euses, e') = removeDeadBindingsInExp e + let (fio, fuses, farg') = removeDeadBindingsInFunArg farg + (eio || fio, + SymTab.combine euses fuses, + Filter (farg', e', t1, pos)) + | Reduce (farg, e1, e2, t, pos) -> + let (io1, uses1, e1') = removeDeadBindingsInExp e1 + let (io2, uses2, e2') = removeDeadBindingsInExp e2 + let (fio, fuses, farg') = removeDeadBindingsInFunArg farg + (io1 || io2 || fio, + SymTab.combine (SymTab.combine uses1 uses2) fuses, + Reduce(farg', e1', e2', t, pos)) + | Replicate (n, e, t, pos) -> + let (nio, nuses, n') = removeDeadBindingsInExp n + let (eio, euses, e') = removeDeadBindingsInExp e + (nio || eio, + SymTab.combine nuses euses, + Replicate (n', e', t, pos)) + | Scan (farg, e1, e2, t, pos) -> + let (io1, uses1, e1') = removeDeadBindingsInExp e1 + let (io2, uses2, e2') = removeDeadBindingsInExp e2 + let (fio, fuses, farg') = removeDeadBindingsInFunArg farg + (io1 || io2 || fio, + SymTab.combine (SymTab.combine uses1 uses2) fuses, + Scan(farg', e1', e2', t, pos)) + | Times (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Times (x', y', pos)) + | Divide (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Divide (x', y', pos)) + | And (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + And (x', y', pos)) + | Or (x, y, pos) -> + let (xios, xuses, x') = removeDeadBindingsInExp x + let (yios, yuses, y') = removeDeadBindingsInExp y + (xios || yios, + SymTab.combine xuses yuses, + Or (x', y', pos)) + | Not (e, pos) -> + let (ios, uses, e') = removeDeadBindingsInExp e + (ios, uses, Not (e', pos)) + | Negate (e, pos) -> + let (ios, uses, e') = removeDeadBindingsInExp e + (ios, uses, Negate (e', pos)) + | Read (x, pos) -> + (true, SymTab.empty(), Read (x, pos)) + | Write (e, t, pos) -> + let (_, uses, e') = removeDeadBindingsInExp e + (true, uses, Write (e', t, pos)) + +and removeDeadBindingsInFunArg (farg : TypedFunArg) = + match farg with + | FunName fname -> (false, SymTab.empty(), FunName fname) + | Lambda (rettype, paramls, body, pos) -> + let (io, uses, body') = removeDeadBindingsInExp body + let uses' = List.fold (fun acc (Param (pname,_)) -> + SymTab.remove pname acc + ) uses paramls + (io, + uses', + Lambda (rettype, paramls, body', pos)) + +let removeDeadBindingsInFunDec (FunDec (fname, rettype, paramls, body, pos)) = + let (_, _, body') = removeDeadBindingsInExp body + FunDec (fname, rettype, paramls, body', pos) + +(* Entrypoint: remove dead bindings from the whole program *) +let removeDeadBindings (prog : TypedProg) = + List.map removeDeadBindingsInFunDec prog diff --git a/W1/fasto/Fasto/DeadFunctionRemoval.fs b/W1/fasto/Fasto/DeadFunctionRemoval.fs new file mode 100644 index 0000000..b975748 --- /dev/null +++ b/W1/fasto/Fasto/DeadFunctionRemoval.fs @@ -0,0 +1,10 @@ +module DeadFunctionRemoval + +open AbSyn +open CallGraph + +let removeDeadFunction (prog : TypedProg) = + let graph = callGraph prog + let alive (FunDec (fname, _, _, _, _)) = + fname = "main" || calls "main" fname graph + List.filter alive prog diff --git a/W1/fasto/Fasto/Fasto.fsproj b/W1/fasto/Fasto/Fasto.fsproj new file mode 100644 index 0000000..c4c05c1 --- /dev/null +++ b/W1/fasto/Fasto/Fasto.fsproj @@ -0,0 +1,38 @@ + + + + Exe + net6.0 + + + + + + + + + -v --module Parser + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/W1/fasto/Fasto/Fasto.fsx b/W1/fasto/Fasto/Fasto.fsx new file mode 100644 index 0000000..32a0840 --- /dev/null +++ b/W1/fasto/Fasto/Fasto.fsx @@ -0,0 +1,252 @@ +// The Fasto compiler command-line interface. +// +// This is the main program for when this compiler is turned into an executable. +// It ties together all the compiler modules. You can build the compiler by +// running 'make' or 'dotnet build Fasto' in the top-level directory. + +open System.Text +open FSharp.Text.Lexing +open System.IO + +open AbSyn +open Inlining +open DeadFunctionRemoval +open DeadBindingRemoval +open CopyConstPropFold + + +// YOU DO NOT NEED TO UNDERSTAND THIS; IT IS A HACK: State machine for getting +// line and position numbers from a Parser error string. This is really nasty. +// The problem is that we can only define the needed 'parse_error_rich' function +// in Parser.fsp at the top of the file, which means that we have not defined +// the actual tokens yet, so we cannot pattern match on them for extracting +// their source code positions, although we *can* print them. An alternative +// solution is to inject a proper 'parse_error_rich' function in the bottom of +// the generated Parser.fs. +exception SyntaxError of int * int +let printPos (errString : string) : unit = + let rec state3 (s : string) (p : int) (lin : string) (col : int) = + (* read digits until not *) + let c = s.[p] + if System.Char.IsDigit c + then state3 s (p-1) (System.Char.ToString c + lin) col + else raise (SyntaxError (System.Int32.Parse lin, col)) + + let rec state2 (s : string) (p : int) (col : string) = + (* skip from position until digit *) + let c = s.[p] + if System.Char.IsDigit c + then state3 s (p-1) (System.Char.ToString c) (System.Int32.Parse col) + else state2 s (p-1) col + + let rec state1 (s : string) (p : int) (col : string) = + (* read digits until not *) + let c = s.[p] + if System.Char.IsDigit c + then state1 s (p-1) (System.Char.ToString c + col) + else state2 s (p-1) col + + let rec state0 (s : string) (p : int) = + (* skip from end until digit *) + let c = s.[p] + if System.Char.IsDigit c + then state1 s (p-1) (System.Char.ToString c) + else state0 s (p-1) + + state0 errString (String.length errString - 1) + +// Parse program from string. +let parseString (s : string) : AbSyn.UntypedProg = + Parser.Prog Lexer.Token + <| LexBuffer<_>.FromBytes (Encoding.UTF8.GetBytes s) + +//////////////////// +/// Usage helper /// +//////////////////// +let usage = + [ " fasto -i tests/fib.fo\n" + ; " Run 'fib.fo' in the 'tests' directory in interpreted mode.\n" + ; " and print the result.\n" + ; "\n" + ; " fasto -r tests/fib.fo\n" + ; " Run 'fib.fo' in interpreted mode, but do not print the result.\n" + ; "\n" + ; " fasto -c tests/fib.fo\n" + ; " Compile 'tests/fib.fo' into the MIPS program 'tests/fib.asm'.\n" + ; "\n" + ; " fasto -o [opts] tests/fib.fo\n" + ; " Compile the optimised 'tests/fib.fo' into 'tests/fib.asm'.\n" + ; "\n" + ; " fasto -p [opts] tests/fib.fo\n" + ; " Optimise 'tests/fib.fo' and print the result on standard output.\n" + ; " is a sequence of characters corresponding to optimisation\n" + ; " passes, where: \n" + ; " i - Inline functions.\n" + ; " c - Copy propagation and constant folding.\n" + ; " d - Remove dead bindings.\n" + ; " D - Remove dead functions.\n" + ] + + +// Print error message to the standard error channel. +let errorMessage (message : string) : Unit = + printfn "%s\n" message + +let errorMessage' (errorType : string, message : string, line : int, col : int) = + printfn "%s: %s at line %d, column %d" errorType message line col + +let bad () : Unit = + errorMessage "Unknown command-line arguments. Usage:\n" + errorMessage (usage |> List.fold (+) "") + +exception FileProblem of string + +// Remove trailing .fo from filename. +let sanitiseFilename (argFilename : string) : string = + if argFilename.EndsWith ".fo" + then argFilename.Substring(0, (String.length argFilename)-3) + else argFilename + +// Save the content of a string to file. +let saveFile (filename : string) (content : string) : Unit = + try + let outFile = File.CreateText filename + // Generate code here. + outFile.Write content + outFile.Close() + with + | ex -> + printfn "Problem writing file named: %s, error: %s,\n where content is:\n %s\n" filename ex.Message content + System.Environment.Exit 1 + + +let parseFastoFile (filename : string) : AbSyn.UntypedProg = + let txt = try // read text from file given as parameter with added extension + let inStream = File.OpenText (filename + ".fo") + let txt = inStream.ReadToEnd() + inStream.Close() + txt + with // or return empty string + | ex -> "" + if txt <> "" then // valid file content + let program = + try + parseString txt + with + | Lexer.LexicalError (info,(line,col)) -> + printfn "%s at line %d, position %d\n" info line col + System.Environment.Exit 1 + [] + | ex -> + if ex.Message = "parse error" + then printPos Parser.ErrorContextDescriptor + else printfn "%s" ex.Message + System.Environment.Exit 1 + [] + program + else failwith "Invalid file name or empty file" + +let compile (filename : string) optimiser : Unit = + let pgm = parseFastoFile filename + let pgm_decorated = TypeChecker.checkProg pgm + let pgm_optimised = optimiser pgm_decorated + let mips_code = CodeGen.compile pgm_optimised + let mips_code_text = Mips.ppMipsProg mips_code + saveFile (filename + ".asm") mips_code_text + +let interpret (filename : string) : Unit = + let pgm = parseFastoFile filename + printfn "Program is:\n\n%s" (AbSyn.ppProg pgm) + printfn "\n+-----------------------------------------+" + printfn "\n| You might need to enter some input now. |" + printfn "\n+-----------------------------------------+" + printfn "\n" + let res = Interpreter.evalProg pgm + printfn "\n\nResult of 'main': %s\n" (AbSyn.ppVal 0 res) + +let interpretSimple (filename : string) : AbSyn.Value = + let pgm = parseFastoFile filename + Interpreter.evalProg pgm + +let printOptimised (argFilename : string) optimiser : Unit = + let pgm = parseFastoFile argFilename + let pgm_decorated = TypeChecker.checkProg pgm + let pgm_optimised = optimiser pgm_decorated + printfn "%s\n" (ppProg pgm_optimised) + +let withoutOptimisations (prog : TypedProg) = prog + +let defaultOptimisations (prog : TypedProg) = + (removeDeadFunction << + removeDeadBindings << + optimiseProgram << + inlineOptimiseProgram) prog + +type opt = char + +let rec extractOpts (opts : opt list) = + match opts with + | [] -> Some (fun x -> x) + | opt::opls -> + let extractOpt (op : opt) = + match op with + | 'i' -> Some inlineOptimiseProgram + | 'c' -> Some optimiseProgram + | 'd' -> Some removeDeadBindings + | 'D' -> Some removeDeadFunction + | _ -> None + match (extractOpt opt, extractOpts opls) with + | (Some opt', Some opts') -> Some (fun x -> opts' (opt' x)) + | _ -> None + +let explode (s:string) = + [for c in s -> c] + +[] +let main (paramList: string[]) : int = + try + match paramList with + | [|"-i"; file|] -> interpret (sanitiseFilename file) + | [|"-r"; file|] -> let res = interpretSimple (sanitiseFilename file) + printfn "\n\nResult of 'main': %s\n" (AbSyn.ppVal 0 res) + | [|"-c"; file|] -> compile (sanitiseFilename file) (fun x -> x) + | [|"-o"; file|] -> compile (sanitiseFilename file) defaultOptimisations + | [|"-o"; opts; file|] -> + match extractOpts (explode opts) with + | Some (opts') -> compile (sanitiseFilename file) opts' + | None -> bad () + | [|"-P"; file|] -> + printOptimised (sanitiseFilename file) withoutOptimisations + | [|"-p"; file|] -> + printOptimised (sanitiseFilename file) defaultOptimisations + | [|"-p"; opts; file|] -> + match extractOpts (explode opts) with + | Some (opts') -> printOptimised (sanitiseFilename file) opts' + | None -> bad () + | _ -> bad () + 0 + with + | SyntaxError (line, col) -> + errorMessage' ("Parse error", "Error", line, col) + System.Environment.Exit 1 + 1 + | Lexer.LexicalError (message, (line, col)) -> + errorMessage' ("Lexical error", message, line, col) + System.Environment.Exit 1 + 1 + | Interpreter.MyError (message, (line, col)) -> + errorMessage' ("Interpreter error", message, line, col) + System.Environment.Exit 1 + 1 + | CodeGen.MyError (message, (line, col)) -> + errorMessage' ("Code generator error", message, line, col) + System.Environment.Exit 1 + 1 + | TypeChecker.MyError (message, (line, col)) -> + errorMessage' ("Type error", message, line, col) + System.Environment.Exit 1 + 1 + | FileProblem filename -> + errorMessage ("There was a problem with the file: " + filename) + System.Environment.Exit 1 + 1 diff --git a/W1/fasto/Fasto/Inlining.fs b/W1/fasto/Fasto/Inlining.fs new file mode 100644 index 0000000..63b3d4a --- /dev/null +++ b/W1/fasto/Fasto/Inlining.fs @@ -0,0 +1,140 @@ +(* We will inline any function that does not call itselt. *) +module Inlining + +open AbSyn +open CallGraph + +let mutable inlining_ctr = 0 (* for generating fresh variable names *) + +let newSuffix () = + inlining_ctr <- inlining_ctr + 1 + "_I" + string inlining_ctr + +let rec inlineInExp (graph : CallGraph) + (prog : TypedProg) + (e : TypedExp) = + match e with + | Constant _ -> e + | StringLit _ -> e + | ArrayLit (es, t, pos) -> + ArrayLit (List.map (inlineInExp graph prog) es, t, pos) + | Var _ -> e + | Plus (e1, e2, pos) -> + Plus (inlineInExp graph prog e1, + inlineInExp graph prog e2, pos) + | Minus (e1, e2, pos) -> + Minus (inlineInExp graph prog e1, + inlineInExp graph prog e2, pos) + | Equal (e1, e2, pos) -> + Equal (inlineInExp graph prog e1, + inlineInExp graph prog e2, pos) + | Less (e1, e2, pos) -> + Less (inlineInExp graph prog e1, + inlineInExp graph prog e2, pos) + | If (e1, e2, e3, pos) -> + If (inlineInExp graph prog e1, + inlineInExp graph prog e2, + inlineInExp graph prog e3, + pos) + | Apply (fname, es, pos) -> + if calls fname fname graph then + (* Function is recursive - do not inline. *) + Apply (fname, List.map (inlineInExp graph prog) es, pos) + else (* OK - inline. *) + inlineFuncall fname graph prog es pos + | Let (Dec (name, e, decpos), body, pos) -> + Let (Dec (name, inlineInExp graph prog e, decpos), + inlineInExp graph prog body, + pos) + | Index (name, e, t, pos) -> + Index (name, inlineInExp graph prog e, t, pos) + | Iota (e, pos) -> + Iota (e, pos) + | Map (farg, e, t1, t2, pos) -> + Map (inlineInFunArg graph prog farg, + inlineInExp graph prog e, + t1, t2, pos) + | Filter (farg, e, t1, pos) -> + Filter (inlineInFunArg graph prog farg, + inlineInExp graph prog e, + t1, pos) + | Reduce (farg, e1, e2, t, pos) -> + Reduce (inlineInFunArg graph prog farg, + inlineInExp graph prog e1, + inlineInExp graph prog e2, + t, pos) + | Replicate (n, e, t, pos) -> + Replicate (inlineInExp graph prog n, + inlineInExp graph prog e, + t, pos) + | Scan (farg, e1, e2, t, pos) -> + Scan (inlineInFunArg graph prog farg, + inlineInExp graph prog e1, + inlineInExp graph prog e2, + t, pos) + | Times (e1, e2, pos) -> + Times (inlineInExp graph prog e1, + inlineInExp graph prog e2, + pos) + | Divide (e1, e2, pos) -> + Divide (inlineInExp graph prog e1, + inlineInExp graph prog e2, + pos) + | And (e1, e2, pos) -> + And (inlineInExp graph prog e1, + inlineInExp graph prog e2, + pos) + | Or (e1, e2, pos) -> + Or (inlineInExp graph prog e1, + inlineInExp graph prog e2, + pos) + | Not (e, pos) -> + Not (inlineInExp graph prog e, pos) + | Negate (e, pos) -> + Negate (inlineInExp graph prog e, pos) + | Read (t, pos) -> + Read (t, pos) + | Write (e, t, pos) -> + Write (inlineInExp graph prog e, t, pos) + +and inlineInFunArg (graph : CallGraph) + (prog : TypedProg) = function + | Lambda (rettype, paramls, body, pos) -> + Lambda (rettype, paramls, inlineInExp graph prog body, pos) + | FunName fname -> + match List.tryFind (fun (FunDec (x, _, _, _, _)) -> x = fname) prog with + | None -> FunName fname + | Some (FunDec (_, rettype, paramls, body, pos)) -> + inlineInFunArg graph prog (Lambda (rettype, paramls, body, pos)) + +and inlineFuncall (fname : string) + (graph : CallGraph) + (prog : TypedProg) + (args : TypedExp list) + (pos : Position) = + match List.tryFind (fun (FunDec(x, _, _, _, _)) -> x = fname) prog with + | None -> Apply (fname, List.map ( inlineInExp graph prog) args, pos) + | Some (FunDec (_, _, paramls, body, _)) -> + let parNames = List.map (fun (Param (v,t)) -> v) paramls + // let paramBindings = List.zip parNames args (* too simplistic *) + let uniq = newSuffix () (* can use same suffix for all pars *) + let parNames1 = List.map (fun v -> v + uniq) parNames + let paramBindings = + List.zip parNames1 args @ + List.zip parNames (List.map (fun v -> Var (v,pos)) parNames1) + let rec mkLetsAroundBody = function + | [] -> body + | ((paramname, arg) :: rest) -> + Let ( Dec ( paramname, arg, pos), + mkLetsAroundBody rest, + pos) + inlineInExp graph prog (mkLetsAroundBody paramBindings) + +let inlineInFunction (graph : CallGraph) + (prog : TypedProg) + (FunDec (fname, rettype, paramls, body, pos)) = + FunDec (fname, rettype, paramls, inlineInExp graph prog body, pos) + +let inlineOptimiseProgram (prog : TypedProg) = + let graph = callGraph prog + List.map (inlineInFunction graph prog) prog diff --git a/W1/fasto/Fasto/Interpreter.fs b/W1/fasto/Fasto/Interpreter.fs new file mode 100644 index 0000000..4d4ae4b --- /dev/null +++ b/W1/fasto/Fasto/Interpreter.fs @@ -0,0 +1,376 @@ +(* An interpreter for Fasto. *) + +module Interpreter + +(* + +An interpreter executes a (Fasto) program by inspecting the abstract syntax +tree of the program, and doing what needs to be done in another programming +language (F#). + +As mentioned in AbSyn.fs, some Fasto expressions are implicitly typed. The +interpreter infers the missing types, and checks the types of the operands +before performing any Fasto operation. Some type errors might still occur though. + +Any valid Fasto program must contain a "main" function, which is the entry +point of the program. The return value of this function is the result of the +Fasto program. + +The main function of interest in this module is: + + val evalProg : AbSyn.UntypedProg -> AbSyn.Value + +*) + +open System +open AbSyn + +(* An exception for reporting run-time errors. *) +exception MyError of string * Position + +type FunTable = SymTab.SymTab +type VarTable = SymTab.SymTab + +(* Build a function table, which associates a function names with function + declarations. *) +let rec buildFtab (fdecs : UntypedFunDec list) : FunTable = + match fdecs with + | [] -> let p = (0, 0) + let ch = 'a' + let fdec_chr = FunDec ("chr", Char, [Param ("n", Int) ], Constant (CharVal ch, p), p) + let fdec_ord = FunDec ("ord", Int, [Param ("c", Char)], Constant (IntVal 1, p), p) + SymTab.fromList [("chr", fdec_chr); ("ord", fdec_ord)] + | ( fdcl::fs ) -> + (* Bind the user-defined functions, in reverse order. *) + let fid = getFunName fdcl + let pos = getFunPos fdcl + let ftab = buildFtab fs + match SymTab.lookup fid ftab with + | None -> SymTab.bind fid fdcl ftab + | Some ofdecl -> + (* Report the first occurrence of the name. *) + raise (MyError ("Already defined function: "+fid, getFunPos ofdecl)) + +(* Check whether a value matches a type. *) +let rec typeMatch (tpval : Type * Value) : bool = + match tpval with + | ( Int, IntVal _ ) -> true + | ( Bool, BoolVal _) -> true + | ( Char, CharVal _) -> true + | ( Array t, ArrayVal (vals, tp) ) -> + (t = tp) && (List.map (fun value -> typeMatch (t, value)) vals |> List.fold (&&) true) + | (_, _) -> false + +let reportBadType (str : string) + (want : string) + (v : Value) + (pos : Position) = + let msg = "Bad type for " + str + ": expected " + want + ", but got " + + ppType (valueType v) + " (" + (ppVal 0 v) + ")" + raise (MyError(msg, pos)) + +let reportWrongType str tp v pos = reportBadType str (ppType tp) v pos + +let reportNonArray str v pos = reportBadType str "an array" v pos + +(* Bind the formal parameters of a function declaration to actual parameters in + a new vtab. *) + +let rec bindParams (fargs : Param list) + (aargs : Value list) + (fid : String) + (pdec : Position) + (pcall : Position) : VarTable = + match (fargs, aargs) with + | ([], []) -> SymTab.empty () + | (Param (faid, fatp) :: fargs, v :: aargs) -> + let vtab = bindParams fargs aargs fid pdec pcall + if typeMatch(fatp, v) + then match SymTab.lookup faid vtab with + None -> SymTab.bind faid v vtab + | Some m -> raise (MyError( "Formal argument is already in symbol table!"+ + " In function: "+fid+" formal argument: "+faid + , pdec )) + else reportWrongType ("argument " + faid + " of function " + fid) + fatp v pcall + | (_, _) -> raise (MyError("Number of formal and actual params do not match in call to "+fid, + pcall)) + + +(* Interpreter for Fasto expressions: + 1. vtab holds bindings between variable names and + their interpreted value (Fasto.Value). + 2. ftab holds bindings between function names and + function declarations (Fasto.FunDec). + 3. Returns the interpreted value. *) +let rec evalExp (e : UntypedExp, vtab : VarTable, ftab : FunTable) : Value = + match e with + | Constant (v,_) -> v + | ArrayLit (l, t, pos) -> + let els = (List.map (fun x -> evalExp(x, vtab, ftab)) l) + let elt = match els with + | [] -> Int (* Arbitrary *) + | v::_ -> valueType v + ArrayVal (els, elt) + | StringLit(s, pos) -> + let cvs = List.map (fun c -> CharVal c) (Seq.toList s) + ArrayVal (cvs, Char) + | Var(id, pos) -> + let res = SymTab.lookup id vtab + match res with + | None -> raise (MyError("Unknown variable "+id, pos)) + | Some m -> m + | Plus(e1, e2, pos) -> + let res1 = evalExp(e1, vtab, ftab) + let res2 = evalExp(e2, vtab, ftab) + match (res1, res2) with + | (IntVal n1, IntVal n2) -> IntVal (n1+n2) + | (IntVal _, _) -> reportWrongType "right operand of +" Int res2 (expPos e2) + | (_, _) -> reportWrongType "left operand of +" Int res1 (expPos e1) + | Minus(e1, e2, pos) -> + let res1 = evalExp(e1, vtab, ftab) + let res2 = evalExp(e2, vtab, ftab) + match (res1, res2) with + | (IntVal n1, IntVal n2) -> IntVal (n1-n2) + | (IntVal _, _) -> reportWrongType "right operand of -" Int res2 (expPos e2) + | (_, _) -> reportWrongType "left operand of -" Int res1 (expPos e1) + (* TODO: project task 1: + Look in `AbSyn.fs` for the arguments of the `Times` + (`Divide`,...) expression constructors. + Implementation similar to the cases of Plus/Minus. + Try to pattern match the code above. + For `Divide`, remember to check for attempts to divide by zero. + For `And`/`Or`: make sure to implement the short-circuit semantics, + e.g., `And (e1, e2, pos)` should not evaluate `e2` if `e1` already + evaluates to false. + *) + | Times(_, _, _) -> + failwith "Unimplemented interpretation of multiplication" + | Divide(_, _, _) -> + failwith "Unimplemented interpretation of division" + | And (_, _, _) -> + failwith "Unimplemented interpretation of &&" + | Or (_, _, _) -> + failwith "Unimplemented interpretation of ||" + | Not(_, _) -> + failwith "Unimplemented interpretation of not" + | Negate(_, _) -> + failwith "Unimplemented interpretation of negate" + | Equal(e1, e2, pos) -> + let r1 = evalExp(e1, vtab, ftab) + let r2 = evalExp(e2, vtab, ftab) + match (r1, r2) with + | (IntVal n1, IntVal n2) -> BoolVal (n1 = n2) + | (BoolVal b1, BoolVal b2) -> BoolVal (b1 = b2) + | (CharVal c1, CharVal c2) -> BoolVal (c1 = c2) + | (ArrayVal _, _) -> reportBadType "left operand of =" "a base type" r1 pos + | (_, _) -> reportWrongType "right operand of =" (valueType r1) r2 pos + | Less(e1, e2, pos) -> + let r1 = evalExp(e1, vtab, ftab) + let r2 = evalExp(e2, vtab, ftab) + match (r1, r2) with + | (IntVal n1, IntVal n2 ) -> BoolVal (n1 < n2) + | (BoolVal false, BoolVal true) -> BoolVal true + | (BoolVal _, BoolVal _ ) -> BoolVal false + | (CharVal c1, CharVal c2 ) -> BoolVal ( (int c1) < (int c2) ) + | (ArrayVal _, _) -> reportBadType "left operand of <" "a base type" r1 pos + | (_, _) -> reportWrongType "right operand of <" (valueType r1) r2 pos + | If(e1, e2, e3, pos) -> + let cond = evalExp(e1, vtab, ftab) + match cond with + | BoolVal true -> evalExp(e2, vtab, ftab) + | BoolVal false -> evalExp(e3, vtab, ftab) + | other -> reportWrongType "if condition" Bool cond (expPos e1) + //raise (MyError("If condition is not a boolean", pos)) + (* The case of length receives special treatment below *) + | Apply("length", [arg], pos) -> + let evarg = evalExp(arg, vtab, ftab) + match evarg with + | ArrayVal (lst, _) -> IntVal (List.length lst) + | otherwise -> reportNonArray "argument of length" evarg pos + | Apply("length", args, pos) -> + let msg = sprintf "Call to length function expects exactly one arg, given: %i" (List.length args) + raise (MyError(msg, pos)) + (* general case of function application *) + | Apply(fid, args, pos) -> + let evargs = List.map (fun e -> evalExp(e, vtab, ftab)) args + match (SymTab.lookup fid ftab) with + | Some f -> callFunWithVtable(f, evargs, SymTab.empty(), ftab, pos) + | None -> raise (MyError("Call to unknown function "+fid, pos)) + | Let(Dec(id,e,p), exp, pos) -> + let res = evalExp(e, vtab, ftab) + let nvtab = SymTab.bind id res vtab + evalExp(exp, nvtab, ftab) + | Index(id, e, tp, pos) -> + let indv = evalExp(e, vtab, ftab) + let arr = SymTab.lookup id vtab + match (arr, indv) with + | (None, _) -> raise (MyError("Unknown array variable "+id, pos)) + | (Some (ArrayVal(lst, tp)), IntVal ind) -> + let len = List.length(lst) + if( len > ind && ind >= 0 ) + then lst.Item(ind) + else let msg = sprintf "Array index out of bounds! Array length: %i, index: %i" len ind + raise (MyError( msg, pos )) + | (Some m, IntVal _) -> reportNonArray ("indexing into " + id) m pos + | (_, _) -> reportWrongType "indexing expression" Int indv pos + | Iota (e, pos) -> + let sz = evalExp(e, vtab, ftab) + match sz with + | IntVal size -> + if size >= 0 + then ArrayVal( List.map (fun x -> IntVal x) [0..size-1], Int ) + else let msg = sprintf "Argument of \"iota\" is negative: %i" size + raise (MyError(msg, pos)) + | _ -> reportWrongType "argument of \"iota\"" Int sz pos + | Map (farg, arrexp, _, _, pos) -> + let arr = evalExp(arrexp, vtab, ftab) + let farg_ret_type = rtpFunArg farg ftab pos + match arr with + | ArrayVal (lst,tp1) -> + let mlst = List.map (fun x -> evalFunArg (farg, vtab, ftab, pos, [x])) lst + ArrayVal (mlst, farg_ret_type) + | otherwise -> reportNonArray "2nd argument of \"map\"" arr pos + | Reduce (farg, ne, arrexp, tp, pos) -> + let farg_ret_type = rtpFunArg farg ftab pos + let arr = evalExp(arrexp, vtab, ftab) + let nel = evalExp(ne, vtab, ftab) + match arr with + | ArrayVal (lst,tp1) -> + List.fold (fun acc x -> evalFunArg (farg, vtab, ftab, pos, [acc;x])) nel lst + | otherwise -> reportNonArray "3rd argument of \"reduce\"" arr pos + (* TODO project task 2: `replicate(n, a)` + Look in `AbSyn.fs` for the arguments of the `Replicate` + (`Map`,`Scan`) expression constructors. + - evaluate `n` then evaluate `a`, + - check that `n` evaluates to an integer value >= 0 + - If so then create an array containing `n` replicas of + the value of `a`; otherwise raise an error (containing + a meaningful message). + *) + | Replicate (_, _, _, _) -> + failwith "Unimplemented interpretation of replicate" + + (* TODO project task 2: `filter(p, arr)` + pattern match the implementation of map: + - check that the function `p` result type (use `rtpFunArg`) is bool; + - evaluate `arr` and check that the (value) result corresponds to an array; + - use F# `List.filter` to keep only the elements `a` of `arr` which succeed + under predicate `p`, i.e., `p(a) = true`; + - create an `ArrayVal` from the (list) result of the previous step. + *) + | Filter (_, _, _, _) -> + failwith "Unimplemented interpretation of filter" + + (* TODO project task 2: `scan(f, ne, arr)` + Implementation similar to reduce, except that it produces an array + of the same type and length to the input array `arr`. + *) + | Scan (_, _, _, _, _) -> + failwith "Unimplemented interpretation of scan" + + | Read (t,p) -> + let str = Console.ReadLine() + match t with + | Int -> let v : int = int str + IntVal v + | Bool when str = "true" -> BoolVal true + | Bool when str = "false" -> BoolVal false + | Char -> let v : char = char str + CharVal v + | otherwise -> raise (MyError("Read operation is valid only on basic types ", p)) + + | Write(exp,t,p) -> + let v = evalExp(exp, vtab, ftab) + match v with + | IntVal n -> printfn "%i " n + | BoolVal b -> let res = if(b) then "true " else "false " + printfn "%s" res + | CharVal c -> printfn "%c " c + | ArrayVal (a, Char) -> + let mapfun = function + | CharVal c -> c + | otherwise -> raise (MyError("Write argument " + + ppVal 0 v + + " should have been evaluated to string", p)) + printfn "%s" ( System.String.Concat (List.map mapfun a) ) + | otherwise -> raise (MyError("Write can be called only on basic and array(char) types ", p)) + v + + + +(* finds the return type of a function argument *) +and rtpFunArg (funarg : UntypedFunArg) + (ftab : FunTable) + (callpos : Position) + : Type = + match funarg with + | FunName fid -> + match SymTab.lookup fid ftab with + | None -> raise (MyError("Call to unknown function "+fid, callpos)) + | Some (FunDec (_, rettype, _, _, _)) -> rettype + | Lambda (rettype, _, _, _) -> rettype + +(* evalFunArg takes as argument a FunArg, a vtable, an ftable, the +position where the call is performed, and the list of actual arguments. +It returns the result of calling the (lambda) function. + *) +and evalFunArg ( funarg : UntypedFunArg + , vtab : VarTable + , ftab : FunTable + , callpos : Position + , aargs : Value list + ) : Value = + match funarg with + | (FunName fid) -> + let fexp = SymTab.lookup fid ftab + match fexp with + | None -> raise (MyError("Call to known function "+fid, callpos)) + | Some f -> callFunWithVtable(f, aargs, SymTab.empty(), ftab, callpos) + | Lambda (rettype, parms, body, fpos) -> + callFunWithVtable ( FunDec ("", rettype, parms, body, fpos) + , aargs, vtab, ftab, callpos ) + +(* Interpreter for Fasto function calls: + 1. f is the function declaration. + 2. args is a list of (already interpreted) arguments. + 3. vtab is the variable symbol table + 4. ftab is the function symbol table (containing f itself). + 5. pcall is the position of the function call. *) +and callFunWithVtable (fundec : UntypedFunDec + , aargs : Value list + , vtab : VarTable + , ftab : FunTable + , pcall : Position + ) : Value = + let (FunDec (fid, rtp, fargs, body, pdcl)) = fundec + match fid with + (* treat the special functions *) + | "ord" -> match aargs with + | [CharVal c] -> IntVal (int c) + | [v] -> reportWrongType "argument of \"ord\"" Char v pcall + | _ -> raise (MyError ("Wrong argument count for \"ord\"", pcall)) + | "chr" -> match aargs with + | [IntVal n] -> CharVal (char n) + | [v] -> reportWrongType "argument of \"chr\"" Int v pcall + | _ -> raise (MyError ("Wrong argument count for \"chr\"", pcall)) + | _ -> + let vtab' = SymTab.combine (bindParams fargs aargs fid pdcl pcall) vtab + let res = evalExp (body, vtab', ftab) + if typeMatch (rtp, res) + then res + else reportWrongType ("result of function \"" + fid + "\"") rtp res pcall + +(* Interpreter for Fasto programs: + 1. builds the function symbol table, + 2. interprets the body of "main", and + 3. returns its result. *) +and evalProg (prog : UntypedProg) : Value = + let ftab = buildFtab prog + let mainf = SymTab.lookup "main" ftab + match mainf with + | None -> raise (MyError("Could not find the main function", (0,0))) + | Some m -> + match getFunArgs m with + | [] -> callFunWithVtable(m, [], SymTab.empty(), ftab, (0,0)) + | _ -> raise (MyError("The main function is not allowed to have parameters", getFunPos m)) diff --git a/W1/fasto/Fasto/Lexer.fs b/W1/fasto/Fasto/Lexer.fs new file mode 100644 index 0000000..8c007ee --- /dev/null +++ b/W1/fasto/Fasto/Lexer.fs @@ -0,0 +1,267 @@ +# 18 "Lexer.fsl" + +module Lexer + +open System;; +open FSharp.Text.Lexing;; +open System.Text;; + +(* A lexer definition for Fasto, for use with fslex. *) + +(* boilerplate code for all lexer files... *) +let mutable currentLine = 1 +let mutable lineStartPos = [0] + +let rec getLineCol pos line = function + | (p1::ps) -> + if pos>=p1 + then (line, pos-p1) + else getLineCol pos (line-1) ps + | [] -> (0,0) (* should not happen *) + +let getPos (lexbuf : LexBuffer<'char>) = + getLineCol lexbuf.StartPos.pos_cnum + (currentLine) + (lineStartPos) + +exception LexicalError of string * (int * int) (* (message, (line, column)) *) + +let lexerError lexbuf s = + raise (LexicalError (s, getPos lexbuf)) + +(* This one is language specific, yet very common. Alternative would + be to encode every keyword as a regexp. This one is much easier. + Note that here we recognize specific keywords, and if none matches + then we assume we have found a user-defined identifier (last case). +*) +let keyword (s, pos) = + match s with + | "if" -> Parser.IF pos + | "then" -> Parser.THEN pos + | "else" -> Parser.ELSE pos + | "let" -> Parser.LET pos + | "in" -> Parser.IN pos + | "int" -> Parser.INT pos + | "bool" -> Parser.BOOL pos + | "char" -> Parser.CHAR pos + | "fun" -> Parser.FUN pos + | "fn" -> Parser.FN pos + | "op" -> Parser.OP pos + +(* specials: *) + | "iota" -> Parser.IOTA pos + | "map" -> Parser.MAP pos + | "reduce" -> Parser.REDUCE pos + | "read" -> Parser.READ pos + | "write" -> Parser.WRITE pos + | _ -> Parser.ID (s, pos) + + +# 60 "Lexer.fs" +let trans : uint16[] array = + [| + (* State 0 *) + [|21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 1us; 2us; 21us; 2us; 1us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 1us; 21us; 8us; 21us; 21us; 21us; 21us; 7us; 13us; 14us; 21us; 9us; 19us; 10us; 21us; 3us; 4us; 5us; 5us; 5us; 5us; 5us; 5us; 5us; 5us; 5us; 21us; 21us; 12us; 11us; 21us; 21us; 21us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 15us; 21us; 16us; 21us; 21us; 21us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 17us; 21us; 18us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 21us; 20us; |]; + (* State 1 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 2 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 3 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 32us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 4 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 5 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 6 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 65535us; 65535us; 65535us; 65535us; 30us; 65535us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 7 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 27us; 65535us; 27us; 27us; 27us; 27us; 65535us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 28us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 8 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 24us; 25us; 25us; 25us; 25us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 26us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 9 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 10 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 11 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 23us; 22us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 12 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 13 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 14 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 15 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 16 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 17 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 18 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 19 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 20 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 21 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 22 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 23 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 24 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 25 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 24us; 25us; 25us; 25us; 25us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 26us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 26 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 27 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 29us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 28 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 29 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 30 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 65535us; 65535us; 65535us; 65535us; 30us; 65535us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 31 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 31us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + (* State 32 *) + [|33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 65535us; 33us; 65535us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 65535us; |]; + (* State 33 *) + [|33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 65535us; 33us; 65535us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 65535us; |]; + (* State 34 *) + [|65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |]; + |] +let actions : uint16[] = [|65535us; 0us; 1us; 21us; 3us; 3us; 4us; 21us; 21us; 7us; 8us; 11us; 12us; 13us; 14us; 15us; 16us; 17us; 18us; 19us; 20us; 21us; 9us; 10us; 6us; 65535us; 65535us; 65535us; 65535us; 5us; 4us; 3us; 2us; 2us; 0us; |] +let _fslex_tables = FSharp.Text.Lexing.AsciiTables.Create(trans,actions) +let rec _fslex_dummy () = _fslex_dummy() +// Rule Token +and Token lexbuf = + match _fslex_tables.Interpret(0,lexbuf) with + | 0 -> ( +# 78 "Lexer.fsl" + Token lexbuf +# 143 "Lexer.fs" + ) + | 1 -> ( +# 79 "Lexer.fsl" + currentLine <- currentLine + 1; + lineStartPos <- lexbuf.StartPos.pos_cnum + :: lineStartPos; + Token lexbuf +# 151 "Lexer.fs" + ) + | 2 -> ( +# 83 "Lexer.fsl" + Token lexbuf +# 156 "Lexer.fs" + ) + | 3 -> ( +# 85 "Lexer.fsl" + Parser.NUM + ( int (Encoding.UTF8.GetString(lexbuf.Lexeme)) + , getPos lexbuf ) + +# 164 "Lexer.fs" + ) + | 4 -> ( +# 90 "Lexer.fsl" + keyword ( Encoding.UTF8.GetString(lexbuf.Lexeme) + , getPos lexbuf ) +# 170 "Lexer.fs" + ) + | 5 -> ( +# 93 "Lexer.fsl" + let str0 = Encoding.UTF8.GetString(lexbuf.Lexeme) + let str1 = str0.Substring (1, (String.length str0) - 2) + let str2 = AbSyn.fromCString str1 + Parser.CHARLIT (str2.Chars(0), getPos lexbuf) + +# 179 "Lexer.fs" + ) + | 6 -> ( +# 99 "Lexer.fsl" + + let str0 = Encoding.UTF8.GetString(lexbuf.Lexeme) + let str1 = str0.Substring (1, (String.length str0) - 2) + Parser.STRINGLIT (AbSyn.fromCString str1, getPos lexbuf) + +# 188 "Lexer.fs" + ) + | 7 -> ( +# 104 "Lexer.fsl" + Parser.PLUS (getPos lexbuf) +# 193 "Lexer.fs" + ) + | 8 -> ( +# 105 "Lexer.fsl" + Parser.MINUS (getPos lexbuf) +# 198 "Lexer.fs" + ) + | 9 -> ( +# 106 "Lexer.fsl" + Parser.ARROW (getPos lexbuf) +# 203 "Lexer.fs" + ) + | 10 -> ( +# 107 "Lexer.fsl" + Parser.DEQ (getPos lexbuf) +# 208 "Lexer.fs" + ) + | 11 -> ( +# 108 "Lexer.fsl" + Parser.EQ (getPos lexbuf) +# 213 "Lexer.fs" + ) + | 12 -> ( +# 109 "Lexer.fsl" + Parser.LTH (getPos lexbuf) +# 218 "Lexer.fs" + ) + | 13 -> ( +# 110 "Lexer.fsl" + Parser.LPAR (getPos lexbuf) +# 223 "Lexer.fs" + ) + | 14 -> ( +# 111 "Lexer.fsl" + Parser.RPAR (getPos lexbuf) +# 228 "Lexer.fs" + ) + | 15 -> ( +# 112 "Lexer.fsl" + Parser.LBRACKET (getPos lexbuf) +# 233 "Lexer.fs" + ) + | 16 -> ( +# 113 "Lexer.fsl" + Parser.RBRACKET (getPos lexbuf) +# 238 "Lexer.fs" + ) + | 17 -> ( +# 114 "Lexer.fsl" + Parser.LCURLY (getPos lexbuf) +# 243 "Lexer.fs" + ) + | 18 -> ( +# 115 "Lexer.fsl" + Parser.RCURLY (getPos lexbuf) +# 248 "Lexer.fs" + ) + | 19 -> ( +# 116 "Lexer.fsl" + Parser.COMMA (getPos lexbuf) +# 253 "Lexer.fs" + ) + | 20 -> ( +# 117 "Lexer.fsl" + Parser.EOF (getPos lexbuf) +# 258 "Lexer.fs" + ) + | 21 -> ( +# 118 "Lexer.fsl" + lexerError lexbuf "Illegal symbol in input" +# 263 "Lexer.fs" + ) + | _ -> failwith "Token" + +# 3000000 "Lexer.fs" diff --git a/W1/fasto/Fasto/Lexer.fsl b/W1/fasto/Fasto/Lexer.fsl new file mode 100644 index 0000000..0d1ff9b --- /dev/null +++ b/W1/fasto/Fasto/Lexer.fsl @@ -0,0 +1,118 @@ +//////////////////////////////////////////////////////////////////// +// TODO: project task 1 +// implement lexer tokens for the new operators: +// multiplication (*), division (/), numerical negation (~), +// logical negation (not), logical and (&&), logical or (||), +// boolean literals (true, false), semicolon (;) +// +// +// TODO: project task 2 +// implement lexer tokens (keywords) for replicate, filter, scan +// +// +// TODO: project task 4 +// implement the lexer tokens (keywords) for array comprehension +//////////////////////////////////////////////////////////////////// + + +{ +module Lexer + +open System;; +open FSharp.Text.Lexing;; +open System.Text;; + +(* A lexer definition for Fasto, for use with fslex. *) + +(* boilerplate code for all lexer files... *) +let mutable currentLine = 1 +let mutable lineStartPos = [0] + +let rec getLineCol pos line = function + | (p1::ps) -> + if pos>=p1 + then (line, pos-p1) + else getLineCol pos (line-1) ps + | [] -> (0,0) (* should not happen *) + +let getPos (lexbuf : LexBuffer<'char>) = + getLineCol lexbuf.StartPos.pos_cnum + (currentLine) + (lineStartPos) + +exception LexicalError of string * (int * int) (* (message, (line, column)) *) + +let lexerError lexbuf s = + raise (LexicalError (s, getPos lexbuf)) + +(* This one is language specific, yet very common. Alternative would + be to encode every keyword as a regexp. This one is much easier. + Note that here we recognize specific keywords, and if none matches + then we assume we have found a user-defined identifier (last case). +*) +let keyword (s, pos) = + match s with + | "if" -> Parser.IF pos + | "then" -> Parser.THEN pos + | "else" -> Parser.ELSE pos + | "let" -> Parser.LET pos + | "in" -> Parser.IN pos + | "int" -> Parser.INT pos + | "bool" -> Parser.BOOL pos + | "char" -> Parser.CHAR pos + | "fun" -> Parser.FUN pos + | "fn" -> Parser.FN pos + | "op" -> Parser.OP pos + +(* specials: *) + | "iota" -> Parser.IOTA pos + | "map" -> Parser.MAP pos + | "reduce" -> Parser.REDUCE pos + | "read" -> Parser.READ pos + | "write" -> Parser.WRITE pos + | _ -> Parser.ID (s, pos) + +} + +rule Token = parse + [' ' '\t' '\r']+ { Token lexbuf } (* whitespace *) + | ['\n' '\012'] { currentLine <- currentLine + 1; + lineStartPos <- lexbuf.StartPos.pos_cnum + :: lineStartPos; + Token lexbuf } (* newlines *) + | "//" [^ '\n' '\012']* { Token lexbuf } (* comment *) + + | '0' | ['1'-'9']['0'-'9']* { Parser.NUM + ( int (Encoding.UTF8.GetString(lexbuf.Lexeme)) + , getPos lexbuf ) + } + | ['a'-'z' 'A'-'Z']['a'-'z' 'A'-'Z' '0'-'9' '_']* + { keyword ( Encoding.UTF8.GetString(lexbuf.Lexeme) + , getPos lexbuf ) } + | '\'' ( [' ' '!' '#'-'&' '('-'[' ']'-'~'] | '\\' ['n' 't' '\'' '"' '\\'] ) '\'' + { let str0 = Encoding.UTF8.GetString(lexbuf.Lexeme) + let str1 = str0.Substring (1, (String.length str0) - 2) + let str2 = AbSyn.fromCString str1 + Parser.CHARLIT (str2.Chars(0), getPos lexbuf) + } + | '"' ( [' ' '!' '#'-'&' '('-'[' ']'-'~'] | '\\' ['n' 't' '\'' '"' '\\'] )* '"' + { + let str0 = Encoding.UTF8.GetString(lexbuf.Lexeme) + let str1 = str0.Substring (1, (String.length str0) - 2) + Parser.STRINGLIT (AbSyn.fromCString str1, getPos lexbuf) + } + | '+' { Parser.PLUS (getPos lexbuf) } + | '-' { Parser.MINUS (getPos lexbuf) } + | "=>" { Parser.ARROW (getPos lexbuf) } + | "==" { Parser.DEQ (getPos lexbuf) } + | '=' { Parser.EQ (getPos lexbuf) } + | '<' { Parser.LTH (getPos lexbuf) } + | '(' { Parser.LPAR (getPos lexbuf) } + | ')' { Parser.RPAR (getPos lexbuf) } + | '[' { Parser.LBRACKET (getPos lexbuf) } + | ']' { Parser.RBRACKET (getPos lexbuf) } + | '{' { Parser.LCURLY (getPos lexbuf) } + | '}' { Parser.RCURLY (getPos lexbuf) } + | ',' { Parser.COMMA (getPos lexbuf) } + | eof { Parser.EOF (getPos lexbuf) } + | _ { lexerError lexbuf "Illegal symbol in input" } diff --git a/W1/fasto/Fasto/Mips.fs b/W1/fasto/Fasto/Mips.fs new file mode 100644 index 0000000..79e2a85 --- /dev/null +++ b/W1/fasto/Fasto/Mips.fs @@ -0,0 +1,127 @@ +(* Types and utilities for the abstract syntax of MIPS. *) + +module Mips + +open AbSyn + +type reg = RN of int | RS of string +type imm = int +type addr = string + +type Instruction = + LABEL of addr (* Angiver en label, man fx kan hoppe til *) + | COMMENT of string (* Placerer en kommentar i assemblerkoden *) + + | LA of reg*addr (* LA($rd,addr): $rd = addr (label) *) + | LUI of reg*imm (* LUI($rd,imm): $rd = (imm << 16) *) + | LW of reg*reg*imm (* LW($rd,$rs,imm): $rd = Mem[$rs + imm] *) + | LB of reg*reg*imm (* LB($rd,$rs,imm): $rd = Mem[$rs + imm] *) + | SW of reg*reg*imm (* SW($rw,$rm,imm): Mem[$rm + imm] = $rw *) + | SB of reg*reg*imm (* SB($rb,$rm,imm): Mem[$rm + imm] = $rb *) + + (* Aritmetiske instruktioner *) + | ADD of reg*reg*reg (* ADD($rd,$rs,$rt): $rd = $rs + $rt. *) + | ADDI of reg*reg*imm (* ADDI($rd,$rs,imm): $rd = $rs + imm *) + | SUB of reg*reg*reg (* SUB($rd,$rs,$rt): $rd = $rs - $rt. *) + | MUL of reg*reg*reg (* MUL($rd,$rs,$rt): $rd = $rs * $rt, no overflow. *) + | DIV of reg*reg*reg (* DIV($rd,$rs,$rt): $rd = quotient($rd / $rs), no overflow. *) + + (* Bitvise operatorer *) + | AND of reg*reg*reg (* AND($rd,$rs,$rt): $rd = $rs & $rt *) + | ANDI of reg*reg*imm (* ANDI($rd,$rs,imm): $rd = $rs & imm *) + | OR of reg*reg*reg (* OR($rd,$rs,$rt): $rd = $rs | $rt *) + | ORI of reg*reg*imm (* ORI($rd,$rs,imm): $rd = $rs | imm *) + | XOR of reg*reg*reg (* XOR($rd,$rs,$rt): $rd = $rs ^ $rt *) + | XORI of reg*reg*imm (* XORI($rd,$rs,imm): $rd = $rs ^ imm *) + + (* Bit-shifting *) + | SLL of reg*reg*imm (* SLL($rd,$rs,imm): $rd = $rs << imm *) + | SRA of reg*reg*imm (* SRA($rd,$rs,imm): $rd = $rs >> imm *) + + (* Instruktioner til sammenligning *) + | SLT of reg*reg*reg (* SLT($rd,$rs,$rt): $rd = $rs < $rt *) + | SLTI of reg*reg*imm (* SLTI($rd,$rs,imm): $rd = $rs < imm *) + | BEQ of reg*reg*addr (* BEQ($rs,$rt,addr): if ($rs == $rd) goto(addr) *) + | BNE of reg*reg*addr (* BNE($rs,$rt,addr): if ($rs != $rd) goto(addr) *) + | BGEZ of reg*addr (* BGEZ($rs,addr): if ($rs >= $0) goto(addr) *) + | J of addr (* J(addr): goto(addr) *) + | JR of reg * reg list (* JR($rd,regs): goto($rd) *) + | JAL of addr* reg list (* JAL(addr,regs): $RA = $PC; goto(addr) *) + | NOP + | SYSCALL (* Udfører det systemkald som er nævnt i $2 *) + + (* Angiver direktiverne .globl, .text, .data, .space, ascii, .asciiz, .align *) + | GLOBL of addr + | TEXT of addr + | DATA of addr + | SPACE of int + | ASCII of string + | ASCIIZ of string + | ALIGN of int + +(* Diverse pseudo-instruktioner *) +let MOVE (rd,rs) = ORI (rd, rs, 0) (* MOVE($rd,$rs): $rd = $rs *) +let LI (rd,imm) = ORI (rd, RN 0, imm) (* LI($rd,imm): $rd = imm *) +let SUBI (rd, rs, imm) = ADDI (rd, rs, -imm) + +type Prog = Instruction list + +(* Pretty-print a list of MIPS instructions in the + format accepted by the MARS MIPS simulator. *) +let rec ppMipsProg instructions = + String.concat "\n" (List.map ppMips instructions) + +(* Pretty-print a single MIPS instruction for .asm output *) +and ppMips inst = + match inst with + | LABEL l -> l + ":" + | COMMENT s -> "# " + s + + | LA (rt,l) -> "\tla\t" + ppReg rt + ", " + l + | LUI (rt,v) -> "\tlui\t" + ppReg rt + ", " + imm2str v + | LW (rd,rs,v) -> "\tlw\t" + ppReg rd + ", " + imm2str v + "(" + ppReg rs + ")" + | LB (rd,rs,v) -> "\tlb\t" + ppReg rd + ", " + imm2str v + "(" + ppReg rs + ")" + | SW (rd,rs,v) -> "\tsw\t" + ppReg rd + ", " + imm2str v + "(" + ppReg rs + ")" + | SB (rd,rs,v) -> "\tsb\t" + ppReg rd + ", " + imm2str v + "(" + ppReg rs + ")" + + | ADD (rd,rs,rt) -> "\tadd\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | ADDI (rd,rs,v) -> "\taddi\t" + ppReg rd + ", " + ppReg rs + ", " + imm2str v + | SUB (rd,rs,rt) -> "\tsub\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | MUL (rd,rs,rt) -> "\tmul\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | DIV (rd,rs,rt) -> "\tdiv\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + + | AND (rd,rs,rt) -> "\tand\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | ANDI (rd,rs,v) -> "\tandi\t" + ppReg rd + ", " + ppReg rs + ", " + imm2str v + | OR (rd,rs,rt) -> "\tor\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | ORI (rd,rs,v) -> "\tori\t" + ppReg rd + ", " + ppReg rs + ", " + imm2str v + | XOR (rd,rs,rt) -> "\txor\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | XORI (rd,rs,v) -> "\txori\t" + ppReg rd + ", " + ppReg rs + ", " + imm2str v + + | SLL (rd,rt,v) -> "\tsll\t" + ppReg rd + ", " + ppReg rt + ", " + imm2str v + | SRA (rd,rt,v) -> "\tsra\t" + ppReg rd + ", " + ppReg rt + ", " + imm2str v + + | SLT (rd,rs,rt) -> "\tslt\t" + ppReg rd + ", " + ppReg rs + ", " + ppReg rt + | SLTI (rd,rs,v) -> "\tslti\t" + ppReg rd + ", " + ppReg rs + ", " + imm2str v + | BEQ (rs,rt,l) -> "\tbeq\t" + ppReg rs + ", " + ppReg rt + ", " + l + | BNE (rs,rt,l) -> "\tbne\t" + ppReg rs + ", " + ppReg rt + ", " + l + | BGEZ (rs,l) -> "\tbgez\t" + ppReg rs + ", " + l + | J l -> "\tj\t" + l + | JAL (l,argRegs) -> "\tjal\t" + l + | JR (r,resRegs) -> "\tjr\t" + ppReg r + | NOP -> "\tnop" + | SYSCALL -> "\tsyscall" + + | GLOBL s -> "\t.globl\t" + s + | TEXT s -> "\t.text\t" + s + | DATA s -> "\t.data\t" + s + | SPACE s -> "\t.space\t" + string s + | ASCII s -> "\t.ascii\t\"" + toCString s + "\"" + | ASCIIZ s -> "\t.asciiz\t\"" + toCString s + "\"" + | ALIGN s -> "\t.align\t" + string s + +and ppReg r = + match r with + | RN n -> "$" + string n + | RS s -> s + +and imm2str (i:imm) = string i (* maybe add some sanity checks here *) diff --git a/W1/fasto/Fasto/Parser.fs b/W1/fasto/Fasto/Parser.fs new file mode 100644 index 0000000..97e4581 --- /dev/null +++ b/W1/fasto/Fasto/Parser.fs @@ -0,0 +1,887 @@ +// Implementation file for parser generated by fsyacc +module Parser +#nowarn "64";; // turn off warnings that type variables used in production annotations are instantiated to concrete type +open FSharp.Text.Lexing +open FSharp.Text.Parsing.ParseHelpers +# 2 "Parser.fsp" + + +let p0 = (0,0) + +open FSharp.Text.Parsing +open AbSyn + +(* parse-error function *) +let mutable ErrorContextDescriptor : string = "" + +let parse_error_rich = + Some (fun (ctxt: ParseErrorContext<_>) -> + ErrorContextDescriptor <- + match ctxt.CurrentToken with + | None -> "At beginning of input\n" + | Some token -> sprintf "at token %A\n" token + ) + + +# 26 "Parser.fs" +// This type is the type of tokens accepted by the parser +type token = + | LPAR of (Position) + | RPAR of (Position) + | LBRACKET of (Position) + | RBRACKET of (Position) + | LCURLY of (Position) + | RCURLY of (Position) + | FUN of (Position) + | FN of (Position) + | COMMA of (Position) + | SEMICOLON of (Position) + | READ of (Position) + | WRITE of (Position) + | DEQ of (Position) + | LTH of (Position) + | EQ of (Position) + | OP of (Position) + | MAP of (Position) + | REDUCE of (Position) + | IOTA of (Position) + | ARROW of (Position) + | PLUS of (Position) + | MINUS of (Position) + | LESS of (Position) + | INT of (Position) + | CHAR of (Position) + | BOOL of (Position) + | IF of (Position) + | THEN of (Position) + | ELSE of (Position) + | LET of (Position) + | IN of (Position) + | EOF of (Position) + | ID of (string * Position) + | STRINGLIT of (string * Position) + | CHARLIT of (char * Position) + | NUM of (int * Position) +// This type is used to give symbolic names to token indexes, useful for error messages +type tokenId = + | TOKEN_LPAR + | TOKEN_RPAR + | TOKEN_LBRACKET + | TOKEN_RBRACKET + | TOKEN_LCURLY + | TOKEN_RCURLY + | TOKEN_FUN + | TOKEN_FN + | TOKEN_COMMA + | TOKEN_SEMICOLON + | TOKEN_READ + | TOKEN_WRITE + | TOKEN_DEQ + | TOKEN_LTH + | TOKEN_EQ + | TOKEN_OP + | TOKEN_MAP + | TOKEN_REDUCE + | TOKEN_IOTA + | TOKEN_ARROW + | TOKEN_PLUS + | TOKEN_MINUS + | TOKEN_LESS + | TOKEN_INT + | TOKEN_CHAR + | TOKEN_BOOL + | TOKEN_IF + | TOKEN_THEN + | TOKEN_ELSE + | TOKEN_LET + | TOKEN_IN + | TOKEN_EOF + | TOKEN_ID + | TOKEN_STRINGLIT + | TOKEN_CHARLIT + | TOKEN_NUM + | TOKEN_end_of_input + | TOKEN_error +// This type is used to give symbolic names to token indexes, useful for error messages +type nonTerminalId = + | NONTERM__startProg + | NONTERM_Prog + | NONTERM_FunDecs + | NONTERM_Fun + | NONTERM_Type + | NONTERM_Params + | NONTERM_BinOp + | NONTERM_Exp + | NONTERM_Exps + | NONTERM_FunArg + +// This function maps tokens to integer indexes +let tagOfToken (t:token) = + match t with + | LPAR _ -> 0 + | RPAR _ -> 1 + | LBRACKET _ -> 2 + | RBRACKET _ -> 3 + | LCURLY _ -> 4 + | RCURLY _ -> 5 + | FUN _ -> 6 + | FN _ -> 7 + | COMMA _ -> 8 + | SEMICOLON _ -> 9 + | READ _ -> 10 + | WRITE _ -> 11 + | DEQ _ -> 12 + | LTH _ -> 13 + | EQ _ -> 14 + | OP _ -> 15 + | MAP _ -> 16 + | REDUCE _ -> 17 + | IOTA _ -> 18 + | ARROW _ -> 19 + | PLUS _ -> 20 + | MINUS _ -> 21 + | LESS _ -> 22 + | INT _ -> 23 + | CHAR _ -> 24 + | BOOL _ -> 25 + | IF _ -> 26 + | THEN _ -> 27 + | ELSE _ -> 28 + | LET _ -> 29 + | IN _ -> 30 + | EOF _ -> 31 + | ID _ -> 32 + | STRINGLIT _ -> 33 + | CHARLIT _ -> 34 + | NUM _ -> 35 + +// This function maps integer indexes to symbolic token ids +let tokenTagToTokenId (tokenIdx:int) = + match tokenIdx with + | 0 -> TOKEN_LPAR + | 1 -> TOKEN_RPAR + | 2 -> TOKEN_LBRACKET + | 3 -> TOKEN_RBRACKET + | 4 -> TOKEN_LCURLY + | 5 -> TOKEN_RCURLY + | 6 -> TOKEN_FUN + | 7 -> TOKEN_FN + | 8 -> TOKEN_COMMA + | 9 -> TOKEN_SEMICOLON + | 10 -> TOKEN_READ + | 11 -> TOKEN_WRITE + | 12 -> TOKEN_DEQ + | 13 -> TOKEN_LTH + | 14 -> TOKEN_EQ + | 15 -> TOKEN_OP + | 16 -> TOKEN_MAP + | 17 -> TOKEN_REDUCE + | 18 -> TOKEN_IOTA + | 19 -> TOKEN_ARROW + | 20 -> TOKEN_PLUS + | 21 -> TOKEN_MINUS + | 22 -> TOKEN_LESS + | 23 -> TOKEN_INT + | 24 -> TOKEN_CHAR + | 25 -> TOKEN_BOOL + | 26 -> TOKEN_IF + | 27 -> TOKEN_THEN + | 28 -> TOKEN_ELSE + | 29 -> TOKEN_LET + | 30 -> TOKEN_IN + | 31 -> TOKEN_EOF + | 32 -> TOKEN_ID + | 33 -> TOKEN_STRINGLIT + | 34 -> TOKEN_CHARLIT + | 35 -> TOKEN_NUM + | 38 -> TOKEN_end_of_input + | 36 -> TOKEN_error + | _ -> failwith "tokenTagToTokenId: bad token" + +/// This function maps production indexes returned in syntax errors to strings representing the non terminal that would be produced by that production +let prodIdxToNonTerminal (prodIdx:int) = + match prodIdx with + | 0 -> NONTERM__startProg + | 1 -> NONTERM_Prog + | 2 -> NONTERM_FunDecs + | 3 -> NONTERM_FunDecs + | 4 -> NONTERM_Fun + | 5 -> NONTERM_Fun + | 6 -> NONTERM_Type + | 7 -> NONTERM_Type + | 8 -> NONTERM_Type + | 9 -> NONTERM_Type + | 10 -> NONTERM_Params + | 11 -> NONTERM_Params + | 12 -> NONTERM_BinOp + | 13 -> NONTERM_Exp + | 14 -> NONTERM_Exp + | 15 -> NONTERM_Exp + | 16 -> NONTERM_Exp + | 17 -> NONTERM_Exp + | 18 -> NONTERM_Exp + | 19 -> NONTERM_Exp + | 20 -> NONTERM_Exp + | 21 -> NONTERM_Exp + | 22 -> NONTERM_Exp + | 23 -> NONTERM_Exp + | 24 -> NONTERM_Exp + | 25 -> NONTERM_Exp + | 26 -> NONTERM_Exp + | 27 -> NONTERM_Exp + | 28 -> NONTERM_Exp + | 29 -> NONTERM_Exp + | 30 -> NONTERM_Exp + | 31 -> NONTERM_Exp + | 32 -> NONTERM_Exp + | 33 -> NONTERM_Exp + | 34 -> NONTERM_Exps + | 35 -> NONTERM_Exps + | 36 -> NONTERM_FunArg + | 37 -> NONTERM_FunArg + | 38 -> NONTERM_FunArg + | _ -> failwith "prodIdxToNonTerminal: bad production index" + +let _fsyacc_endOfInputTag = 38 +let _fsyacc_tagOfErrorTerminal = 36 + +// This function gets the name of a token as a string +let token_to_string (t:token) = + match t with + | LPAR _ -> "LPAR" + | RPAR _ -> "RPAR" + | LBRACKET _ -> "LBRACKET" + | RBRACKET _ -> "RBRACKET" + | LCURLY _ -> "LCURLY" + | RCURLY _ -> "RCURLY" + | FUN _ -> "FUN" + | FN _ -> "FN" + | COMMA _ -> "COMMA" + | SEMICOLON _ -> "SEMICOLON" + | READ _ -> "READ" + | WRITE _ -> "WRITE" + | DEQ _ -> "DEQ" + | LTH _ -> "LTH" + | EQ _ -> "EQ" + | OP _ -> "OP" + | MAP _ -> "MAP" + | REDUCE _ -> "REDUCE" + | IOTA _ -> "IOTA" + | ARROW _ -> "ARROW" + | PLUS _ -> "PLUS" + | MINUS _ -> "MINUS" + | LESS _ -> "LESS" + | INT _ -> "INT" + | CHAR _ -> "CHAR" + | BOOL _ -> "BOOL" + | IF _ -> "IF" + | THEN _ -> "THEN" + | ELSE _ -> "ELSE" + | LET _ -> "LET" + | IN _ -> "IN" + | EOF _ -> "EOF" + | ID _ -> "ID" + | STRINGLIT _ -> "STRINGLIT" + | CHARLIT _ -> "CHARLIT" + | NUM _ -> "NUM" + +// This function gets the data carried by a token as an object +let _fsyacc_dataOfToken (t:token) = + match t with + | LPAR _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | RPAR _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | LBRACKET _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | RBRACKET _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | LCURLY _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | RCURLY _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | FUN _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | FN _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | COMMA _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | SEMICOLON _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | READ _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | WRITE _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | DEQ _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | LTH _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | EQ _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | OP _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | MAP _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | REDUCE _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | IOTA _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | ARROW _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | PLUS _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | MINUS _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | LESS _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | INT _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | CHAR _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | BOOL _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | IF _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | THEN _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | ELSE _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | LET _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | IN _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | EOF _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | ID _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | STRINGLIT _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | CHARLIT _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | NUM _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x +let _fsyacc_gotos = [| 0us; 65535us; 1us; 65535us; 0us; 1us; 2us; 65535us; 0us; 2us; 5us; 6us; 1us; 65535us; 4us; 5us; 7us; 65535us; 4us; 7us; 9us; 23us; 20us; 21us; 25us; 23us; 68us; 69us; 104us; 105us; 106us; 23us; 3us; 65535us; 9us; 10us; 25us; 26us; 106us; 109us; 1us; 65535us; 88us; 89us; 25us; 65535us; 12us; 13us; 15us; 16us; 32us; 53us; 56us; 35us; 57us; 36us; 58us; 37us; 59us; 38us; 60us; 39us; 61us; 40us; 62us; 41us; 63us; 53us; 72us; 42us; 75us; 43us; 80us; 44us; 85us; 45us; 86us; 46us; 90us; 47us; 91us; 48us; 93us; 49us; 97us; 50us; 98us; 51us; 99us; 52us; 101us; 53us; 108us; 54us; 111us; 55us; 3us; 65535us; 32us; 33us; 63us; 64us; 101us; 102us; 2us; 65535us; 78us; 79us; 83us; 84us; |] +let _fsyacc_sparseGotoTableRowOffsets = [|0us; 1us; 3us; 6us; 8us; 16us; 20us; 22us; 48us; 52us; |] +let _fsyacc_stateToProdIdxsTableElements = [| 1us; 0us; 1us; 0us; 1us; 1us; 1us; 1us; 2us; 2us; 3us; 2us; 2us; 3us; 1us; 2us; 2us; 4us; 5us; 2us; 4us; 5us; 2us; 4us; 5us; 1us; 4us; 1us; 4us; 1us; 4us; 5us; 4us; 18us; 19us; 20us; 21us; 1us; 5us; 1us; 5us; 5us; 5us; 18us; 19us; 20us; 21us; 1us; 6us; 1us; 7us; 1us; 8us; 1us; 9us; 1us; 9us; 1us; 9us; 2us; 10us; 11us; 2us; 10us; 11us; 1us; 10us; 1us; 10us; 1us; 12us; 1us; 13us; 1us; 14us; 4us; 15us; 23us; 24us; 33us; 1us; 16us; 1us; 17us; 1us; 17us; 1us; 17us; 5us; 18us; 18us; 19us; 20us; 21us; 5us; 18us; 19us; 19us; 20us; 21us; 5us; 18us; 19us; 20us; 20us; 21us; 5us; 18us; 19us; 20us; 21us; 21us; 5us; 18us; 19us; 20us; 21us; 22us; 5us; 18us; 19us; 20us; 21us; 22us; 5us; 18us; 19us; 20us; 21us; 22us; 5us; 18us; 19us; 20us; 21us; 26us; 5us; 18us; 19us; 20us; 21us; 27us; 5us; 18us; 19us; 20us; 21us; 28us; 5us; 18us; 19us; 20us; 21us; 29us; 5us; 18us; 19us; 20us; 21us; 29us; 5us; 18us; 19us; 20us; 21us; 30us; 5us; 18us; 19us; 20us; 21us; 30us; 5us; 18us; 19us; 20us; 21us; 31us; 5us; 18us; 19us; 20us; 21us; 32us; 5us; 18us; 19us; 20us; 21us; 32us; 5us; 18us; 19us; 20us; 21us; 33us; 6us; 18us; 19us; 20us; 21us; 34us; 35us; 5us; 18us; 19us; 20us; 21us; 37us; 5us; 18us; 19us; 20us; 21us; 38us; 1us; 18us; 1us; 19us; 1us; 20us; 1us; 21us; 1us; 22us; 1us; 22us; 1us; 22us; 2us; 23us; 24us; 1us; 23us; 1us; 23us; 1us; 24us; 1us; 25us; 1us; 25us; 1us; 25us; 1us; 25us; 1us; 26us; 1us; 26us; 1us; 26us; 1us; 27us; 1us; 27us; 1us; 27us; 1us; 28us; 1us; 28us; 1us; 28us; 1us; 28us; 1us; 28us; 2us; 29us; 30us; 2us; 29us; 30us; 1us; 29us; 1us; 29us; 1us; 29us; 1us; 29us; 1us; 30us; 1us; 30us; 1us; 30us; 1us; 30us; 1us; 30us; 1us; 31us; 1us; 31us; 1us; 32us; 1us; 32us; 1us; 32us; 1us; 32us; 1us; 33us; 1us; 33us; 1us; 34us; 1us; 34us; 1us; 36us; 2us; 37us; 38us; 2us; 37us; 38us; 2us; 37us; 38us; 1us; 37us; 1us; 37us; 1us; 38us; 1us; 38us; 1us; 38us; |] +let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us; 2us; 4us; 6us; 8us; 11us; 14us; 16us; 19us; 22us; 25us; 27us; 29us; 31us; 37us; 39us; 41us; 47us; 49us; 51us; 53us; 55us; 57us; 59us; 62us; 65us; 67us; 69us; 71us; 73us; 75us; 80us; 82us; 84us; 86us; 88us; 94us; 100us; 106us; 112us; 118us; 124us; 130us; 136us; 142us; 148us; 154us; 160us; 166us; 172us; 178us; 184us; 190us; 196us; 203us; 209us; 215us; 217us; 219us; 221us; 223us; 225us; 227us; 229us; 232us; 234us; 236us; 238us; 240us; 242us; 244us; 246us; 248us; 250us; 252us; 254us; 256us; 258us; 260us; 262us; 264us; 266us; 268us; 271us; 274us; 276us; 278us; 280us; 282us; 284us; 286us; 288us; 290us; 292us; 294us; 296us; 298us; 300us; 302us; 304us; 306us; 308us; 310us; 312us; 314us; 317us; 320us; 323us; 325us; 327us; 329us; 331us; |] +let _fsyacc_action_rows = 112 +let _fsyacc_actionTableElements = [|1us; 32768us; 6us; 4us; 0us; 49152us; 1us; 32768us; 31us; 3us; 0us; 16385us; 4us; 32768us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 1us; 16387us; 6us; 4us; 0us; 16386us; 1us; 32768us; 32us; 8us; 1us; 32768us; 0us; 9us; 5us; 32768us; 1us; 14us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 1us; 32768us; 1us; 11us; 1us; 32768us; 14us; 12us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 4us; 16388us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 1us; 32768us; 14us; 15us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 4us; 16389us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 0us; 16390us; 0us; 16391us; 0us; 16392us; 4us; 32768us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 1us; 32768us; 3us; 22us; 0us; 16393us; 1us; 32768us; 32us; 24us; 1us; 16395us; 8us; 25us; 4us; 32768us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 0us; 16394us; 0us; 16396us; 0us; 16397us; 0us; 16398us; 2us; 16399us; 0us; 63us; 2us; 99us; 0us; 16400us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 1us; 32768us; 5us; 34us; 0us; 16401us; 0us; 16402us; 0us; 16403us; 2us; 16404us; 20us; 56us; 21us; 57us; 2us; 16405us; 20us; 56us; 21us; 57us; 5us; 32768us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 27us; 61us; 5us; 32768us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 28us; 62us; 4us; 16406us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 1us; 73us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 1us; 76us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 1us; 81us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 8us; 86us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 1us; 87us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 8us; 91us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 1us; 92us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 1us; 94us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 30us; 98us; 4us; 16416us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 32768us; 3us; 100us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 5us; 16419us; 8us; 101us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 4us; 16421us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 4us; 16422us; 12us; 58us; 13us; 59us; 20us; 56us; 21us; 57us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 14us; 32768us; 0us; 93us; 1us; 66us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 1us; 32768us; 1us; 65us; 0us; 16407us; 0us; 16408us; 1us; 32768us; 0us; 68us; 4us; 32768us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 1us; 32768us; 1us; 70us; 0us; 16409us; 1us; 32768us; 0us; 72us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16410us; 1us; 32768us; 0us; 75us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16411us; 1us; 32768us; 0us; 78us; 2us; 32768us; 7us; 104us; 32us; 103us; 1us; 32768us; 8us; 80us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16412us; 1us; 32768us; 0us; 83us; 3us; 32768us; 7us; 104us; 15us; 88us; 32us; 103us; 1us; 32768us; 8us; 85us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16413us; 1us; 32768us; 20us; 27us; 1us; 32768us; 8us; 90us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16414us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16415us; 1us; 32768us; 32us; 96us; 1us; 32768us; 14us; 97us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16417us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 0us; 16418us; 0us; 16420us; 4us; 32768us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 1us; 32768us; 0us; 106us; 5us; 32768us; 1us; 107us; 2us; 20us; 23us; 17us; 24us; 18us; 25us; 19us; 1us; 32768us; 19us; 108us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; 1us; 32768us; 1us; 110us; 1us; 32768us; 19us; 111us; 13us; 32768us; 0us; 93us; 4us; 32us; 10us; 67us; 11us; 71us; 16us; 77us; 17us; 82us; 18us; 74us; 26us; 60us; 29us; 95us; 32us; 30us; 33us; 31us; 34us; 29us; 35us; 28us; |] +let _fsyacc_actionTableRowOffsets = [|0us; 2us; 3us; 5us; 6us; 11us; 13us; 14us; 16us; 18us; 24us; 26us; 28us; 42us; 47us; 49us; 63us; 68us; 69us; 70us; 71us; 76us; 78us; 79us; 81us; 83us; 88us; 89us; 90us; 91us; 92us; 95us; 96us; 110us; 112us; 113us; 114us; 115us; 118us; 121us; 127us; 133us; 138us; 144us; 150us; 156us; 162us; 168us; 174us; 180us; 186us; 192us; 197us; 203us; 209us; 214us; 219us; 233us; 247us; 261us; 275us; 289us; 303us; 317us; 332us; 334us; 335us; 336us; 338us; 343us; 345us; 346us; 348us; 362us; 363us; 365us; 379us; 380us; 382us; 385us; 387us; 401us; 402us; 404us; 408us; 410us; 424us; 438us; 439us; 441us; 443us; 457us; 471us; 472us; 486us; 487us; 489us; 491us; 505us; 519us; 533us; 534us; 548us; 549us; 550us; 555us; 557us; 563us; 565us; 579us; 581us; 583us; |] +let _fsyacc_reductionSymbolCounts = [|1us; 2us; 3us; 2us; 7us; 6us; 1us; 1us; 1us; 3us; 4us; 2us; 1us; 1us; 1us; 1us; 1us; 3us; 3us; 3us; 3us; 3us; 6us; 4us; 3us; 4us; 4us; 4us; 6us; 8us; 9us; 3us; 6us; 4us; 3us; 1us; 1us; 6us; 7us; |] +let _fsyacc_productionToNonTerminalTable = [|0us; 1us; 2us; 2us; 3us; 3us; 4us; 4us; 4us; 4us; 5us; 5us; 6us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 7us; 8us; 8us; 9us; 9us; 9us; |] +let _fsyacc_immediateActions = [|65535us; 49152us; 65535us; 16385us; 65535us; 65535us; 16386us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 16390us; 16391us; 16392us; 65535us; 65535us; 16393us; 65535us; 65535us; 65535us; 16394us; 16396us; 16397us; 16398us; 65535us; 16400us; 65535us; 65535us; 16401us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 16407us; 16408us; 65535us; 65535us; 65535us; 16409us; 65535us; 65535us; 16410us; 65535us; 65535us; 16411us; 65535us; 65535us; 65535us; 65535us; 16412us; 65535us; 65535us; 65535us; 65535us; 65535us; 16413us; 65535us; 65535us; 65535us; 65535us; 16414us; 65535us; 16415us; 65535us; 65535us; 65535us; 65535us; 65535us; 16417us; 65535us; 16418us; 16420us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; |] +let _fsyacc_reductions () = [| +# 338 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedProg in + Microsoft.FSharp.Core.Operators.box + ( + ( + raise (FSharp.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) + ) + : 'gentype__startProg)); +# 347 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedFunDec list in + let _2 = parseState.GetInput(2) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 65 "Parser.fsp" + _1 + ) +# 65 "Parser.fsp" + : AbSyn.UntypedProg)); +# 359 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.UntypedFunDec in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedFunDec list in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 68 "Parser.fsp" + _2 :: _3 + ) +# 68 "Parser.fsp" + : AbSyn.UntypedFunDec list)); +# 372 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.UntypedFunDec in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 69 "Parser.fsp" + _2 :: [] + ) +# 69 "Parser.fsp" + : AbSyn.UntypedFunDec list)); +# 384 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.Type in + let _2 = parseState.GetInput(2) :?> string * Position in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> 'gentype_Params in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> Position in + let _7 = parseState.GetInput(7) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 73 "Parser.fsp" + FunDec (fst _2, _1, _4, _7, snd _2) + ) +# 73 "Parser.fsp" + : AbSyn.UntypedFunDec)); +# 401 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.Type in + let _2 = parseState.GetInput(2) :?> string * Position in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> Position in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 75 "Parser.fsp" + FunDec (fst _2, _1, [], _6, snd _2) + ) +# 75 "Parser.fsp" + : AbSyn.UntypedFunDec)); +# 417 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 78 "Parser.fsp" + AbSyn.Int + ) +# 78 "Parser.fsp" + : AbSyn.Type)); +# 428 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 79 "Parser.fsp" + AbSyn.Char + ) +# 79 "Parser.fsp" + : AbSyn.Type)); +# 439 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 80 "Parser.fsp" + AbSyn.Bool + ) +# 80 "Parser.fsp" + : AbSyn.Type)); +# 450 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.Type in + let _3 = parseState.GetInput(3) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 81 "Parser.fsp" + AbSyn.Array _2 + ) +# 81 "Parser.fsp" + : AbSyn.Type)); +# 463 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.Type in + let _2 = parseState.GetInput(2) :?> string * Position in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> 'gentype_Params in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 85 "Parser.fsp" + Param (fst _2, _1) :: _4 + ) +# 85 "Parser.fsp" + : 'gentype_Params)); +# 477 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.Type in + let _2 = parseState.GetInput(2) :?> string * Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 86 "Parser.fsp" + Param (fst _2, _1) :: [] + ) +# 86 "Parser.fsp" + : 'gentype_Params)); +# 489 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 90 "Parser.fsp" + (Lambda + (Int, [Param ("x", Int); + Param ("y", Int)], + Plus (Var ("x", _1), + Var ("y", _1), + _1) ,_1)) + ) +# 90 "Parser.fsp" + : 'gentype_BinOp)); +# 505 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> int * Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 103 "Parser.fsp" + Constant (IntVal (fst _1), snd _1) + ) +# 103 "Parser.fsp" + : AbSyn.UntypedExp)); +# 516 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> char * Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 104 "Parser.fsp" + Constant (CharVal (fst _1), snd _1) + ) +# 104 "Parser.fsp" + : AbSyn.UntypedExp)); +# 527 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string * Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 105 "Parser.fsp" + Var _1 + ) +# 105 "Parser.fsp" + : AbSyn.UntypedExp)); +# 538 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string * Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 106 "Parser.fsp" + StringLit _1 + ) +# 106 "Parser.fsp" + : AbSyn.UntypedExp)); +# 549 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.UntypedExp list in + let _3 = parseState.GetInput(3) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 108 "Parser.fsp" + ArrayLit (_2, (), _1) + ) +# 108 "Parser.fsp" + : AbSyn.UntypedExp)); +# 562 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedExp in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 109 "Parser.fsp" + Plus (_1, _3, _2) + ) +# 109 "Parser.fsp" + : AbSyn.UntypedExp)); +# 575 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedExp in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 110 "Parser.fsp" + Minus(_1, _3, _2) + ) +# 110 "Parser.fsp" + : AbSyn.UntypedExp)); +# 588 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedExp in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 111 "Parser.fsp" + Equal(_1, _3, _2) + ) +# 111 "Parser.fsp" + : AbSyn.UntypedExp)); +# 601 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedExp in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 112 "Parser.fsp" + Less (_1, _3, _2) + ) +# 112 "Parser.fsp" + : AbSyn.UntypedExp)); +# 614 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.UntypedExp in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> AbSyn.UntypedExp in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 114 "Parser.fsp" + If (_2, _4, _6, _1) + ) +# 114 "Parser.fsp" + : AbSyn.UntypedExp)); +# 630 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string * Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp list in + let _4 = parseState.GetInput(4) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 116 "Parser.fsp" + Apply (fst _1, _3, snd _1) + ) +# 116 "Parser.fsp" + : AbSyn.UntypedExp)); +# 644 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string * Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 117 "Parser.fsp" + Apply (fst _1, [], snd _1) + ) +# 117 "Parser.fsp" + : AbSyn.UntypedExp)); +# 657 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.Type in + let _4 = parseState.GetInput(4) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 119 "Parser.fsp" + Read (_3, _1) + ) +# 119 "Parser.fsp" + : AbSyn.UntypedExp)); +# 671 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + let _4 = parseState.GetInput(4) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 121 "Parser.fsp" + Write (_3, (), _1) + ) +# 121 "Parser.fsp" + : AbSyn.UntypedExp)); +# 685 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + let _4 = parseState.GetInput(4) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 123 "Parser.fsp" + Iota (_3, _1) + ) +# 123 "Parser.fsp" + : AbSyn.UntypedExp)); +# 699 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedFunArg in + let _4 = parseState.GetInput(4) :?> Position in + let _5 = parseState.GetInput(5) :?> AbSyn.UntypedExp in + let _6 = parseState.GetInput(6) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 125 "Parser.fsp" + Map (_3, _5, (), (), _1) + ) +# 125 "Parser.fsp" + : AbSyn.UntypedExp)); +# 715 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedFunArg in + let _4 = parseState.GetInput(4) :?> Position in + let _5 = parseState.GetInput(5) :?> AbSyn.UntypedExp in + let _6 = parseState.GetInput(6) :?> Position in + let _7 = parseState.GetInput(7) :?> AbSyn.UntypedExp in + let _8 = parseState.GetInput(8) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 127 "Parser.fsp" + Reduce (_3, _5, _7, (), _1) + ) +# 127 "Parser.fsp" + : AbSyn.UntypedExp)); +# 733 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> 'gentype_BinOp in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> AbSyn.UntypedExp in + let _7 = parseState.GetInput(7) :?> Position in + let _8 = parseState.GetInput(8) :?> AbSyn.UntypedExp in + let _9 = parseState.GetInput(9) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 129 "Parser.fsp" + Reduce (_4, _6, _8, (), _1) + ) +# 129 "Parser.fsp" + : AbSyn.UntypedExp)); +# 752 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.UntypedExp in + let _3 = parseState.GetInput(3) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 130 "Parser.fsp" + _2 + ) +# 130 "Parser.fsp" + : AbSyn.UntypedExp)); +# 765 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> string * Position in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> AbSyn.UntypedExp in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 133 "Parser.fsp" + Let (Dec (fst _2, _4, _3), _6, _1) + ) +# 133 "Parser.fsp" + : AbSyn.UntypedExp)); +# 781 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string * Position in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp in + let _4 = parseState.GetInput(4) :?> Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 135 "Parser.fsp" + Index (fst _1, _3, (), _2) + ) +# 135 "Parser.fsp" + : AbSyn.UntypedExp)); +# 795 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedExp in + let _2 = parseState.GetInput(2) :?> Position in + let _3 = parseState.GetInput(3) :?> AbSyn.UntypedExp list in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 138 "Parser.fsp" + _1 :: _3 + ) +# 138 "Parser.fsp" + : AbSyn.UntypedExp list)); +# 808 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 139 "Parser.fsp" + _1 :: [] + ) +# 139 "Parser.fsp" + : AbSyn.UntypedExp list)); +# 819 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string * Position in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 142 "Parser.fsp" + FunName (fst _1 ) + ) +# 142 "Parser.fsp" + : AbSyn.UntypedFunArg)); +# 830 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.Type in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> Position in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 144 "Parser.fsp" + Lambda (_2, [], _6, _1) + ) +# 144 "Parser.fsp" + : AbSyn.UntypedFunArg)); +# 846 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Position in + let _2 = parseState.GetInput(2) :?> AbSyn.Type in + let _3 = parseState.GetInput(3) :?> Position in + let _4 = parseState.GetInput(4) :?> 'gentype_Params in + let _5 = parseState.GetInput(5) :?> Position in + let _6 = parseState.GetInput(6) :?> Position in + let _7 = parseState.GetInput(7) :?> AbSyn.UntypedExp in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 146 "Parser.fsp" + Lambda (_2, _4, _7, _1) + ) +# 146 "Parser.fsp" + : AbSyn.UntypedFunArg)); +|] +# 864 "Parser.fs" +let tables : FSharp.Text.Parsing.Tables<_> = + { reductions= _fsyacc_reductions (); + endOfInputTag = _fsyacc_endOfInputTag; + tagOfToken = tagOfToken; + dataOfToken = _fsyacc_dataOfToken; + actionTableElements = _fsyacc_actionTableElements; + actionTableRowOffsets = _fsyacc_actionTableRowOffsets; + stateToProdIdxsTableElements = _fsyacc_stateToProdIdxsTableElements; + stateToProdIdxsTableRowOffsets = _fsyacc_stateToProdIdxsTableRowOffsets; + reductionSymbolCounts = _fsyacc_reductionSymbolCounts; + immediateActions = _fsyacc_immediateActions; + gotos = _fsyacc_gotos; + sparseGotoTableRowOffsets = _fsyacc_sparseGotoTableRowOffsets; + tagOfErrorTerminal = _fsyacc_tagOfErrorTerminal; + parseError = (fun (ctxt:FSharp.Text.Parsing.ParseErrorContext<_>) -> + match parse_error_rich with + | Some f -> f ctxt + | None -> parse_error ctxt.Message); + numTerminals = 39; + productionToNonTerminalTable = _fsyacc_productionToNonTerminalTable } +let engine lexer lexbuf startState = tables.Interpret(lexer, lexbuf, startState) +let Prog lexer lexbuf : AbSyn.UntypedProg = + engine lexer lexbuf 0 :?> _ diff --git a/W1/fasto/Fasto/Parser.fsi b/W1/fasto/Fasto/Parser.fsi new file mode 100644 index 0000000..c5f62f9 --- /dev/null +++ b/W1/fasto/Fasto/Parser.fsi @@ -0,0 +1,101 @@ +// Signature file for parser generated by fsyacc +module Parser +type token = + | LPAR of (Position) + | RPAR of (Position) + | LBRACKET of (Position) + | RBRACKET of (Position) + | LCURLY of (Position) + | RCURLY of (Position) + | FUN of (Position) + | FN of (Position) + | COMMA of (Position) + | SEMICOLON of (Position) + | READ of (Position) + | WRITE of (Position) + | DEQ of (Position) + | LTH of (Position) + | EQ of (Position) + | OP of (Position) + | MAP of (Position) + | REDUCE of (Position) + | IOTA of (Position) + | ARROW of (Position) + | PLUS of (Position) + | MINUS of (Position) + | LESS of (Position) + | INT of (Position) + | CHAR of (Position) + | BOOL of (Position) + | IF of (Position) + | THEN of (Position) + | ELSE of (Position) + | LET of (Position) + | IN of (Position) + | EOF of (Position) + | ID of (string * Position) + | STRINGLIT of (string * Position) + | CHARLIT of (char * Position) + | NUM of (int * Position) +type tokenId = + | TOKEN_LPAR + | TOKEN_RPAR + | TOKEN_LBRACKET + | TOKEN_RBRACKET + | TOKEN_LCURLY + | TOKEN_RCURLY + | TOKEN_FUN + | TOKEN_FN + | TOKEN_COMMA + | TOKEN_SEMICOLON + | TOKEN_READ + | TOKEN_WRITE + | TOKEN_DEQ + | TOKEN_LTH + | TOKEN_EQ + | TOKEN_OP + | TOKEN_MAP + | TOKEN_REDUCE + | TOKEN_IOTA + | TOKEN_ARROW + | TOKEN_PLUS + | TOKEN_MINUS + | TOKEN_LESS + | TOKEN_INT + | TOKEN_CHAR + | TOKEN_BOOL + | TOKEN_IF + | TOKEN_THEN + | TOKEN_ELSE + | TOKEN_LET + | TOKEN_IN + | TOKEN_EOF + | TOKEN_ID + | TOKEN_STRINGLIT + | TOKEN_CHARLIT + | TOKEN_NUM + | TOKEN_end_of_input + | TOKEN_error +type nonTerminalId = + | NONTERM__startProg + | NONTERM_Prog + | NONTERM_FunDecs + | NONTERM_Fun + | NONTERM_Type + | NONTERM_Params + | NONTERM_BinOp + | NONTERM_Exp + | NONTERM_Exps + | NONTERM_FunArg +/// This function maps tokens to integer indexes +val tagOfToken: token -> int + +/// This function maps integer indexes to symbolic token ids +val tokenTagToTokenId: int -> tokenId + +/// This function maps production indexes returned in syntax errors to strings representing the non terminal that would be produced by that production +val prodIdxToNonTerminal: int -> nonTerminalId + +/// This function gets the name of a token as a string +val token_to_string: token -> string +val Prog : (FSharp.Text.Lexing.LexBuffer<'cty> -> token) -> FSharp.Text.Lexing.LexBuffer<'cty> -> (AbSyn.UntypedProg) diff --git a/W1/fasto/Fasto/Parser.fsp b/W1/fasto/Fasto/Parser.fsp new file mode 100644 index 0000000..a0bad45 --- /dev/null +++ b/W1/fasto/Fasto/Parser.fsp @@ -0,0 +1,149 @@ + +%{ + +let p0 = (0,0) + +open FSharp.Text.Parsing +open AbSyn + +(* parse-error function *) +let mutable ErrorContextDescriptor : string = "" + +let parse_error_rich = + Some (fun (ctxt: ParseErrorContext<_>) -> + ErrorContextDescriptor <- + match ctxt.CurrentToken with + | None -> "At beginning of input\n" + | Some token -> sprintf "at token %A\n" token + ) + +%} + +////////////////////////////////////////////////////////////////////// +// TODO: Add new (lexer) token definitions: +// +// TODO: project task 1 : +// - multiplication (*), division (/), numerical negation (~), +// logical negation (not), logical and (&&), logical or (||), +// boolean literals (true, false) +// - add the required precedence and associativity rules for +// *, /, ~, not, &&, || +// - generalize the syntax of let-expressions to allow +// multiple variable declarations +// +// TODO: project task 2: replicate, filter, scan +// +// TODO: project task 4: array comprehension +////////////////////////////////////////////////////////////////////// + +%token NUM +%token CHARLIT +%token ID STRINGLIT +%token IF THEN ELSE LET IN EOF +%token INT CHAR BOOL +%token PLUS MINUS LESS +%token DEQ LTH EQ OP MAP REDUCE IOTA ARROW +%token FUN FN COMMA SEMICOLON READ WRITE +%token LPAR RPAR LBRACKET RBRACKET LCURLY RCURLY + +%nonassoc ifprec letprec +%left DEQ LTH +%left PLUS MINUS + +%start Prog +%type Prog +%type FunDecs +%type Fun +%type Type +%type Exp +%type Exps +%type FunArg +// TODO: Task 1(b): add any new nonterminals here + +%% + +Prog : FunDecs EOF { $1 } +; + +FunDecs : FUN Fun FunDecs { $2 :: $3 } + | FUN Fun { $2 :: [] } +; + +Fun : Type ID LPAR Params RPAR EQ Exp + { FunDec (fst $2, $1, $4, $7, snd $2) } + | Type ID LPAR RPAR EQ Exp + { FunDec (fst $2, $1, [], $6, snd $2) } +; + +Type : INT { AbSyn.Int } + | CHAR { AbSyn.Char } + | BOOL { AbSyn.Bool } + | LBRACKET Type RBRACKET { AbSyn.Array $2 } +; + +Params : Type ID COMMA Params + { Param (fst $2, $1) :: $4 } + | Type ID { Param (fst $2, $1) :: [] } +; + + +BinOp : PLUS { (Lambda + (Int, [Param ("x", Int); + Param ("y", Int)], + Plus (Var ("x", $1), + Var ("y", $1), + $1) ,$1))} +; + +/////////////////////////////////////////////////////// +// TODO: project tasks 1,2,4: +// add grammer rules for the new expressions +/////////////////////////////////////////////////////// + +Exp : NUM { Constant (IntVal (fst $1), snd $1) } + | CHARLIT { Constant (CharVal (fst $1), snd $1) } + | ID { Var $1 } + | STRINGLIT { StringLit $1 } + | LCURLY Exps RCURLY + { ArrayLit ($2, (), $1) } + | Exp PLUS Exp { Plus ($1, $3, $2) } + | Exp MINUS Exp { Minus($1, $3, $2) } + | Exp DEQ Exp { Equal($1, $3, $2) } + | Exp LTH Exp { Less ($1, $3, $2) } + | IF Exp THEN Exp ELSE Exp %prec ifprec + { If ($2, $4, $6, $1) } + | ID LPAR Exps RPAR + { Apply (fst $1, $3, snd $1) } + | ID LPAR RPAR { Apply (fst $1, [], snd $1) } + | READ LPAR Type RPAR + { Read ($3, $1) } + | WRITE LPAR Exp RPAR + { Write ($3, (), $1) } + | IOTA LPAR Exp RPAR + { Iota ($3, $1) } + | MAP LPAR FunArg COMMA Exp RPAR + { Map ($3, $5, (), (), $1) } + | REDUCE LPAR FunArg COMMA Exp COMMA Exp RPAR + { Reduce ($3, $5, $7, (), $1) } + | REDUCE LPAR OP BinOp COMMA Exp COMMA Exp RPAR + { Reduce ($4, $6, $8, (), $1) } + | LPAR Exp RPAR { $2 } + // TODO: task 1(b): replace this with a more general production + | LET ID EQ Exp IN Exp %prec letprec + { Let (Dec (fst $2, $4, $3), $6, $1) } + | ID LBRACKET Exp RBRACKET + { Index (fst $1, $3, (), $2) } +; + +Exps : Exp COMMA Exps { $1 :: $3 } + | Exp { $1 :: [] } +; + +FunArg : ID { FunName (fst $1 ) } + | FN Type LPAR RPAR ARROW Exp + { Lambda ($2, [], $6, $1) } + | FN Type LPAR Params RPAR ARROW Exp + { Lambda ($2, $4, $7, $1) } +; + +%% diff --git a/W1/fasto/Fasto/Parser.fsyacc.output b/W1/fasto/Fasto/Parser.fsyacc.output new file mode 100644 index 0000000..a94e590 --- /dev/null +++ b/W1/fasto/Fasto/Parser.fsyacc.output @@ -0,0 +1,4640 @@ + Output file describing compiled parser placed in Parser.fs and Parser.fsi +------------------------ +states = +state 0: items: _startProg -> . Prog + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): shift 4 + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Prog: 1 + goto FunDecs: 2 +state 1: items: _startProg -> Prog . + actions: action 'LPAR' (noprec): accept + action 'RPAR' (noprec): accept + action 'LBRACKET' (noprec): accept + action 'RBRACKET' (noprec): accept + action 'LCURLY' (noprec): accept + action 'RCURLY' (noprec): accept + action 'FUN' (noprec): accept + action 'FN' (noprec): accept + action 'COMMA' (noprec): accept + action 'SEMICOLON' (noprec): accept + action 'READ' (noprec): accept + action 'WRITE' (noprec): accept + action 'DEQ' (noprec): accept + action 'LTH' (noprec): accept + action 'EQ' (noprec): accept + action 'OP' (noprec): accept + action 'MAP' (noprec): accept + action 'REDUCE' (noprec): accept + action 'IOTA' (noprec): accept + action 'ARROW' (noprec): accept + action 'PLUS' (noprec): accept + action 'MINUS' (noprec): accept + action 'LESS' (noprec): accept + action 'INT' (noprec): accept + action 'CHAR' (noprec): accept + action 'BOOL' (noprec): accept + action 'IF' (noprec): accept + action 'THEN' (noprec): accept + action 'ELSE' (noprec): accept + action 'LET' (noprec): accept + action 'IN' (noprec): accept + action 'EOF' (noprec): accept + action 'ID' (noprec): accept + action 'STRINGLIT' (noprec): accept + action 'CHARLIT' (noprec): accept + action 'NUM' (noprec): accept + action 'error' (noprec): accept + action '#' (noprec): accept + action '$$' (noprec): accept + immediate action: accept gotos:state 2: items: Prog -> FunDecs . 'EOF' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): shift 3 + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 3: items: Prog -> FunDecs 'EOF' . + actions: action 'LPAR' (noprec): reduce Prog --> FunDecs 'EOF' + action 'RPAR' (noprec): reduce Prog --> FunDecs 'EOF' + action 'LBRACKET' (noprec): reduce Prog --> FunDecs 'EOF' + action 'RBRACKET' (noprec): reduce Prog --> FunDecs 'EOF' + action 'LCURLY' (noprec): reduce Prog --> FunDecs 'EOF' + action 'RCURLY' (noprec): reduce Prog --> FunDecs 'EOF' + action 'FUN' (noprec): reduce Prog --> FunDecs 'EOF' + action 'FN' (noprec): reduce Prog --> FunDecs 'EOF' + action 'COMMA' (noprec): reduce Prog --> FunDecs 'EOF' + action 'SEMICOLON' (noprec): reduce Prog --> FunDecs 'EOF' + action 'READ' (noprec): reduce Prog --> FunDecs 'EOF' + action 'WRITE' (noprec): reduce Prog --> FunDecs 'EOF' + action 'DEQ' (noprec): reduce Prog --> FunDecs 'EOF' + action 'LTH' (noprec): reduce Prog --> FunDecs 'EOF' + action 'EQ' (noprec): reduce Prog --> FunDecs 'EOF' + action 'OP' (noprec): reduce Prog --> FunDecs 'EOF' + action 'MAP' (noprec): reduce Prog --> FunDecs 'EOF' + action 'REDUCE' (noprec): reduce Prog --> FunDecs 'EOF' + action 'IOTA' (noprec): reduce Prog --> FunDecs 'EOF' + action 'ARROW' (noprec): reduce Prog --> FunDecs 'EOF' + action 'PLUS' (noprec): reduce Prog --> FunDecs 'EOF' + action 'MINUS' (noprec): reduce Prog --> FunDecs 'EOF' + action 'LESS' (noprec): reduce Prog --> FunDecs 'EOF' + action 'INT' (noprec): reduce Prog --> FunDecs 'EOF' + action 'CHAR' (noprec): reduce Prog --> FunDecs 'EOF' + action 'BOOL' (noprec): reduce Prog --> FunDecs 'EOF' + action 'IF' (noprec): reduce Prog --> FunDecs 'EOF' + action 'THEN' (noprec): reduce Prog --> FunDecs 'EOF' + action 'ELSE' (noprec): reduce Prog --> FunDecs 'EOF' + action 'LET' (noprec): reduce Prog --> FunDecs 'EOF' + action 'IN' (noprec): reduce Prog --> FunDecs 'EOF' + action 'EOF' (noprec): reduce Prog --> FunDecs 'EOF' + action 'ID' (noprec): reduce Prog --> FunDecs 'EOF' + action 'STRINGLIT' (noprec): reduce Prog --> FunDecs 'EOF' + action 'CHARLIT' (noprec): reduce Prog --> FunDecs 'EOF' + action 'NUM' (noprec): reduce Prog --> FunDecs 'EOF' + action 'error' (noprec): reduce Prog --> FunDecs 'EOF' + action '#' (noprec): reduce Prog --> FunDecs 'EOF' + action '$$' (noprec): reduce Prog --> FunDecs 'EOF' + immediate action: reduce Prog --> FunDecs 'EOF' gotos:state 4: items: FunDecs -> 'FUN' . Fun FunDecs + FunDecs -> 'FUN' . Fun + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Fun: 5 + goto Type: 7 +state 5: items: FunDecs -> 'FUN' Fun . FunDecs + FunDecs -> 'FUN' Fun . + actions: action 'LPAR' (noprec): reduce FunDecs --> 'FUN' Fun + action 'RPAR' (noprec): reduce FunDecs --> 'FUN' Fun + action 'LBRACKET' (noprec): reduce FunDecs --> 'FUN' Fun + action 'RBRACKET' (noprec): reduce FunDecs --> 'FUN' Fun + action 'LCURLY' (noprec): reduce FunDecs --> 'FUN' Fun + action 'RCURLY' (noprec): reduce FunDecs --> 'FUN' Fun + action 'FUN' (noprec): shift 4 + action 'FN' (noprec): reduce FunDecs --> 'FUN' Fun + action 'COMMA' (noprec): reduce FunDecs --> 'FUN' Fun + action 'SEMICOLON' (noprec): reduce FunDecs --> 'FUN' Fun + action 'READ' (noprec): reduce FunDecs --> 'FUN' Fun + action 'WRITE' (noprec): reduce FunDecs --> 'FUN' Fun + action 'DEQ' (noprec): reduce FunDecs --> 'FUN' Fun + action 'LTH' (noprec): reduce FunDecs --> 'FUN' Fun + action 'EQ' (noprec): reduce FunDecs --> 'FUN' Fun + action 'OP' (noprec): reduce FunDecs --> 'FUN' Fun + action 'MAP' (noprec): reduce FunDecs --> 'FUN' Fun + action 'REDUCE' (noprec): reduce FunDecs --> 'FUN' Fun + action 'IOTA' (noprec): reduce FunDecs --> 'FUN' Fun + action 'ARROW' (noprec): reduce FunDecs --> 'FUN' Fun + action 'PLUS' (noprec): reduce FunDecs --> 'FUN' Fun + action 'MINUS' (noprec): reduce FunDecs --> 'FUN' Fun + action 'LESS' (noprec): reduce FunDecs --> 'FUN' Fun + action 'INT' (noprec): reduce FunDecs --> 'FUN' Fun + action 'CHAR' (noprec): reduce FunDecs --> 'FUN' Fun + action 'BOOL' (noprec): reduce FunDecs --> 'FUN' Fun + action 'IF' (noprec): reduce FunDecs --> 'FUN' Fun + action 'THEN' (noprec): reduce FunDecs --> 'FUN' Fun + action 'ELSE' (noprec): reduce FunDecs --> 'FUN' Fun + action 'LET' (noprec): reduce FunDecs --> 'FUN' Fun + action 'IN' (noprec): reduce FunDecs --> 'FUN' Fun + action 'EOF' (noprec): reduce FunDecs --> 'FUN' Fun + action 'ID' (noprec): reduce FunDecs --> 'FUN' Fun + action 'STRINGLIT' (noprec): reduce FunDecs --> 'FUN' Fun + action 'CHARLIT' (noprec): reduce FunDecs --> 'FUN' Fun + action 'NUM' (noprec): reduce FunDecs --> 'FUN' Fun + action 'error' (noprec): reduce FunDecs --> 'FUN' Fun + action '#' (noprec): reduce FunDecs --> 'FUN' Fun + action '$$' (noprec): reduce FunDecs --> 'FUN' Fun + immediate action: gotos: goto FunDecs: 6 +state 6: items: FunDecs -> 'FUN' Fun FunDecs . + actions: action 'LPAR' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'RPAR' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'LBRACKET' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'RBRACKET' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'LCURLY' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'RCURLY' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'FUN' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'FN' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'COMMA' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'SEMICOLON' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'READ' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'WRITE' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'DEQ' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'LTH' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'EQ' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'OP' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'MAP' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'REDUCE' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'IOTA' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'ARROW' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'PLUS' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'MINUS' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'LESS' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'INT' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'CHAR' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'BOOL' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'IF' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'THEN' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'ELSE' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'LET' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'IN' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'EOF' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'ID' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'STRINGLIT' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'CHARLIT' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'NUM' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action 'error' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action '#' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + action '$$' (noprec): reduce FunDecs --> 'FUN' Fun FunDecs + immediate action: reduce FunDecs --> 'FUN' Fun FunDecs gotos:state 7: items: Fun -> Type . 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + Fun -> Type . 'ID' 'LPAR' 'RPAR' 'EQ' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 8 + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 8: items: Fun -> Type 'ID' . 'LPAR' Params 'RPAR' 'EQ' Exp + Fun -> Type 'ID' . 'LPAR' 'RPAR' 'EQ' Exp + actions: action 'LPAR' (noprec): shift 9 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 9: items: Fun -> Type 'ID' 'LPAR' . Params 'RPAR' 'EQ' Exp + Fun -> Type 'ID' 'LPAR' . 'RPAR' 'EQ' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 14 + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Type: 23 + goto Params: 10 +state 10: items: Fun -> Type 'ID' 'LPAR' Params . 'RPAR' 'EQ' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 11 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 11: items: Fun -> Type 'ID' 'LPAR' Params 'RPAR' . 'EQ' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): shift 12 + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 12: items: Fun -> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 13 +state 13: items: Fun -> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp . + Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + actions: action 'LPAR' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'RPAR' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'LBRACKET' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'RBRACKET' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'LCURLY' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'RCURLY' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'FUN' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'FN' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'COMMA' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'SEMICOLON' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'READ' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'WRITE' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'OP' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'MAP' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'REDUCE' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'IOTA' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'ARROW' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'INT' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'CHAR' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'BOOL' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'IF' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'THEN' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'ELSE' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'LET' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'IN' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'EOF' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'ID' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'STRINGLIT' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'CHARLIT' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'NUM' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action 'error' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action '#' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + action '$$' (noprec): reduce Fun --> Type 'ID' 'LPAR' Params 'RPAR' 'EQ' Exp + immediate action: gotos:state 14: items: Fun -> Type 'ID' 'LPAR' 'RPAR' . 'EQ' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): shift 15 + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 15: items: Fun -> Type 'ID' 'LPAR' 'RPAR' 'EQ' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 16 +state 16: items: Fun -> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp . + Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + actions: action 'LPAR' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'RPAR' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'LBRACKET' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'RBRACKET' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'LCURLY' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'RCURLY' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'FUN' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'FN' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'COMMA' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'SEMICOLON' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'READ' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'WRITE' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'OP' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'MAP' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'REDUCE' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'IOTA' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'ARROW' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'INT' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'CHAR' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'BOOL' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'IF' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'THEN' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'ELSE' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'LET' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'IN' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'EOF' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'ID' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'STRINGLIT' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'CHARLIT' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'NUM' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action 'error' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action '#' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + action '$$' (noprec): reduce Fun --> Type 'ID' 'LPAR' 'RPAR' 'EQ' Exp + immediate action: gotos:state 17: items: Type -> 'INT' . + actions: action 'LPAR' (noprec): reduce Type --> 'INT' + action 'RPAR' (noprec): reduce Type --> 'INT' + action 'LBRACKET' (noprec): reduce Type --> 'INT' + action 'RBRACKET' (noprec): reduce Type --> 'INT' + action 'LCURLY' (noprec): reduce Type --> 'INT' + action 'RCURLY' (noprec): reduce Type --> 'INT' + action 'FUN' (noprec): reduce Type --> 'INT' + action 'FN' (noprec): reduce Type --> 'INT' + action 'COMMA' (noprec): reduce Type --> 'INT' + action 'SEMICOLON' (noprec): reduce Type --> 'INT' + action 'READ' (noprec): reduce Type --> 'INT' + action 'WRITE' (noprec): reduce Type --> 'INT' + action 'DEQ' (noprec): reduce Type --> 'INT' + action 'LTH' (noprec): reduce Type --> 'INT' + action 'EQ' (noprec): reduce Type --> 'INT' + action 'OP' (noprec): reduce Type --> 'INT' + action 'MAP' (noprec): reduce Type --> 'INT' + action 'REDUCE' (noprec): reduce Type --> 'INT' + action 'IOTA' (noprec): reduce Type --> 'INT' + action 'ARROW' (noprec): reduce Type --> 'INT' + action 'PLUS' (noprec): reduce Type --> 'INT' + action 'MINUS' (noprec): reduce Type --> 'INT' + action 'LESS' (noprec): reduce Type --> 'INT' + action 'INT' (noprec): reduce Type --> 'INT' + action 'CHAR' (noprec): reduce Type --> 'INT' + action 'BOOL' (noprec): reduce Type --> 'INT' + action 'IF' (noprec): reduce Type --> 'INT' + action 'THEN' (noprec): reduce Type --> 'INT' + action 'ELSE' (noprec): reduce Type --> 'INT' + action 'LET' (noprec): reduce Type --> 'INT' + action 'IN' (noprec): reduce Type --> 'INT' + action 'EOF' (noprec): reduce Type --> 'INT' + action 'ID' (noprec): reduce Type --> 'INT' + action 'STRINGLIT' (noprec): reduce Type --> 'INT' + action 'CHARLIT' (noprec): reduce Type --> 'INT' + action 'NUM' (noprec): reduce Type --> 'INT' + action 'error' (noprec): reduce Type --> 'INT' + action '#' (noprec): reduce Type --> 'INT' + action '$$' (noprec): reduce Type --> 'INT' + immediate action: reduce Type --> 'INT' gotos:state 18: items: Type -> 'CHAR' . + actions: action 'LPAR' (noprec): reduce Type --> 'CHAR' + action 'RPAR' (noprec): reduce Type --> 'CHAR' + action 'LBRACKET' (noprec): reduce Type --> 'CHAR' + action 'RBRACKET' (noprec): reduce Type --> 'CHAR' + action 'LCURLY' (noprec): reduce Type --> 'CHAR' + action 'RCURLY' (noprec): reduce Type --> 'CHAR' + action 'FUN' (noprec): reduce Type --> 'CHAR' + action 'FN' (noprec): reduce Type --> 'CHAR' + action 'COMMA' (noprec): reduce Type --> 'CHAR' + action 'SEMICOLON' (noprec): reduce Type --> 'CHAR' + action 'READ' (noprec): reduce Type --> 'CHAR' + action 'WRITE' (noprec): reduce Type --> 'CHAR' + action 'DEQ' (noprec): reduce Type --> 'CHAR' + action 'LTH' (noprec): reduce Type --> 'CHAR' + action 'EQ' (noprec): reduce Type --> 'CHAR' + action 'OP' (noprec): reduce Type --> 'CHAR' + action 'MAP' (noprec): reduce Type --> 'CHAR' + action 'REDUCE' (noprec): reduce Type --> 'CHAR' + action 'IOTA' (noprec): reduce Type --> 'CHAR' + action 'ARROW' (noprec): reduce Type --> 'CHAR' + action 'PLUS' (noprec): reduce Type --> 'CHAR' + action 'MINUS' (noprec): reduce Type --> 'CHAR' + action 'LESS' (noprec): reduce Type --> 'CHAR' + action 'INT' (noprec): reduce Type --> 'CHAR' + action 'CHAR' (noprec): reduce Type --> 'CHAR' + action 'BOOL' (noprec): reduce Type --> 'CHAR' + action 'IF' (noprec): reduce Type --> 'CHAR' + action 'THEN' (noprec): reduce Type --> 'CHAR' + action 'ELSE' (noprec): reduce Type --> 'CHAR' + action 'LET' (noprec): reduce Type --> 'CHAR' + action 'IN' (noprec): reduce Type --> 'CHAR' + action 'EOF' (noprec): reduce Type --> 'CHAR' + action 'ID' (noprec): reduce Type --> 'CHAR' + action 'STRINGLIT' (noprec): reduce Type --> 'CHAR' + action 'CHARLIT' (noprec): reduce Type --> 'CHAR' + action 'NUM' (noprec): reduce Type --> 'CHAR' + action 'error' (noprec): reduce Type --> 'CHAR' + action '#' (noprec): reduce Type --> 'CHAR' + action '$$' (noprec): reduce Type --> 'CHAR' + immediate action: reduce Type --> 'CHAR' gotos:state 19: items: Type -> 'BOOL' . + actions: action 'LPAR' (noprec): reduce Type --> 'BOOL' + action 'RPAR' (noprec): reduce Type --> 'BOOL' + action 'LBRACKET' (noprec): reduce Type --> 'BOOL' + action 'RBRACKET' (noprec): reduce Type --> 'BOOL' + action 'LCURLY' (noprec): reduce Type --> 'BOOL' + action 'RCURLY' (noprec): reduce Type --> 'BOOL' + action 'FUN' (noprec): reduce Type --> 'BOOL' + action 'FN' (noprec): reduce Type --> 'BOOL' + action 'COMMA' (noprec): reduce Type --> 'BOOL' + action 'SEMICOLON' (noprec): reduce Type --> 'BOOL' + action 'READ' (noprec): reduce Type --> 'BOOL' + action 'WRITE' (noprec): reduce Type --> 'BOOL' + action 'DEQ' (noprec): reduce Type --> 'BOOL' + action 'LTH' (noprec): reduce Type --> 'BOOL' + action 'EQ' (noprec): reduce Type --> 'BOOL' + action 'OP' (noprec): reduce Type --> 'BOOL' + action 'MAP' (noprec): reduce Type --> 'BOOL' + action 'REDUCE' (noprec): reduce Type --> 'BOOL' + action 'IOTA' (noprec): reduce Type --> 'BOOL' + action 'ARROW' (noprec): reduce Type --> 'BOOL' + action 'PLUS' (noprec): reduce Type --> 'BOOL' + action 'MINUS' (noprec): reduce Type --> 'BOOL' + action 'LESS' (noprec): reduce Type --> 'BOOL' + action 'INT' (noprec): reduce Type --> 'BOOL' + action 'CHAR' (noprec): reduce Type --> 'BOOL' + action 'BOOL' (noprec): reduce Type --> 'BOOL' + action 'IF' (noprec): reduce Type --> 'BOOL' + action 'THEN' (noprec): reduce Type --> 'BOOL' + action 'ELSE' (noprec): reduce Type --> 'BOOL' + action 'LET' (noprec): reduce Type --> 'BOOL' + action 'IN' (noprec): reduce Type --> 'BOOL' + action 'EOF' (noprec): reduce Type --> 'BOOL' + action 'ID' (noprec): reduce Type --> 'BOOL' + action 'STRINGLIT' (noprec): reduce Type --> 'BOOL' + action 'CHARLIT' (noprec): reduce Type --> 'BOOL' + action 'NUM' (noprec): reduce Type --> 'BOOL' + action 'error' (noprec): reduce Type --> 'BOOL' + action '#' (noprec): reduce Type --> 'BOOL' + action '$$' (noprec): reduce Type --> 'BOOL' + immediate action: reduce Type --> 'BOOL' gotos:state 20: items: Type -> 'LBRACKET' . Type 'RBRACKET' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Type: 21 +state 21: items: Type -> 'LBRACKET' Type . 'RBRACKET' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): shift 22 + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 22: items: Type -> 'LBRACKET' Type 'RBRACKET' . + actions: action 'LPAR' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'RPAR' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'LBRACKET' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'RBRACKET' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'LCURLY' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'RCURLY' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'FUN' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'FN' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'COMMA' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'SEMICOLON' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'READ' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'WRITE' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'DEQ' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'LTH' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'EQ' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'OP' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'MAP' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'REDUCE' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'IOTA' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'ARROW' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'PLUS' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'MINUS' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'LESS' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'INT' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'CHAR' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'BOOL' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'IF' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'THEN' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'ELSE' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'LET' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'IN' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'EOF' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'ID' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'STRINGLIT' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'CHARLIT' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'NUM' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action 'error' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action '#' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + action '$$' (noprec): reduce Type --> 'LBRACKET' Type 'RBRACKET' + immediate action: reduce Type --> 'LBRACKET' Type 'RBRACKET' gotos:state 23: items: Params -> Type . 'ID' 'COMMA' Params + Params -> Type . 'ID' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 24 + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 24: items: Params -> Type 'ID' . 'COMMA' Params + Params -> Type 'ID' . + actions: action 'LPAR' (noprec): reduce Params --> Type 'ID' + action 'RPAR' (noprec): reduce Params --> Type 'ID' + action 'LBRACKET' (noprec): reduce Params --> Type 'ID' + action 'RBRACKET' (noprec): reduce Params --> Type 'ID' + action 'LCURLY' (noprec): reduce Params --> Type 'ID' + action 'RCURLY' (noprec): reduce Params --> Type 'ID' + action 'FUN' (noprec): reduce Params --> Type 'ID' + action 'FN' (noprec): reduce Params --> Type 'ID' + action 'COMMA' (noprec): shift 25 + action 'SEMICOLON' (noprec): reduce Params --> Type 'ID' + action 'READ' (noprec): reduce Params --> Type 'ID' + action 'WRITE' (noprec): reduce Params --> Type 'ID' + action 'DEQ' (noprec): reduce Params --> Type 'ID' + action 'LTH' (noprec): reduce Params --> Type 'ID' + action 'EQ' (noprec): reduce Params --> Type 'ID' + action 'OP' (noprec): reduce Params --> Type 'ID' + action 'MAP' (noprec): reduce Params --> Type 'ID' + action 'REDUCE' (noprec): reduce Params --> Type 'ID' + action 'IOTA' (noprec): reduce Params --> Type 'ID' + action 'ARROW' (noprec): reduce Params --> Type 'ID' + action 'PLUS' (noprec): reduce Params --> Type 'ID' + action 'MINUS' (noprec): reduce Params --> Type 'ID' + action 'LESS' (noprec): reduce Params --> Type 'ID' + action 'INT' (noprec): reduce Params --> Type 'ID' + action 'CHAR' (noprec): reduce Params --> Type 'ID' + action 'BOOL' (noprec): reduce Params --> Type 'ID' + action 'IF' (noprec): reduce Params --> Type 'ID' + action 'THEN' (noprec): reduce Params --> Type 'ID' + action 'ELSE' (noprec): reduce Params --> Type 'ID' + action 'LET' (noprec): reduce Params --> Type 'ID' + action 'IN' (noprec): reduce Params --> Type 'ID' + action 'EOF' (noprec): reduce Params --> Type 'ID' + action 'ID' (noprec): reduce Params --> Type 'ID' + action 'STRINGLIT' (noprec): reduce Params --> Type 'ID' + action 'CHARLIT' (noprec): reduce Params --> Type 'ID' + action 'NUM' (noprec): reduce Params --> Type 'ID' + action 'error' (noprec): reduce Params --> Type 'ID' + action '#' (noprec): reduce Params --> Type 'ID' + action '$$' (noprec): reduce Params --> Type 'ID' + immediate action: gotos:state 25: items: Params -> Type 'ID' 'COMMA' . Params + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Type: 23 + goto Params: 26 +state 26: items: Params -> Type 'ID' 'COMMA' Params . + actions: action 'LPAR' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'RPAR' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'LBRACKET' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'RBRACKET' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'LCURLY' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'RCURLY' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'FUN' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'FN' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'COMMA' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'SEMICOLON' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'READ' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'WRITE' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'DEQ' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'LTH' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'EQ' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'OP' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'MAP' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'REDUCE' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'IOTA' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'ARROW' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'PLUS' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'MINUS' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'LESS' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'INT' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'CHAR' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'BOOL' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'IF' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'THEN' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'ELSE' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'LET' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'IN' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'EOF' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'ID' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'STRINGLIT' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'CHARLIT' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'NUM' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action 'error' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action '#' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + action '$$' (noprec): reduce Params --> Type 'ID' 'COMMA' Params + immediate action: reduce Params --> Type 'ID' 'COMMA' Params gotos:state 27: items: BinOp -> 'PLUS' . + actions: action 'LPAR' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'RPAR' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'LBRACKET' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'RBRACKET' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'LCURLY' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'RCURLY' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'FUN' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'FN' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'COMMA' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'SEMICOLON' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'READ' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'WRITE' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'DEQ' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'LTH' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'EQ' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'OP' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'MAP' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'REDUCE' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'IOTA' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'ARROW' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'PLUS' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'MINUS' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'LESS' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'INT' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'CHAR' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'BOOL' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'IF' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'THEN' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'ELSE' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'LET' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'IN' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'EOF' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'ID' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'STRINGLIT' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'CHARLIT' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'NUM' (explicit left 9999): reduce BinOp --> 'PLUS' + action 'error' (explicit left 9999): reduce BinOp --> 'PLUS' + action '#' (explicit left 9999): reduce BinOp --> 'PLUS' + action '$$' (explicit left 9999): reduce BinOp --> 'PLUS' + immediate action: reduce BinOp --> 'PLUS' gotos:state 28: items: Exp -> 'NUM' . + actions: action 'LPAR' (noprec): reduce Exp --> 'NUM' + action 'RPAR' (noprec): reduce Exp --> 'NUM' + action 'LBRACKET' (noprec): reduce Exp --> 'NUM' + action 'RBRACKET' (noprec): reduce Exp --> 'NUM' + action 'LCURLY' (noprec): reduce Exp --> 'NUM' + action 'RCURLY' (noprec): reduce Exp --> 'NUM' + action 'FUN' (noprec): reduce Exp --> 'NUM' + action 'FN' (noprec): reduce Exp --> 'NUM' + action 'COMMA' (noprec): reduce Exp --> 'NUM' + action 'SEMICOLON' (noprec): reduce Exp --> 'NUM' + action 'READ' (noprec): reduce Exp --> 'NUM' + action 'WRITE' (noprec): reduce Exp --> 'NUM' + action 'DEQ' (noprec): reduce Exp --> 'NUM' + action 'LTH' (noprec): reduce Exp --> 'NUM' + action 'EQ' (noprec): reduce Exp --> 'NUM' + action 'OP' (noprec): reduce Exp --> 'NUM' + action 'MAP' (noprec): reduce Exp --> 'NUM' + action 'REDUCE' (noprec): reduce Exp --> 'NUM' + action 'IOTA' (noprec): reduce Exp --> 'NUM' + action 'ARROW' (noprec): reduce Exp --> 'NUM' + action 'PLUS' (noprec): reduce Exp --> 'NUM' + action 'MINUS' (noprec): reduce Exp --> 'NUM' + action 'LESS' (noprec): reduce Exp --> 'NUM' + action 'INT' (noprec): reduce Exp --> 'NUM' + action 'CHAR' (noprec): reduce Exp --> 'NUM' + action 'BOOL' (noprec): reduce Exp --> 'NUM' + action 'IF' (noprec): reduce Exp --> 'NUM' + action 'THEN' (noprec): reduce Exp --> 'NUM' + action 'ELSE' (noprec): reduce Exp --> 'NUM' + action 'LET' (noprec): reduce Exp --> 'NUM' + action 'IN' (noprec): reduce Exp --> 'NUM' + action 'EOF' (noprec): reduce Exp --> 'NUM' + action 'ID' (noprec): reduce Exp --> 'NUM' + action 'STRINGLIT' (noprec): reduce Exp --> 'NUM' + action 'CHARLIT' (noprec): reduce Exp --> 'NUM' + action 'NUM' (noprec): reduce Exp --> 'NUM' + action 'error' (noprec): reduce Exp --> 'NUM' + action '#' (noprec): reduce Exp --> 'NUM' + action '$$' (noprec): reduce Exp --> 'NUM' + immediate action: reduce Exp --> 'NUM' gotos:state 29: items: Exp -> 'CHARLIT' . + actions: action 'LPAR' (noprec): reduce Exp --> 'CHARLIT' + action 'RPAR' (noprec): reduce Exp --> 'CHARLIT' + action 'LBRACKET' (noprec): reduce Exp --> 'CHARLIT' + action 'RBRACKET' (noprec): reduce Exp --> 'CHARLIT' + action 'LCURLY' (noprec): reduce Exp --> 'CHARLIT' + action 'RCURLY' (noprec): reduce Exp --> 'CHARLIT' + action 'FUN' (noprec): reduce Exp --> 'CHARLIT' + action 'FN' (noprec): reduce Exp --> 'CHARLIT' + action 'COMMA' (noprec): reduce Exp --> 'CHARLIT' + action 'SEMICOLON' (noprec): reduce Exp --> 'CHARLIT' + action 'READ' (noprec): reduce Exp --> 'CHARLIT' + action 'WRITE' (noprec): reduce Exp --> 'CHARLIT' + action 'DEQ' (noprec): reduce Exp --> 'CHARLIT' + action 'LTH' (noprec): reduce Exp --> 'CHARLIT' + action 'EQ' (noprec): reduce Exp --> 'CHARLIT' + action 'OP' (noprec): reduce Exp --> 'CHARLIT' + action 'MAP' (noprec): reduce Exp --> 'CHARLIT' + action 'REDUCE' (noprec): reduce Exp --> 'CHARLIT' + action 'IOTA' (noprec): reduce Exp --> 'CHARLIT' + action 'ARROW' (noprec): reduce Exp --> 'CHARLIT' + action 'PLUS' (noprec): reduce Exp --> 'CHARLIT' + action 'MINUS' (noprec): reduce Exp --> 'CHARLIT' + action 'LESS' (noprec): reduce Exp --> 'CHARLIT' + action 'INT' (noprec): reduce Exp --> 'CHARLIT' + action 'CHAR' (noprec): reduce Exp --> 'CHARLIT' + action 'BOOL' (noprec): reduce Exp --> 'CHARLIT' + action 'IF' (noprec): reduce Exp --> 'CHARLIT' + action 'THEN' (noprec): reduce Exp --> 'CHARLIT' + action 'ELSE' (noprec): reduce Exp --> 'CHARLIT' + action 'LET' (noprec): reduce Exp --> 'CHARLIT' + action 'IN' (noprec): reduce Exp --> 'CHARLIT' + action 'EOF' (noprec): reduce Exp --> 'CHARLIT' + action 'ID' (noprec): reduce Exp --> 'CHARLIT' + action 'STRINGLIT' (noprec): reduce Exp --> 'CHARLIT' + action 'CHARLIT' (noprec): reduce Exp --> 'CHARLIT' + action 'NUM' (noprec): reduce Exp --> 'CHARLIT' + action 'error' (noprec): reduce Exp --> 'CHARLIT' + action '#' (noprec): reduce Exp --> 'CHARLIT' + action '$$' (noprec): reduce Exp --> 'CHARLIT' + immediate action: reduce Exp --> 'CHARLIT' gotos:state 30: items: Exp -> 'ID' . + Exp -> 'ID' . 'LPAR' Exps 'RPAR' + Exp -> 'ID' . 'LPAR' 'RPAR' + Exp -> 'ID' . 'LBRACKET' Exp 'RBRACKET' + actions: action 'LPAR' (noprec): shift 63 + action 'RPAR' (noprec): reduce Exp --> 'ID' + action 'LBRACKET' (noprec): shift 99 + action 'RBRACKET' (noprec): reduce Exp --> 'ID' + action 'LCURLY' (noprec): reduce Exp --> 'ID' + action 'RCURLY' (noprec): reduce Exp --> 'ID' + action 'FUN' (noprec): reduce Exp --> 'ID' + action 'FN' (noprec): reduce Exp --> 'ID' + action 'COMMA' (noprec): reduce Exp --> 'ID' + action 'SEMICOLON' (noprec): reduce Exp --> 'ID' + action 'READ' (noprec): reduce Exp --> 'ID' + action 'WRITE' (noprec): reduce Exp --> 'ID' + action 'DEQ' (noprec): reduce Exp --> 'ID' + action 'LTH' (noprec): reduce Exp --> 'ID' + action 'EQ' (noprec): reduce Exp --> 'ID' + action 'OP' (noprec): reduce Exp --> 'ID' + action 'MAP' (noprec): reduce Exp --> 'ID' + action 'REDUCE' (noprec): reduce Exp --> 'ID' + action 'IOTA' (noprec): reduce Exp --> 'ID' + action 'ARROW' (noprec): reduce Exp --> 'ID' + action 'PLUS' (noprec): reduce Exp --> 'ID' + action 'MINUS' (noprec): reduce Exp --> 'ID' + action 'LESS' (noprec): reduce Exp --> 'ID' + action 'INT' (noprec): reduce Exp --> 'ID' + action 'CHAR' (noprec): reduce Exp --> 'ID' + action 'BOOL' (noprec): reduce Exp --> 'ID' + action 'IF' (noprec): reduce Exp --> 'ID' + action 'THEN' (noprec): reduce Exp --> 'ID' + action 'ELSE' (noprec): reduce Exp --> 'ID' + action 'LET' (noprec): reduce Exp --> 'ID' + action 'IN' (noprec): reduce Exp --> 'ID' + action 'EOF' (noprec): reduce Exp --> 'ID' + action 'ID' (noprec): reduce Exp --> 'ID' + action 'STRINGLIT' (noprec): reduce Exp --> 'ID' + action 'CHARLIT' (noprec): reduce Exp --> 'ID' + action 'NUM' (noprec): reduce Exp --> 'ID' + action 'error' (noprec): reduce Exp --> 'ID' + action '#' (noprec): reduce Exp --> 'ID' + action '$$' (noprec): reduce Exp --> 'ID' + immediate action: gotos:state 31: items: Exp -> 'STRINGLIT' . + actions: action 'LPAR' (noprec): reduce Exp --> 'STRINGLIT' + action 'RPAR' (noprec): reduce Exp --> 'STRINGLIT' + action 'LBRACKET' (noprec): reduce Exp --> 'STRINGLIT' + action 'RBRACKET' (noprec): reduce Exp --> 'STRINGLIT' + action 'LCURLY' (noprec): reduce Exp --> 'STRINGLIT' + action 'RCURLY' (noprec): reduce Exp --> 'STRINGLIT' + action 'FUN' (noprec): reduce Exp --> 'STRINGLIT' + action 'FN' (noprec): reduce Exp --> 'STRINGLIT' + action 'COMMA' (noprec): reduce Exp --> 'STRINGLIT' + action 'SEMICOLON' (noprec): reduce Exp --> 'STRINGLIT' + action 'READ' (noprec): reduce Exp --> 'STRINGLIT' + action 'WRITE' (noprec): reduce Exp --> 'STRINGLIT' + action 'DEQ' (noprec): reduce Exp --> 'STRINGLIT' + action 'LTH' (noprec): reduce Exp --> 'STRINGLIT' + action 'EQ' (noprec): reduce Exp --> 'STRINGLIT' + action 'OP' (noprec): reduce Exp --> 'STRINGLIT' + action 'MAP' (noprec): reduce Exp --> 'STRINGLIT' + action 'REDUCE' (noprec): reduce Exp --> 'STRINGLIT' + action 'IOTA' (noprec): reduce Exp --> 'STRINGLIT' + action 'ARROW' (noprec): reduce Exp --> 'STRINGLIT' + action 'PLUS' (noprec): reduce Exp --> 'STRINGLIT' + action 'MINUS' (noprec): reduce Exp --> 'STRINGLIT' + action 'LESS' (noprec): reduce Exp --> 'STRINGLIT' + action 'INT' (noprec): reduce Exp --> 'STRINGLIT' + action 'CHAR' (noprec): reduce Exp --> 'STRINGLIT' + action 'BOOL' (noprec): reduce Exp --> 'STRINGLIT' + action 'IF' (noprec): reduce Exp --> 'STRINGLIT' + action 'THEN' (noprec): reduce Exp --> 'STRINGLIT' + action 'ELSE' (noprec): reduce Exp --> 'STRINGLIT' + action 'LET' (noprec): reduce Exp --> 'STRINGLIT' + action 'IN' (noprec): reduce Exp --> 'STRINGLIT' + action 'EOF' (noprec): reduce Exp --> 'STRINGLIT' + action 'ID' (noprec): reduce Exp --> 'STRINGLIT' + action 'STRINGLIT' (noprec): reduce Exp --> 'STRINGLIT' + action 'CHARLIT' (noprec): reduce Exp --> 'STRINGLIT' + action 'NUM' (noprec): reduce Exp --> 'STRINGLIT' + action 'error' (noprec): reduce Exp --> 'STRINGLIT' + action '#' (noprec): reduce Exp --> 'STRINGLIT' + action '$$' (noprec): reduce Exp --> 'STRINGLIT' + immediate action: reduce Exp --> 'STRINGLIT' gotos:state 32: items: Exp -> 'LCURLY' . Exps 'RCURLY' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 53 + goto Exps: 33 +state 33: items: Exp -> 'LCURLY' Exps . 'RCURLY' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): shift 34 + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 34: items: Exp -> 'LCURLY' Exps 'RCURLY' . + actions: action 'LPAR' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'RPAR' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'LBRACKET' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'RBRACKET' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'LCURLY' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'RCURLY' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'FUN' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'FN' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'COMMA' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'SEMICOLON' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'READ' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'WRITE' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'DEQ' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'LTH' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'EQ' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'OP' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'MAP' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'REDUCE' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'IOTA' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'ARROW' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'PLUS' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'MINUS' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'LESS' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'INT' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'CHAR' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'BOOL' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'IF' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'THEN' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'ELSE' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'LET' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'IN' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'EOF' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'ID' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'STRINGLIT' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'CHARLIT' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'NUM' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action 'error' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action '#' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + action '$$' (noprec): reduce Exp --> 'LCURLY' Exps 'RCURLY' + immediate action: reduce Exp --> 'LCURLY' Exps 'RCURLY' gotos:state 35: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp 'PLUS' Exp . + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + actions: action 'LPAR' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'RPAR' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'LBRACKET' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'RBRACKET' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'LCURLY' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'RCURLY' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'FUN' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'FN' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'COMMA' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'SEMICOLON' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'READ' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'WRITE' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'DEQ' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'LTH' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'EQ' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'OP' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'MAP' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'REDUCE' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'IOTA' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'ARROW' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'PLUS' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'MINUS' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'LESS' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'INT' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'CHAR' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'BOOL' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'IF' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'THEN' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'ELSE' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'LET' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'IN' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'EOF' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'ID' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'STRINGLIT' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'CHARLIT' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'NUM' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action 'error' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action '#' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + action '$$' (explicit left 9999): reduce Exp --> Exp 'PLUS' Exp + immediate action: gotos:state 36: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp 'MINUS' Exp . + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + actions: action 'LPAR' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'RPAR' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'LBRACKET' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'RBRACKET' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'LCURLY' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'RCURLY' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'FUN' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'FN' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'COMMA' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'SEMICOLON' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'READ' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'WRITE' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'DEQ' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'LTH' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'EQ' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'OP' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'MAP' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'REDUCE' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'IOTA' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'ARROW' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'PLUS' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'MINUS' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'LESS' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'INT' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'CHAR' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'BOOL' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'IF' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'THEN' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'ELSE' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'LET' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'IN' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'EOF' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'ID' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'STRINGLIT' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'CHARLIT' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'NUM' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action 'error' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action '#' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + action '$$' (explicit left 9999): reduce Exp --> Exp 'MINUS' Exp + immediate action: gotos:state 37: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp 'DEQ' Exp . + Exp -> Exp . 'LTH' Exp + actions: action 'LPAR' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'RPAR' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'LBRACKET' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'RBRACKET' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'LCURLY' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'RCURLY' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'FUN' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'FN' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'COMMA' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'SEMICOLON' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'READ' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'WRITE' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'DEQ' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'LTH' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'EQ' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'OP' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'MAP' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'REDUCE' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'IOTA' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'ARROW' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'INT' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'CHAR' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'BOOL' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'IF' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'THEN' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'ELSE' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'LET' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'IN' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'EOF' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'ID' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'STRINGLIT' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'CHARLIT' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'NUM' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action 'error' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action '#' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + action '$$' (explicit left 9998): reduce Exp --> Exp 'DEQ' Exp + immediate action: gotos:state 38: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> Exp 'LTH' Exp . + actions: action 'LPAR' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'RPAR' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'LBRACKET' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'RBRACKET' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'LCURLY' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'RCURLY' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'FUN' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'FN' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'COMMA' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'SEMICOLON' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'READ' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'WRITE' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'DEQ' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'LTH' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'EQ' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'OP' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'MAP' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'REDUCE' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'IOTA' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'ARROW' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'INT' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'CHAR' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'BOOL' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'IF' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'THEN' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'ELSE' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'LET' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'IN' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'EOF' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'ID' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'STRINGLIT' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'CHARLIT' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'NUM' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action 'error' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action '#' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + action '$$' (explicit left 9998): reduce Exp --> Exp 'LTH' Exp + immediate action: gotos:state 39: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'IF' Exp . 'THEN' Exp 'ELSE' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): shift 61 + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 40: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'IF' Exp 'THEN' Exp . 'ELSE' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): shift 62 + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 41: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'IF' Exp 'THEN' Exp 'ELSE' Exp . + actions: action 'LPAR' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'RPAR' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'LBRACKET' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'RBRACKET' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'LCURLY' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'RCURLY' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'FUN' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'FN' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'COMMA' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'SEMICOLON' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'READ' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'WRITE' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'OP' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'MAP' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'REDUCE' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'IOTA' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'ARROW' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'INT' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'CHAR' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'BOOL' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'IF' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'THEN' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'ELSE' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'LET' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'IN' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'EOF' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'ID' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'STRINGLIT' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'CHARLIT' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'NUM' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action 'error' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action '#' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + action '$$' (explicit nonassoc 9997): reduce Exp --> 'IF' Exp 'THEN' Exp 'ELSE' Exp + immediate action: gotos:state 42: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'WRITE' 'LPAR' Exp . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 73 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 43: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'IOTA' 'LPAR' Exp . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 76 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 44: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'MAP' 'LPAR' FunArg 'COMMA' Exp . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 81 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 45: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp . 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): shift 86 + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 46: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 87 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 47: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp . 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): shift 91 + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 48: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 92 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 49: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'LPAR' Exp . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 94 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 50: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'LET' 'ID' 'EQ' Exp . 'IN' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): shift 98 + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 51: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'LET' 'ID' 'EQ' Exp 'IN' Exp . + actions: action 'LPAR' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'RPAR' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'LBRACKET' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'RBRACKET' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'LCURLY' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'RCURLY' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'FUN' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'FN' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'COMMA' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'SEMICOLON' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'READ' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'WRITE' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'OP' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'MAP' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'REDUCE' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'IOTA' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'ARROW' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'INT' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'CHAR' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'BOOL' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'IF' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'THEN' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'ELSE' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'LET' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'IN' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'EOF' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'ID' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'STRINGLIT' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'CHARLIT' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'NUM' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action 'error' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action '#' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + action '$$' (explicit nonassoc 9997): reduce Exp --> 'LET' 'ID' 'EQ' Exp 'IN' Exp + immediate action: gotos:state 52: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exp -> 'ID' 'LBRACKET' Exp . 'RBRACKET' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): shift 100 + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 53: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + Exps -> Exp . 'COMMA' Exps + Exps -> Exp . + actions: action 'LPAR' (noprec): reduce Exps --> Exp + action 'RPAR' (noprec): reduce Exps --> Exp + action 'LBRACKET' (noprec): reduce Exps --> Exp + action 'RBRACKET' (noprec): reduce Exps --> Exp + action 'LCURLY' (noprec): reduce Exps --> Exp + action 'RCURLY' (noprec): reduce Exps --> Exp + action 'FUN' (noprec): reduce Exps --> Exp + action 'FN' (noprec): reduce Exps --> Exp + action 'COMMA' (noprec): shift 101 + action 'SEMICOLON' (noprec): reduce Exps --> Exp + action 'READ' (noprec): reduce Exps --> Exp + action 'WRITE' (noprec): reduce Exps --> Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): reduce Exps --> Exp + action 'OP' (noprec): reduce Exps --> Exp + action 'MAP' (noprec): reduce Exps --> Exp + action 'REDUCE' (noprec): reduce Exps --> Exp + action 'IOTA' (noprec): reduce Exps --> Exp + action 'ARROW' (noprec): reduce Exps --> Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): reduce Exps --> Exp + action 'INT' (noprec): reduce Exps --> Exp + action 'CHAR' (noprec): reduce Exps --> Exp + action 'BOOL' (noprec): reduce Exps --> Exp + action 'IF' (noprec): reduce Exps --> Exp + action 'THEN' (noprec): reduce Exps --> Exp + action 'ELSE' (noprec): reduce Exps --> Exp + action 'LET' (noprec): reduce Exps --> Exp + action 'IN' (noprec): reduce Exps --> Exp + action 'EOF' (noprec): reduce Exps --> Exp + action 'ID' (noprec): reduce Exps --> Exp + action 'STRINGLIT' (noprec): reduce Exps --> Exp + action 'CHARLIT' (noprec): reduce Exps --> Exp + action 'NUM' (noprec): reduce Exps --> Exp + action 'error' (noprec): reduce Exps --> Exp + action '#' (noprec): reduce Exps --> Exp + action '$$' (noprec): reduce Exps --> Exp + immediate action: gotos:state 54: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + FunArg -> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp . + actions: action 'LPAR' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'RPAR' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'LBRACKET' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'RBRACKET' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'LCURLY' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'RCURLY' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'FUN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'FN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'COMMA' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'SEMICOLON' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'READ' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'WRITE' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'OP' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'MAP' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'REDUCE' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'IOTA' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'ARROW' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'INT' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'CHAR' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'BOOL' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'IF' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'THEN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'ELSE' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'LET' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'IN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'EOF' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'ID' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'STRINGLIT' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'CHARLIT' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'NUM' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action 'error' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action '#' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + action '$$' (noprec): reduce FunArg --> 'FN' Type 'LPAR' 'RPAR' 'ARROW' Exp + immediate action: gotos:state 55: items: Exp -> Exp . 'PLUS' Exp + Exp -> Exp . 'MINUS' Exp + Exp -> Exp . 'DEQ' Exp + Exp -> Exp . 'LTH' Exp + FunArg -> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp . + actions: action 'LPAR' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'RPAR' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'LBRACKET' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'RBRACKET' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'LCURLY' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'RCURLY' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'FUN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'FN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'COMMA' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'SEMICOLON' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'READ' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'WRITE' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'DEQ' (explicit left 9998): shift 58 + action 'LTH' (explicit left 9998): shift 59 + action 'EQ' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'OP' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'MAP' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'REDUCE' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'IOTA' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'ARROW' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'PLUS' (explicit left 9999): shift 56 + action 'MINUS' (explicit left 9999): shift 57 + action 'LESS' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'INT' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'CHAR' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'BOOL' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'IF' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'THEN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'ELSE' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'LET' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'IN' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'EOF' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'ID' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'STRINGLIT' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'CHARLIT' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'NUM' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action 'error' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action '#' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + action '$$' (noprec): reduce FunArg --> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' Exp + immediate action: gotos:state 56: items: Exp -> Exp 'PLUS' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 35 +state 57: items: Exp -> Exp 'MINUS' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 36 +state 58: items: Exp -> Exp 'DEQ' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 37 +state 59: items: Exp -> Exp 'LTH' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 38 +state 60: items: Exp -> 'IF' . Exp 'THEN' Exp 'ELSE' Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 39 +state 61: items: Exp -> 'IF' Exp 'THEN' . Exp 'ELSE' Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 40 +state 62: items: Exp -> 'IF' Exp 'THEN' Exp 'ELSE' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 41 +state 63: items: Exp -> 'ID' 'LPAR' . Exps 'RPAR' + Exp -> 'ID' 'LPAR' . 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): shift 66 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 53 + goto Exps: 64 +state 64: items: Exp -> 'ID' 'LPAR' Exps . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 65 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 65: items: Exp -> 'ID' 'LPAR' Exps 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'FN' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'READ' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'OP' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'INT' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'IF' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'LET' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'IN' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'ID' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action 'error' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action '#' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + action '$$' (noprec): reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' + immediate action: reduce Exp --> 'ID' 'LPAR' Exps 'RPAR' gotos:state 66: items: Exp -> 'ID' 'LPAR' 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'FN' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'READ' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'OP' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'INT' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'IF' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'LET' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'IN' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'ID' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action 'error' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action '#' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + action '$$' (noprec): reduce Exp --> 'ID' 'LPAR' 'RPAR' + immediate action: reduce Exp --> 'ID' 'LPAR' 'RPAR' gotos:state 67: items: Exp -> 'READ' . 'LPAR' Type 'RPAR' + actions: action 'LPAR' (noprec): shift 68 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 68: items: Exp -> 'READ' 'LPAR' . Type 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Type: 69 +state 69: items: Exp -> 'READ' 'LPAR' Type . 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 70 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 70: items: Exp -> 'READ' 'LPAR' Type 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'FN' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'READ' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'OP' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'INT' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'IF' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'LET' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'IN' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'ID' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action 'error' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action '#' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + action '$$' (noprec): reduce Exp --> 'READ' 'LPAR' Type 'RPAR' + immediate action: reduce Exp --> 'READ' 'LPAR' Type 'RPAR' gotos:state 71: items: Exp -> 'WRITE' . 'LPAR' Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 72 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 72: items: Exp -> 'WRITE' 'LPAR' . Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 42 +state 73: items: Exp -> 'WRITE' 'LPAR' Exp 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'FN' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'READ' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'OP' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'INT' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'IF' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'LET' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'IN' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'ID' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action 'error' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action '#' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + action '$$' (noprec): reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' + immediate action: reduce Exp --> 'WRITE' 'LPAR' Exp 'RPAR' gotos:state 74: items: Exp -> 'IOTA' . 'LPAR' Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 75 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 75: items: Exp -> 'IOTA' 'LPAR' . Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 43 +state 76: items: Exp -> 'IOTA' 'LPAR' Exp 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'FN' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'READ' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'OP' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'INT' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'IF' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'LET' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'IN' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'ID' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action 'error' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action '#' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + action '$$' (noprec): reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' + immediate action: reduce Exp --> 'IOTA' 'LPAR' Exp 'RPAR' gotos:state 77: items: Exp -> 'MAP' . 'LPAR' FunArg 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 78 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 78: items: Exp -> 'MAP' 'LPAR' . FunArg 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): shift 104 + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 103 + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto FunArg: 79 +state 79: items: Exp -> 'MAP' 'LPAR' FunArg . 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): shift 80 + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 80: items: Exp -> 'MAP' 'LPAR' FunArg 'COMMA' . Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 44 +state 81: items: Exp -> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'FN' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'READ' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'OP' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'INT' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'IF' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'LET' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'IN' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'ID' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action 'error' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action '#' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + action '$$' (noprec): reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' + immediate action: reduce Exp --> 'MAP' 'LPAR' FunArg 'COMMA' Exp 'RPAR' gotos:state 82: items: Exp -> 'REDUCE' . 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + Exp -> 'REDUCE' . 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 83 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 83: items: Exp -> 'REDUCE' 'LPAR' . FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + Exp -> 'REDUCE' 'LPAR' . 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): shift 104 + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): shift 88 + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 103 + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto FunArg: 84 +state 84: items: Exp -> 'REDUCE' 'LPAR' FunArg . 'COMMA' Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): shift 85 + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 85: items: Exp -> 'REDUCE' 'LPAR' FunArg 'COMMA' . Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 45 +state 86: items: Exp -> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' . Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 46 +state 87: items: Exp -> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'FN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'READ' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'OP' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'INT' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'IF' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LET' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'IN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'ID' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'error' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action '#' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + action '$$' (noprec): reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' + immediate action: reduce Exp --> 'REDUCE' 'LPAR' FunArg 'COMMA' Exp 'COMMA' Exp 'RPAR' gotos:state 88: items: Exp -> 'REDUCE' 'LPAR' 'OP' . BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (explicit left 9999): shift 27 + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto BinOp: 89 +state 89: items: Exp -> 'REDUCE' 'LPAR' 'OP' BinOp . 'COMMA' Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): shift 90 + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 90: items: Exp -> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' . Exp 'COMMA' Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 47 +state 91: items: Exp -> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' . Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 48 +state 92: items: Exp -> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'FN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'READ' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'OP' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'INT' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'IF' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'LET' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'IN' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'ID' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action 'error' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action '#' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + action '$$' (noprec): reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' + immediate action: reduce Exp --> 'REDUCE' 'LPAR' 'OP' BinOp 'COMMA' Exp 'COMMA' Exp 'RPAR' gotos:state 93: items: Exp -> 'LPAR' . Exp 'RPAR' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 49 +state 94: items: Exp -> 'LPAR' Exp 'RPAR' . + actions: action 'LPAR' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'RPAR' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'LBRACKET' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'RBRACKET' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'LCURLY' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'RCURLY' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'FUN' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'FN' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'COMMA' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'SEMICOLON' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'READ' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'WRITE' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'DEQ' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'LTH' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'EQ' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'OP' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'MAP' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'REDUCE' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'IOTA' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'ARROW' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'PLUS' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'MINUS' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'LESS' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'INT' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'CHAR' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'BOOL' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'IF' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'THEN' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'ELSE' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'LET' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'IN' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'EOF' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'ID' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'STRINGLIT' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'CHARLIT' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'NUM' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action 'error' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action '#' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + action '$$' (noprec): reduce Exp --> 'LPAR' Exp 'RPAR' + immediate action: reduce Exp --> 'LPAR' Exp 'RPAR' gotos:state 95: items: Exp -> 'LET' . 'ID' 'EQ' Exp 'IN' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 96 + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 96: items: Exp -> 'LET' 'ID' . 'EQ' Exp 'IN' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): shift 97 + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 97: items: Exp -> 'LET' 'ID' 'EQ' . Exp 'IN' Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 50 +state 98: items: Exp -> 'LET' 'ID' 'EQ' Exp 'IN' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 51 +state 99: items: Exp -> 'ID' 'LBRACKET' . Exp 'RBRACKET' + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 52 +state 100: items: Exp -> 'ID' 'LBRACKET' Exp 'RBRACKET' . + actions: action 'LPAR' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'RPAR' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'LBRACKET' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'RBRACKET' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'LCURLY' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'RCURLY' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'FUN' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'FN' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'COMMA' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'SEMICOLON' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'READ' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'WRITE' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'DEQ' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'LTH' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'EQ' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'OP' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'MAP' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'REDUCE' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'IOTA' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'ARROW' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'PLUS' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'MINUS' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'LESS' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'INT' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'CHAR' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'BOOL' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'IF' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'THEN' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'ELSE' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'LET' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'IN' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'EOF' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'ID' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'STRINGLIT' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'CHARLIT' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'NUM' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action 'error' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action '#' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + action '$$' (noprec): reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' + immediate action: reduce Exp --> 'ID' 'LBRACKET' Exp 'RBRACKET' gotos:state 101: items: Exps -> Exp 'COMMA' . Exps + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 53 + goto Exps: 102 +state 102: items: Exps -> Exp 'COMMA' Exps . + actions: action 'LPAR' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'RPAR' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'LBRACKET' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'RBRACKET' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'LCURLY' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'RCURLY' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'FUN' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'FN' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'COMMA' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'SEMICOLON' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'READ' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'WRITE' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'DEQ' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'LTH' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'EQ' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'OP' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'MAP' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'REDUCE' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'IOTA' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'ARROW' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'PLUS' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'MINUS' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'LESS' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'INT' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'CHAR' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'BOOL' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'IF' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'THEN' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'ELSE' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'LET' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'IN' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'EOF' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'ID' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'STRINGLIT' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'CHARLIT' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'NUM' (noprec): reduce Exps --> Exp 'COMMA' Exps + action 'error' (noprec): reduce Exps --> Exp 'COMMA' Exps + action '#' (noprec): reduce Exps --> Exp 'COMMA' Exps + action '$$' (noprec): reduce Exps --> Exp 'COMMA' Exps + immediate action: reduce Exps --> Exp 'COMMA' Exps gotos:state 103: items: FunArg -> 'ID' . + actions: action 'LPAR' (noprec): reduce FunArg --> 'ID' + action 'RPAR' (noprec): reduce FunArg --> 'ID' + action 'LBRACKET' (noprec): reduce FunArg --> 'ID' + action 'RBRACKET' (noprec): reduce FunArg --> 'ID' + action 'LCURLY' (noprec): reduce FunArg --> 'ID' + action 'RCURLY' (noprec): reduce FunArg --> 'ID' + action 'FUN' (noprec): reduce FunArg --> 'ID' + action 'FN' (noprec): reduce FunArg --> 'ID' + action 'COMMA' (noprec): reduce FunArg --> 'ID' + action 'SEMICOLON' (noprec): reduce FunArg --> 'ID' + action 'READ' (noprec): reduce FunArg --> 'ID' + action 'WRITE' (noprec): reduce FunArg --> 'ID' + action 'DEQ' (noprec): reduce FunArg --> 'ID' + action 'LTH' (noprec): reduce FunArg --> 'ID' + action 'EQ' (noprec): reduce FunArg --> 'ID' + action 'OP' (noprec): reduce FunArg --> 'ID' + action 'MAP' (noprec): reduce FunArg --> 'ID' + action 'REDUCE' (noprec): reduce FunArg --> 'ID' + action 'IOTA' (noprec): reduce FunArg --> 'ID' + action 'ARROW' (noprec): reduce FunArg --> 'ID' + action 'PLUS' (noprec): reduce FunArg --> 'ID' + action 'MINUS' (noprec): reduce FunArg --> 'ID' + action 'LESS' (noprec): reduce FunArg --> 'ID' + action 'INT' (noprec): reduce FunArg --> 'ID' + action 'CHAR' (noprec): reduce FunArg --> 'ID' + action 'BOOL' (noprec): reduce FunArg --> 'ID' + action 'IF' (noprec): reduce FunArg --> 'ID' + action 'THEN' (noprec): reduce FunArg --> 'ID' + action 'ELSE' (noprec): reduce FunArg --> 'ID' + action 'LET' (noprec): reduce FunArg --> 'ID' + action 'IN' (noprec): reduce FunArg --> 'ID' + action 'EOF' (noprec): reduce FunArg --> 'ID' + action 'ID' (noprec): reduce FunArg --> 'ID' + action 'STRINGLIT' (noprec): reduce FunArg --> 'ID' + action 'CHARLIT' (noprec): reduce FunArg --> 'ID' + action 'NUM' (noprec): reduce FunArg --> 'ID' + action 'error' (noprec): reduce FunArg --> 'ID' + action '#' (noprec): reduce FunArg --> 'ID' + action '$$' (noprec): reduce FunArg --> 'ID' + immediate action: reduce FunArg --> 'ID' gotos:state 104: items: FunArg -> 'FN' . Type 'LPAR' 'RPAR' 'ARROW' Exp + FunArg -> 'FN' . Type 'LPAR' Params 'RPAR' 'ARROW' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Type: 105 +state 105: items: FunArg -> 'FN' Type . 'LPAR' 'RPAR' 'ARROW' Exp + FunArg -> 'FN' Type . 'LPAR' Params 'RPAR' 'ARROW' Exp + actions: action 'LPAR' (noprec): shift 106 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 106: items: FunArg -> 'FN' Type 'LPAR' . 'RPAR' 'ARROW' Exp + FunArg -> 'FN' Type 'LPAR' . Params 'RPAR' 'ARROW' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 107 + action 'LBRACKET' (noprec): shift 20 + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): shift 17 + action 'CHAR' (noprec): shift 18 + action 'BOOL' (noprec): shift 19 + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Type: 23 + goto Params: 109 +state 107: items: FunArg -> 'FN' Type 'LPAR' 'RPAR' . 'ARROW' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): shift 108 + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 108: items: FunArg -> 'FN' Type 'LPAR' 'RPAR' 'ARROW' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 54 +state 109: items: FunArg -> 'FN' Type 'LPAR' Params . 'RPAR' 'ARROW' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): shift 110 + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 110: items: FunArg -> 'FN' Type 'LPAR' Params 'RPAR' . 'ARROW' Exp + actions: action 'LPAR' (noprec): error + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): error + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): error + action 'WRITE' (noprec): error + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): error + action 'REDUCE' (noprec): error + action 'IOTA' (noprec): error + action 'ARROW' (noprec): shift 111 + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): error + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): error + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): error + action 'STRINGLIT' (noprec): error + action 'CHARLIT' (noprec): error + action 'NUM' (noprec): error + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos:state 111: items: FunArg -> 'FN' Type 'LPAR' Params 'RPAR' 'ARROW' . Exp + actions: action 'LPAR' (noprec): shift 93 + action 'RPAR' (noprec): error + action 'LBRACKET' (noprec): error + action 'RBRACKET' (noprec): error + action 'LCURLY' (noprec): shift 32 + action 'RCURLY' (noprec): error + action 'FUN' (noprec): error + action 'FN' (noprec): error + action 'COMMA' (noprec): error + action 'SEMICOLON' (noprec): error + action 'READ' (noprec): shift 67 + action 'WRITE' (noprec): shift 71 + action 'DEQ' (noprec): error + action 'LTH' (noprec): error + action 'EQ' (noprec): error + action 'OP' (noprec): error + action 'MAP' (noprec): shift 77 + action 'REDUCE' (noprec): shift 82 + action 'IOTA' (noprec): shift 74 + action 'ARROW' (noprec): error + action 'PLUS' (noprec): error + action 'MINUS' (noprec): error + action 'LESS' (noprec): error + action 'INT' (noprec): error + action 'CHAR' (noprec): error + action 'BOOL' (noprec): error + action 'IF' (noprec): shift 60 + action 'THEN' (noprec): error + action 'ELSE' (noprec): error + action 'LET' (noprec): shift 95 + action 'IN' (noprec): error + action 'EOF' (noprec): error + action 'ID' (noprec): shift 30 + action 'STRINGLIT' (noprec): shift 31 + action 'CHARLIT' (noprec): shift 29 + action 'NUM' (noprec): shift 28 + action 'error' (noprec): error + action '#' (noprec): error + action '$$' (noprec): error + immediate action: gotos: goto Exp: 55 + +startStates = 0 +------------------------ diff --git a/W1/fasto/Fasto/RegAlloc.fs b/W1/fasto/Fasto/RegAlloc.fs new file mode 100644 index 0000000..df2eb43 --- /dev/null +++ b/W1/fasto/Fasto/RegAlloc.fs @@ -0,0 +1,493 @@ +(* A register allocator for MIPS. *) + +module RegAlloc + +(* registerAlloc takes a list of MIPS instructions, a set of + registers that are live at the end of the code, three register + numbers: + 1) The lowest allocatable register (typically 2). + 2) The highest caller-saves register. + 3) The highest allocatable register (typically 25). + and the number of already spilled variables. This should be 0 in the initial + call unless some variables are forced to spill before register allocation. + Registers up to (and including) the highest caller-saves + register are assumed to be caller-saves. Those above are assumed to + be callee-saves. + + registerAlloc returns: + a modified instruction list where null moves have been removed, + a set of the variables that are live at entry, + plus a number indicating the highest used register number. + + The latter can be used for deciding which callee-saves registers + need to be saved. + + Limitations: + + - Works for a single procedure body only. + + - Assumes all JALs eventually return to the next instruction and + preserve callee-saves registers when doing so. + + - Does caller-saves preservation only by allocating variables that + are live across procedure calls to callee-saves registers and + variables not live across call preferably to caller-saves. + + - Can only remove null moves if they are implemented by ORI (rx,ry,"0"). + Use the pseudo-instruction MOVE (rx,ry) for this. + +*) + +open Mips + +exception MyError of string + +exception Not_colourable of string + +let spilledVars : Set ref = ref (Set.empty) + +let rec destRegs (lst : Instruction list) : Set = + match lst with + | [] -> Set.empty + | (i::ilist) -> Set.union (destReg i) (destRegs ilist) + + +(* variables and registers that can be overwritten *) +and destReg (i : Instruction) : Set = + match i with + | LA (rt,v) -> Set.singleton rt + | LUI (rt,v) -> Set.singleton rt + | ADD (rd,rs,rt) -> Set.singleton rd + | ADDI (rd,rs,v) -> Set.singleton rd + | SUB (rd,rs,rt) -> Set.singleton rd + | MUL (rd,rs,rt) -> Set.singleton rd + | DIV (rd,rs,rt) -> Set.singleton rd + | AND (rd,rs,rt) -> Set.singleton rd + | ANDI (rd,rs,v) -> Set.singleton rd + | OR (rd,rs,rt) -> Set.singleton rd + | ORI (rd,rs,v) -> Set.singleton rd + | XOR (rd,rs,rt) -> Set.singleton rd + | XORI (rd,rs,v) -> Set.singleton rd + | SLL (rd,rt,v) -> Set.singleton rd + | SRA (rd,rt,v) -> Set.singleton rd + | SLT (rd,rs,rt) -> Set.singleton rd + | SLTI (rd,rs,v) -> Set.singleton rd + | JAL (lab,argRegs) -> Set.add (RN 31) (Set.ofList argRegs) + | LW (rd,rs,v) -> Set.singleton rd + | LB (rd,rs,v) -> Set.singleton rd + | SYSCALL -> Set.singleton (RN 2) (* return value is in $2 *) + | _ -> Set.empty + +(* variables and register that can be read by i *) +let usedRegs (i : Instruction) : Set = + match i with + | ADD (rd,rs,rt) -> Set.ofList [rs;rt] + | ADDI (rd,rs,v) -> Set.singleton rs + | SUB (rd,rs,rt) -> Set.ofList [rs;rt] + | MUL (rd,rs,rt) -> Set.ofList [rs;rt] + | DIV (rd,rs,rt) -> Set.ofList [rs;rt] + | AND (rd,rs,rt) -> Set.ofList [rs;rt] + | ANDI (rd,rs,v) -> Set.singleton rs + | OR (rd,rs,rt) -> Set.ofList [rs;rt] + | ORI (rd,rs,v) -> Set.singleton rs + | XOR (rd,rs,rt) -> Set.ofList [rs;rt] + | XORI (rd,rs,v) -> Set.singleton rs + | SLL (rd,rt,v) -> Set.singleton rt + | SRA (rd,rt,v) -> Set.singleton rt + | SLT (rd,rs,rt) -> Set.ofList [rs;rt] + | SLTI (rd,rs,v) -> Set.singleton rs + | BEQ (rs,rt,v) -> Set.ofList [rs;rt] + | BNE (rs,rt,v) -> Set.ofList [rs;rt] + | BGEZ (rs,v) -> Set.singleton rs + | J lab -> Set.empty + | JAL (lab,argRegs) -> Set.ofList argRegs + (* argRegs are argument registers *) + | JR (r,resRegs) -> Set.ofList (r::resRegs) + (* r is jump register, + resRegs are registers required to be live *) + | LW (rd,rs,v) -> Set.singleton rs + | SW (rd,rs,v) -> Set.ofList [rs;rd] + | LB (rd,rs,v) -> Set.singleton rs + | SB (rd,rs,v) -> Set.ofList [rs;rd] + | SYSCALL -> Set.ofList [RN 2; RN 4; RN 5] + (* $2 is control register and $4, $5 are arguments *) + | _ -> Set.empty + + +let live_step ilist llist liveAtEnd = + let rec scan (is : Instruction list) = + match is with + | [] -> [] + | (i::is) -> + let ls1 = scan is + if List.isEmpty ls1 + then [instruct i liveAtEnd] + else (instruct i (List.head ls1)) :: ls1 + + (* live variables and registers *) + and instruct (i : Instruction) (live : Set) : Set = + match i with + | BEQ (rs,rt,v) -> Set.union (Set.ofList [rs;rt]) (Set.union live (live_at v)) + | BNE (rs,rt,v) -> Set.union (Set.ofList [rs;rt]) (Set.union live (live_at v)) + | BGEZ (rs,v) -> Set.union (Set.singleton rs) (Set.union live (live_at v)) + | J lab -> live_at lab + | JR (r,resRegs) -> Set.ofList (r::resRegs) + (* r is jump register, resRegs are registers required to be live *) + | _ -> Set.union (usedRegs i) (Set.difference live (destReg i)) + + and live_at lab : Set = search ilist llist lab + + and search a1 a2 a3 : Set = + match (a1, a2, a3) with + | ([], [], lab) -> Set.empty + | (LABEL k :: is, l::ls, lab) -> + if k = lab then l else search is ls lab + | (_::is, _::ls, lab) -> search is ls lab + | (a, b, l) -> raise (MyError "should not happen in RegAlloc.live_step.search!") + + let res = scan ilist + res + +let rec iterate_live ilist llist liveAtEnd = + let llist1 = live_step ilist llist liveAtEnd + if llist1 = llist + then llist + else iterate_live ilist llist1 liveAtEnd + +let rec init_list = function + | [] -> [] + | (i::is) -> Set.empty :: init_list is + +(* live_regs finds for each instruction those symbolic register names *) +(* that are live at entry to this instruction *) + +let live_regs ilist liveAtEnd = + iterate_live ilist (init_list ilist) liveAtEnd + +let rec regs lst (rs : Set) : Set = + match lst with + | [] -> rs + | (l :: llist) -> Set.union l (regs llist rs) + +let numerical r = + match r with + | RN _ -> true + | RS _ -> false + +let filterSymbolic rs = Set.filter (fun a -> not (numerical a)) rs + +let rec findRegs llist = filterSymbolic (regs llist Set.empty) + +(* conflicts ilist llist callerSaves r *) +(* finds those variables that interferere with r *) +(* in instructions ilist with live-out specified by llist *) +(* callerSaves are the caller-saves registers *) + +let rec conflicts = function + | ([], [], callerSaves, RN r) -> Set.remove (RN r) callerSaves + (* all numerical interfere with all other caller-saves *) + | ([], [], callerSaves, RS _) -> Set.empty + | (ORI (rd,rs,0) :: ilist, l :: llist, callerSaves, r) -> + if r=rd (* if destination *) + then Set.union (Set.remove rs (Set.remove r l)) (* interfere with live except rs *) + (conflicts (ilist, llist, callerSaves, r)) + else if r=rs (* if source, no interference *) + then conflicts (ilist, llist, callerSaves, r) + else if Set.contains r l (* otherwise, live interfere with rd *) + then Set.add rd (conflicts (ilist, llist, callerSaves, r)) + else conflicts (ilist, llist, callerSaves, r) + | (JAL (f,argRegs) :: ilist, l :: llist, callerSaves, r) -> + if (Set.contains r l) (* live vars interfere with caller-saves regs *) + then Set.union (Set.remove r callerSaves) + (conflicts (ilist, llist, callerSaves, r)) + else if Set.contains r callerSaves + then Set.union (Set.remove r l) + (conflicts (ilist, llist, callerSaves, r)) + else conflicts (ilist, llist, callerSaves, r) + | (i :: ilist, l :: llist, callerSaves, r) -> + if (Set.contains r (destReg i)) (* destination register *) + then Set.union (Set.remove r l) (* conflicts with other live vars *) + (conflicts (ilist, llist, callerSaves, r)) + else if Set.contains r l (* all live vars *) + then Set.union (destReg i) (* conflict with destination *) + (conflicts (ilist, llist, callerSaves, r)) + else conflicts (ilist, llist, callerSaves, r) + | _ -> raise (MyError "conflicts used at undefined instance") + + + +(* Interference graph is represented as a list of registers *) +(* each paired with a list of the registers with which it conflicts *) + +let graph ilist llist callerSaves = + let rs = Set.union callerSaves (findRegs llist) |> Set.toList + List.zip rs (List.map (fun r -> conflicts (ilist, ((List.tail llist)@[Set.empty]), callerSaves, r)) rs) + + + + +(* finds move-related registers *) + +let rec findMoves ilist llist = + let rs = findRegs llist |> Set.toList + List.zip rs (List.map (fun r -> findMoves1 r ilist) rs) + +and findMoves1 r = function + | [] -> Set.empty + | (ORI (rd,rs,0) :: ilist) -> + Set.union ( if rd=r then Set.singleton rs + elif rs=r then Set.singleton rd + else Set.empty) + (findMoves1 r ilist) + | (i::ilist) -> findMoves1 r ilist + + + +(* sorts by number of conflicts, but with numeric registers last *) + +let be4 (a, ac) (b, bc) = + match (a, b) with + | (RN i, RN j) -> i <= j + | (RN _, RS _) -> false + | (RS _, RN _) -> true + | (RS sa, RS sb) -> + match (Set.contains sa (!spilledVars), Set.contains sb (!spilledVars)) with + | (false, false) -> Set.count ac <= Set.count bc + | (true , false) -> false + | (false, true ) -> true + | (true , true ) -> Set.count ac <= Set.count bc + +let rec sortByOrder = function + | [] -> [] + | (g : (reg * Set<'b>) list) -> + let rec split = function + | [] -> ([],[]) + | (a::g) -> + let (l, g1) = ascending a g [] + let (g2,g3) = split g1 + (rev2 l g3, g2) + and ascending a g l = + match g with + | [] -> (a::l,[]) + | (b::g1) -> + if be4 a b + then ascending b g1 (a::l) + else (a::l,g) + and rev2 g l2 = + match g with + | [] -> l2 + | (a::l1) -> rev2 l1 (a::l2) + + let rec merge = function + | ([], l2) -> l2 + | (l1, []) -> l1 + | (a::r1, b::r2) -> + if be4 a b + then a :: merge (r1, b::r2) + else b :: merge (a::r1, r2) + + let (g1,g2) = split g + if List.isEmpty g1 then g2 + elif List.isEmpty g2 then g1 + else merge (sortByOrder g1, sortByOrder g2) + + + +(* n-colour graph using Briggs' algorithm *) + +let rec colourGraph g rmin rmax moveRelated = + select (simplify (sortByOrder g) []) + (mList rmin rmax) moveRelated [] + +and simplify h l = + match h with + | [] -> l + | (r,c) :: g -> + simplify (sortByOrder (removeNode r g)) ((r,c)::l) + +and removeNode r = function + | [] -> [] + | ((r1,c)::g) -> + (r1,Set.remove r c) :: removeNode r g + +and select rcl regs moveRelated sl = + match rcl with + | [] -> sl + | ((r,c)::l) -> + let rnum = + if numerical r then r + else let possible = NotIn c sl regs + let related = lookUp2 r moveRelated + let related2 = Set.map (fun r -> lookUp r sl) related + let mPossible= Set.intersect possible related2 + if Set.isEmpty possible then raise (Not_colourable (ppReg r)) + elif Set.isEmpty mPossible then Set.minElement possible //hd possible + else Set.minElement mPossible //hd mPossible + select l regs moveRelated ((r,rnum)::sl) + +and NotIn rcs sl regs : Set = + Set.fold (fun acc r -> Set.remove (lookUp r sl) acc) regs rcs + +and lookUp r = function + | [] -> RN 0 + | ((r1,n)::sl) -> + if numerical r then r + else if r=r1 then n else lookUp r sl + +and lookUp2 r = function + | [] -> Set.empty + | ((r1,ms)::sl) -> if r=r1 then ms else lookUp2 r sl + +and mList m n : Set = + if m > n then Set.empty + else Set.add (RN m) (mList (m+1) n) + + +let rec filterNullMoves ilist allocs = + match ilist with + | [] -> [] + + | (ORI (rd,rs,0) :: ilist_tl) -> + let rd1 = lookUp rd allocs + let rs1 = lookUp rs allocs + if rd1 = rs1 || rd1 = RN 0 + then COMMENT ("\tori\t"+ ppReg rd+","+ ppReg rs+",0") + :: filterNullMoves ilist_tl allocs + else ORI (rd,rs,0) :: filterNullMoves ilist_tl allocs + + | (i :: ilist_tl) -> + i :: filterNullMoves ilist_tl allocs + +and printList = function + | [] -> "" + | (r :: rs) -> r+" "+ printList rs + +let rec printGraph = function + | [] -> [] + | ((r,rs) :: g) -> + [COMMENT ("interferes: "+r+" with "+printList rs)] + @ printGraph g + +let renameReg allocs inst = + let renTo inst1 = [inst1; COMMENT ("was:" + ppMips inst)] + match inst with + | LA (rt,l) -> + renTo (LA (lookUp rt allocs, l)) + | LUI (rt,v) -> + renTo (LUI (lookUp rt allocs, v)) + | ADD (rd,rs,rt) -> + renTo (ADD (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | ADDI (rd,rs,v) -> + renTo (ADDI (lookUp rd allocs, lookUp rs allocs, v)) + | SUB (rd,rs,rt) -> + renTo (SUB (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | MUL (rd,rs,rt) -> + renTo (MUL (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | DIV (rd,rs,rt) -> + renTo (DIV (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | AND (rd,rs,rt) -> + renTo (AND (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | ANDI (rd,rs,v) -> + renTo (ANDI (lookUp rd allocs, lookUp rs allocs, v)) + | OR (rd,rs,rt) -> + renTo (OR (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | ORI (rd,rs,v) -> + renTo (ORI (lookUp rd allocs, lookUp rs allocs, v)) + | XOR (rd,rs,rt) -> + renTo (XOR (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | XORI (rd,rs,v) -> + renTo (XORI (lookUp rd allocs, lookUp rs allocs, v)) + | SLL (rd,rt,v) -> + renTo (SLL (lookUp rd allocs, lookUp rt allocs, v)) + | SRA (rd,rt,v) -> + renTo (SRA (lookUp rd allocs, lookUp rt allocs, v)) + | SLT (rd,rs,rt) -> + renTo (SLT (lookUp rd allocs, lookUp rs allocs, lookUp rt allocs)) + | SLTI (rd,rs,v) -> + renTo (SLTI (lookUp rd allocs, lookUp rs allocs, v)) + | BEQ (rs,rt,l) -> + renTo (BEQ (lookUp rs allocs, lookUp rt allocs, l)) + | BGEZ(rs,l) -> + renTo (BGEZ(lookUp rs allocs, l)) + | BNE (rs,rt,l) -> + renTo (BNE (lookUp rs allocs, lookUp rt allocs, l)) + | JAL (lab,argRegs) -> + [JAL (lab, List.map (fun r -> lookUp r allocs) argRegs); + COMMENT ("was:" + ppMips inst + + ", " + String.concat " " (List.map ppReg argRegs))] + | JR (r, resRegs) -> + [JR (lookUp r allocs, List.map (fun r -> lookUp r allocs) resRegs); + COMMENT ("was:" + ppMips inst + + ", " + String.concat " " (List.map ppReg resRegs))] + | LW (rd,rs,v) -> + renTo (LW (lookUp rd allocs, lookUp rs allocs, v)) + | SW (rd,rs,v) -> + renTo (SW (lookUp rd allocs, lookUp rs allocs, v)) + | LB (rd,rs,v) -> + renTo (LB (lookUp rd allocs, lookUp rs allocs, v)) + | SB (rd,rs,v) -> + renTo (SB (lookUp rd allocs, lookUp rs allocs, v)) + | _ -> [inst] + +let spill1 i r offset = + let d = destReg i + let u = usedRegs i + let hdlst = if Set.contains r u + then [Mips.LW (r, RN 29, offset)] + else [] + let tllst = if Set.contains r d + then [Mips.SW (r, RN 29, offset)] + else [] + hdlst @ [i] @ tllst + +let rec spill ilist r offset = + match ilist with + | [] -> [] + | (i::is) -> spill1 i r offset @ spill is r offset + +let rec maxreg lst m = + match lst with + | [] -> m + | ((r,RN n)::rs) -> maxreg rs (if m < n then n else m) + | ((_,RS _)::rs) -> raise (MyError "maxreg of non-numeric register") + +(* arguments: + ilist is list of MIPS instructions + liveAtEnd is a set of variables that are live at the end of ilist + rmin is first allocable register (caller-saves) + callerMax is highest caller-saves register + rmax is highest allocable register + spilled is number of registers spilled so far -- should be 0 initially +*) +let rec registerAlloc (ilist : Mips.Instruction list) + (liveAtEnd : Set) + (rmin : int) + (callerMax : int) + (rmax : int) + (spilled : int) + : (Mips.Instruction list * Set * int * int) = + try + let llist = live_regs ilist liveAtEnd + let callerSaves = mList rmin callerMax + let iGraph = graph ilist llist callerSaves + let moveRelated = findMoves ilist llist + let allocs = colourGraph iGraph rmin rmax moveRelated + let deadRegs = Set.difference (filterSymbolic (destRegs ilist)) + ( (List.map (fun (x,_) -> x) allocs) |> Set.ofList ) + let allocs1 = allocs @ (List.map (fun r -> (r, RN 0)) (Set.toList deadRegs)) + let ilist1 = filterNullMoves ilist allocs1 + let ilist2 = List.concat (List.map (renameReg allocs1) ilist1) + (ilist2, List.head llist, maxreg allocs 0, spilled) + with + | (Not_colourable sr) -> + printfn "%s spilled\n" sr + spilledVars := Set.add sr (!spilledVars) + let offset = (4*spilled) + let ilist' = spill ilist (RS sr) offset + let ilist'' = [Mips.SW (RS sr, RN 29,offset)] + @ ilist' @ + (if Set.contains (RS sr) liveAtEnd + then [Mips.LW (RS sr, RN 29, offset)] + else []) + registerAlloc ilist'' liveAtEnd rmin callerMax rmax (spilled + 1) + diff --git a/W1/fasto/Fasto/SymTab.fs b/W1/fasto/Fasto/SymTab.fs new file mode 100644 index 0000000..76a53f3 --- /dev/null +++ b/W1/fasto/Fasto/SymTab.fs @@ -0,0 +1,37 @@ +(* A polymorphic symbol table. *) + +module SymTab + +open System + +(* +A symbol table is just a list of tuples identifiers and values. This allows for +easy shadowing, as a shadowing binding can be quickly placed at the head of the +list. +*) +type SymTab<'a> = SymTab of (string * 'a) list + +let empty () = SymTab [] + +let rec lookup n tab = + match tab with + | SymTab [] -> None + | SymTab ((n1,i1)::remtab) -> + if n = n1 + then Some i1 + else lookup n (SymTab remtab) + +let bind n i (SymTab stab) = SymTab ((n,i)::stab) + +let remove n (SymTab stab) = + SymTab (List.filter (fun (x, _) -> x <> n) stab) + +let removeMany ns (SymTab stab) = + SymTab (List.filter (fun (x, _) -> + not (List.exists (fun y -> y = x) ns)) stab) + +let combine (SymTab t1) (SymTab t2) = SymTab (t1 @ t2) + +let fromList l = SymTab l + +let toList (SymTab lst) = lst diff --git a/W1/fasto/Fasto/SymTab.fsi b/W1/fasto/Fasto/SymTab.fsi new file mode 100644 index 0000000..cd0ec10 --- /dev/null +++ b/W1/fasto/Fasto/SymTab.fsi @@ -0,0 +1,38 @@ +(* +A polymorphic symbol table. +A symbol table is a data structure associating names (strings) with values. It +is useful for keeping track of binidngs. Bindings can be shadowed --- the +active binding is the one made most recently. +*) + +module SymTab + (* A symbol table with values of type 'a. *) + //type SymTab<'a> = SymTab of (string * 'a) list + // when 'a : equality + + (* Create an empty symbol table. *) + val empty : unit -> SymTab<'a> when 'a : equality + + (* Look up the active binding for the name. *) + val lookup : string -> SymTab<'a> -> Option<'a> + + (* Bind the name to a value, shadowing any existing + binidngs with the same name. *) + val bind : string -> 'a -> SymTab<'a> -> SymTab<'a> + + (* Remove all existing bindings of the given name. *) + val remove : string -> SymTab<'a > -> SymTab<'a> + + (* Remove all existing bindings of all the given names. *) + val removeMany : string list -> SymTab<'a > -> SymTab<'a > + + (* Combine two symbol tables. The first table shadows the second. *) + val combine : SymTab<'a > -> SymTab<'a > -> SymTab<'a > + + (* Create a symbol table from a list of name-value pairs. + In case of duplicates, the bindings are shadowed in reverse order from + the head of the list. That is, the active binding will ne the one + closest to the head of the list. *) + val fromList : (string * 'a) list -> SymTab<'a > + val toList : SymTab<'a > -> (string * 'a) list + diff --git a/W1/fasto/Fasto/TypeChecker.fs b/W1/fasto/Fasto/TypeChecker.fs new file mode 100644 index 0000000..84ff77b --- /dev/null +++ b/W1/fasto/Fasto/TypeChecker.fs @@ -0,0 +1,391 @@ +(* A type-checker for Fasto. *) + +module TypeChecker + +(* + +A type-checker checks that all operations in a (Fasto) program are performed on +operands of an appropriate type. Furthermore, a type-checker infers any types +missing in the original program text, necessary for well-defined machine code +generation. + +The main function of interest in this module is: + + val checkProg : Fasto.UnknownTypes.Prog -> Fasto.KnownTypes.Prog + +*) + +open AbSyn + +(* An exception for reporting type errors. *) +exception MyError of string * Position + +type FunTable = SymTab.SymTab<(Type * Type list * Position)> +type VarTable = SymTab.SymTab + + +(* Table of predefined conversion functions *) +let initFunctionTable : FunTable = + SymTab.fromList + [( "chr", (Char, [Int], (0,0))); + ( "ord", (Int, [Char], (0,0))) + ] + +(* Pretty-printer for function types, for error messages *) +let showFunType (args : Type list, res : Type) : string = + match args with + | [] -> " () -> " + ppType res + | args -> (String.concat " * " (List.map ppType args)) + + " -> " + ppType res + +let reportError msg pos = raise (MyError (msg, pos)) + +let reportTypeWrong place tExp tFound pos = + reportError ("Type mismatch in " + place + ": expected " + + ppType tExp + ", but got " + ppType tFound) pos + +let reportTypesDifferent place tFound1 tFound2 pos = + reportError ("Type mismatch in " + place + ": expected " + + "equal types, but got " + ppType tFound1 + + " and " + ppType tFound2) pos + +let reportTypeWrongKind place kExp tFound pos = + reportError ("Type mismatch in " + place + ": expected a(n) " + + kExp + " type, but got " + ppType tFound) pos + +let reportArityWrong place nExp (args, res) pos = + reportError ("Arity mismatch in " + place + ": expected " + + "a function of arity " + string nExp + ", but got " + + showFunType (args, res)) pos + +let reportUnknownId kind name pos = + reportError ("Unkown " + kind + " identifier: " + name) pos + +let reportOther msg pos = reportError msg pos + +(* Determine if a value of some type can be printed with write() *) +let printable (tp : Type) : bool = + match tp with + | Int -> true + | Bool -> true + | Char -> true + | Array Char -> true + | _ -> false (* For all other array types *) + +(* Type-check the two operands to a binary operator - they must both be + of type 't'. Returns the decorated operands on success. *) +let rec checkBinOp (ftab : FunTable) + (vtab : VarTable) + (pos : Position, t : Type, e1 : UntypedExp, e2 : UntypedExp) + : (TypedExp * TypedExp) = + let (t1, e1') = checkExp ftab vtab e1 + let (t2, e2') = checkExp ftab vtab e2 + if t1 <> t then + reportTypeWrong "1st argument of binary operator" t t1 pos + if t2 <> t then + reportTypeWrong "2nd argument of binary operator" t t2 pos + (e1', e2') + +(* Determine the type of an expression. On the way, decorate each + node in the syntax tree with inferred types. The result consists + of a pair: the result type tupled with the type-decorated + expression. An exception is raised immediately on the first type mismatch + by reportError. (We could instead collect each error as part of the + result of checkExp and report all errors at the end.) *) + +and checkExp (ftab : FunTable) + (vtab : VarTable) + (exp : UntypedExp) + : (Type * TypedExp) = + match exp with + | Constant (v, pos) -> (valueType v, Constant (v, pos)) + | StringLit (s, pos) -> (Array Char, StringLit (s, pos)) + | ArrayLit ([], _, pos) -> reportOther "Impossible empty array" pos + | ArrayLit (exp::exps, _, pos) -> + let (type_exp, exp_dec) = checkExp ftab vtab exp + let exps_dec = + List.map (fun ei -> let (ti, ei') = checkExp ftab vtab ei + if ti <> type_exp then + reportTypesDifferent "components of array literal" + type_exp ti pos + ei') + exps + (Array type_exp, ArrayLit (exp_dec :: exps_dec, type_exp, pos)) + + | Var (s, pos) -> + match SymTab.lookup s vtab with + | None -> reportUnknownId "variable" s pos + | Some t -> (t, Var (s, pos)) + + | Plus (e1, e2, pos) -> + let (e1_dec, e2_dec) = checkBinOp ftab vtab (pos, Int, e1, e2) + (Int, Plus (e1_dec, e2_dec, pos)) + + | Minus (e1, e2, pos) -> + let (e1_dec, e2_dec) = checkBinOp ftab vtab (pos, Int, e1, e2) + (Int, Minus (e1_dec, e2_dec, pos)) + + (* TODO project task 1: + Implement by pattern matching Plus/Minus above. + See `AbSyn.fs` for the expression constructors of `Times`, ... + *) + | Times (e1, e2, pos) -> + failwith "Unimplemented type check of multiplication" + + | Divide (_, _, _) -> + failwith "Unimplemented type check of division" + + | And (_, _, _) -> + failwith "Unimplemented type check of &&" + + | Or (_, _, _) -> + failwith "Unimplemented type check of ||" + + | Not (_, _) -> + failwith "Unimplemented type check of not" + + | Negate (_, _) -> + failwith "Unimplemented type check of negate" + + (* The types for e1, e2 must be the same. The result is always a Bool. *) + | Equal (e1, e2, pos) -> + let (t1, e1') = checkExp ftab vtab e1 + let (t2, e2') = checkExp ftab vtab e2 + match (t1 = t2, t1) with + | (false, _) -> reportTypesDifferent "arguments of == " t1 t2 pos + | (true, Array _) -> reportTypeWrongKind "arguments of == " "base" t1 pos + | _ -> (Bool, Equal (e1', e2', pos)) + + | Less (e1, e2, pos) -> + let (t1, e1') = checkExp ftab vtab e1 + let (t2, e2') = checkExp ftab vtab e2 + match (t1 = t2, t1) with + | (false, _) -> reportTypesDifferent "arguments of < " t1 t2 pos + | (true, Array _) -> reportTypeWrongKind "arguments of < " "base" t1 pos + | _ -> (Bool, Less (e1', e2', pos)) + + | If (pred, e1, e2, pos) -> + let (pred_t, pred') = checkExp ftab vtab pred + let (t1, e1') = checkExp ftab vtab e1 + let (t2, e2') = checkExp ftab vtab e2 + let target_type = if t1 = t2 then t1 + else reportTypesDifferent "branches of conditional" + t1 t2 pos + match pred_t with + | Bool -> (target_type, If (pred', e1', e2', pos)) + | _ -> reportTypeWrong "predicate in conditional" Bool pred_t pos + + (* special case for length *) + | Apply ("length", [arg], pos) -> + let (targ, arg') = checkExp ftab vtab arg + match targ with + | Array _ -> (Int, Apply("length", [arg'], pos)) + | _ -> reportTypeWrongKind "argument of length" "array" targ pos + | Apply ("length", args, pos) -> + reportOther ("Arity mismatch: length expects 1 argument, but got " + + string (List.length args)) pos + + (* Look up f in function table, get a list of expected types for each + function argument and an expected type for the return value. Check + each actual argument. Ensure that each actual argument type has the + expected type. *) + | Apply (f, args, pos) -> + let (result_type, expected_arg_types, _) = + match SymTab.lookup f ftab with + | Some tup -> tup (* 2-tuple *) + | None -> reportUnknownId "function" f pos + let nargs = List.length args + let ntypes = List.length expected_arg_types + if nargs <> ntypes then + reportOther ("Arity mismatch: expected " + string ntypes + + " argument(s), but got " + string nargs) pos + let args_dec = + List.mapi2 (fun i ti ai -> + let (ti', ai') = checkExp ftab vtab ai + if ti' <> ti then + reportTypeWrong ("function argument #"+string (i+1)) + ti ti' pos + ai') + expected_arg_types args + (result_type, Apply (f, args_dec, pos)) + + | Let (Dec (name, exp, pos1), exp_body, pos2) -> + let (t1, exp_dec) = checkExp ftab vtab exp + let new_vtab = SymTab.bind name t1 vtab + let (t2, exp_body_dec) = checkExp ftab new_vtab exp_body + (t2, Let (Dec (name, exp_dec, pos1), exp_body_dec, pos2)) + + | Read (t, pos) -> + match t with + | Array _ -> reportTypeWrongKind "argument of read" "base" t pos + | _ -> (t, Read (t, pos)) + + | Write (e, _, pos) -> + let (t, e') = checkExp ftab vtab e + if printable t + then (t, Write (e', t, pos)) + else reportTypeWrongKind "argument of write" "printable" t pos + + | Index (s, i_exp, t, pos) -> + let (e_type, i_exp_dec) = checkExp ftab vtab i_exp + let arr_type = + match SymTab.lookup s vtab with + | Some (Array t) -> t + | None -> reportUnknownId "indexed-variable" s pos + | Some other -> reportTypeWrongKind ("indexed variable " + s) "array" other pos + (arr_type, Index (s, i_exp_dec, arr_type, pos)) + + | Iota (n_exp, pos) -> + let (e_type, n_exp_dec) = checkExp ftab vtab n_exp + if e_type <> Int then + reportTypeWrong "argument of iota" Int e_type pos + (Array Int, Iota (n_exp_dec, pos)) + + | Map (f, arr_exp, _, _, pos) -> + let (arr_type, arr_exp_dec) = checkExp ftab vtab arr_exp + let elem_type = + match arr_type with + | Array t -> t + | _ -> reportTypeWrongKind "second argument of map" "array" arr_type pos + let (f', f_res_type, f_arg_type) = + match checkFunArg ftab vtab pos f with + | (f', res, [a1]) -> (f', res, a1) + | (_, res, args) -> + reportArityWrong "first argument of map" 1 (args,res) pos + if elem_type <> f_arg_type then + reportTypesDifferent "function-argument and array-element types in map" + f_arg_type elem_type pos + (Array f_res_type, Map (f', arr_exp_dec, elem_type, f_res_type, pos)) + + | Reduce (f, e_exp, arr_exp, _, pos) -> + let (e_type , e_dec ) = checkExp ftab vtab e_exp + let (arr_type, arr_dec) = checkExp ftab vtab arr_exp + let elem_type = + match arr_type with + | Array t -> t + | _ -> reportTypeWrongKind "third argument of reduce" "array" arr_type pos + let (f', f_argres_type) = + match checkFunArg ftab vtab pos f with + | (f', res, [a1; a2]) -> + if a1 <> a2 then + reportTypesDifferent "argument types of operation in reduce" + a1 a2 pos + if res <> a1 then + reportTypesDifferent "argument and return type of operation in reduce" + a1 res pos + (f', res) + | (_, res, args) -> + reportArityWrong "operation in reduce" 2 (args,res) pos + if elem_type <> f_argres_type then + reportTypesDifferent "operation and array-element types in reduce" + f_argres_type elem_type pos + if e_type <> f_argres_type then + reportTypesDifferent "operation and start-element types in scan" + f_argres_type e_type pos + (f_argres_type, Reduce (f', e_dec, arr_dec, elem_type, pos)) + + (* TODO project task 2: + See `AbSyn.fs` for the expression constructors of + `Replicate`, `Filter`, `Scan`. + + Hints for `replicate(n, a)`: + - recursively type check `n` and `a` + - check that `n` has integer type + - assuming `a` is of type `t` the result type + of replicate is `[t]` + *) + | Replicate (_, _, _, _) -> + failwith "Unimplemented type check of replicate" + + (* TODO project task 2: Hint for `filter(f, arr)` + Look into the type-checking lecture slides for the type rule of `map` + and think of what needs to be changed for filter (?) + Use `checkFunArg` to get the signature of the function argument `f`. + Check that: + - `f` has type `ta -> Bool` + - `arr` should be of type `[ta]` + - the result of filter should have type `[tb]` + *) + | Filter (_, _, _, _) -> + failwith "Unimplemented type check of filter" + + (* TODO project task 2: `scan(f, ne, arr)` + Hint: Implementation is very similar to `reduce(f, ne, arr)`. + (The difference between `scan` and `reduce` is that + scan's return type is the same as the type of `arr`, + while reduce's return type is that of an element of `arr`). + *) + | Scan (_, _, _, _, _) -> + failwith "Unimplemented type check of scan" + +and checkFunArg (ftab : FunTable) + (vtab : VarTable) + (pos : Position) + (ff : UntypedFunArg) + : (TypedFunArg * Type * Type list) = + match ff with + | FunName fname -> + match SymTab.lookup fname ftab with + | None -> reportUnknownId "parameter function" fname pos + | Some (ret_type, arg_types, _) -> (FunName fname, ret_type, arg_types) + | Lambda (rettype, parms, body, funpos) -> + let lambda = FunDec ("", rettype, parms, body, funpos) + let (FunDec (_, _, _, body', _)) = + checkFunWithVtable ftab vtab pos lambda + ( Lambda (rettype, parms, body', pos) + , rettype + , List.map (fun (Param (_, ty)) -> ty) parms) + + +(* Check a function declaration, but using a given vtable rather +than an empty one. *) +and checkFunWithVtable (ftab : FunTable) + (vtab : VarTable) + (pos : Position) + (fdec : UntypedFunDec) + : TypedFunDec = + let (FunDec (fname, rettype, parms, body, funpos)) = fdec + (* Expand vtable by adding the parameters to vtab. *) + let addParam ptable (Param (pname, ty)) = + match SymTab.lookup pname ptable with + | Some _ -> reportOther ("Multiple parameters named " + pname) + funpos + | None -> SymTab.bind pname ty ptable + let paramtable = List.fold addParam (SymTab.empty()) parms + let vtab' = SymTab.combine paramtable vtab + let (body_type, body') = checkExp ftab vtab' body + if body_type = rettype + then (FunDec (fname, rettype, parms, body', pos)) + else reportTypeWrong "function body" rettype body_type funpos + + +(* Convert a funDec into the (fname, ([arg types], result type), + pos) entries that the function table, ftab, consists of, and + update the function table with that entry. *) +let updateFunctionTable (ftab : FunTable) + (fundec : UntypedFunDec) + : FunTable = + let (FunDec (fname, ret_type, args, _, pos)) = fundec + let arg_types = List.map (fun (Param (_, ty)) -> ty) args + match SymTab.lookup fname ftab with + | Some (_, _, old_pos) -> reportOther ("Duplicate function " + fname) pos + | None -> SymTab.bind fname (ret_type, arg_types, pos) ftab + +(* Functions are guaranteed by syntax to have a known declared type. This + type is checked against the type of the function body, taking into + account declared argument types and types of other functions called. + *) +let checkFun (ftab : FunTable) + (fundec : UntypedFunDec) + : TypedFunDec = + let (FunDec (_, _, _, _, pos)) = fundec + checkFunWithVtable ftab (SymTab.empty()) pos fundec + +let checkProg (funDecs : UntypedFunDec list) : TypedFunDec list = + let ftab = List.fold updateFunctionTable initFunctionTable funDecs + let decorated_funDecs = List.map (checkFun ftab) funDecs + match SymTab.lookup "main" ftab with + | None -> reportOther "No main function defined" (0,0) + | Some (_, [], _) -> decorated_funDecs (* all fine! *) + | Some (ret_type, args, mainpos) -> + reportArityWrong "declaration of main" 0 (args,ret_type) mainpos diff --git a/W1/fasto/Fasto/bin/Debug/net6.0/FSharp.Core.dll b/W1/fasto/Fasto/bin/Debug/net6.0/FSharp.Core.dll new file mode 100755 index 0000000000000000000000000000000000000000..f38b4fd55661bfe49506bb72be86fa3eeded6aa9 GIT binary patch literal 3087488 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

h8V;LgT@yKX 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 z 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

)h5uH6QNsvhwXZMv=MVEMdsgpMJ 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∓e%365o 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Ë(^Ft#}-slMXaK(W6t;P#aK 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[l@fyCnmRZ<$>J~m0-qvRea^`qp=P1J{9M< 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