update README & bug fixed

This commit is contained in:
ValKmjolnir 2022-02-13 16:10:02 +08:00
parent e7f503fae1
commit 9139e34c0b
7 changed files with 191 additions and 193 deletions

110
README.md
View File

@ -14,6 +14,8 @@
* [__Why Writing Nasal Interpreter__](#why-writing-nasal-interpreter) * [__Why Writing Nasal Interpreter__](#why-writing-nasal-interpreter)
* [__Compile__](#how-to-compile) * [__Compile__](#how-to-compile)
* [__Usage__](#how-to-use) * [__Usage__](#how-to-use)
* [__Release Notes__](#release-notes)
* [v8.0](#version-80-release)
* [__Parser__](#parser) * [__Parser__](#parser)
* [v1.0](#version-10-parser-last-update-20191014) * [v1.0](#version-10-parser-last-update-20191014)
* [__Abstract Syntax Tree__](#abstract-syntax-tree) * [__Abstract Syntax Tree__](#abstract-syntax-tree)
@ -27,11 +29,13 @@
* [v6.0](#version-60-vm-last-update-202161) * [v6.0](#version-60-vm-last-update-202161)
* [v6.5](#version-65-vm-last-update-2021624) * [v6.5](#version-65-vm-last-update-2021624)
* [v7.0](#version-70-vm-last-update-2021108) * [v7.0](#version-70-vm-last-update-2021108)
* [v8.0](#version-80-vm-latest) * [v8.0](#version-80-vm-last-update-2022212)
* [v9.0](#version-90-vm-latest)
* [__Benchmark__](#benchmark) * [__Benchmark__](#benchmark)
* [v6.5 (i5-8250U windows 10)](#version-65-i5-8250u-windows10-2021619) * [v6.5 (i5-8250U windows 10)](#version-65-i5-8250u-windows10-2021619)
* [v6.5 (i5-8250U ubuntu-WSL)](#version-70-i5-8250u-ubuntu-wsl-on-windows10-2021629) * [v6.5 (i5-8250U ubuntu-WSL)](#version-70-i5-8250u-ubuntu-wsl-on-windows10-2021629)
* [v8.0 (R9-5900HX ubuntu-WSL)](#version-80-r9-5900hx-ubuntu-wsl-2022123) * [v8.0 (R9-5900HX ubuntu-WSL)](#version-80-r9-5900hx-ubuntu-wsl-2022123)
* [v9.0 (R9-5900HX ubuntu-WSL)](#version-90-r9-5900hx-ubuntu-wsl-2022213)
* [__Tutorial__](#tutorial) * [__Tutorial__](#tutorial)
* [basic value type](#basic-value-type) * [basic value type](#basic-value-type)
* [operators](#operators) * [operators](#operators)
@ -59,9 +63,9 @@
__Contact us if having great ideas to share!__ __Contact us if having great ideas to share!__
* __E-mail__: lhk101lhk101@qq.com * __E-mail__: __lhk101lhk101@qq.com__
* __QQ__: 896693328 * __QQ__: __896693328__
## __Introduction__ ## __Introduction__
@ -100,12 +104,11 @@ this interpreter a useful tool in your own projects (such as a script in a game
## __How to Compile__ ## __How to Compile__
Better choose the latest update of the interpreter. Better choose the latest update of the interpreter.
Download the source code and build it! Download the source and build it! It's quite easy to build this interpreter.
It's quite easy to build this interpreter.
__MUST USE__ __`-O2/-O3`__ if want to optimize the interpreter! __CAUTION__: If want to use the release zip/tar.gz file to build the interpreter, please read the __Release Notes__ below to make sure this release file has no fatal bugs. Also in __Release Notes__ there's tips to fix the release manually.
Also remember to use g++ or clang++.(mingw-w64 in __`Windows`__) Also remember to use g++ or clang++.(`mingw-w64` in __`Windows`__)
> [cpp compiler] -std=c++11 -O3 main.cpp -o nasal.exe -fno-exceptions > [cpp compiler] -std=c++11 -O3 main.cpp -o nasal.exe -fno-exceptions
@ -129,7 +132,7 @@ Use these commands to get version of interpreter:
/ \/ / _` / __|/ _` | | / \/ / _` / __|/ _` | |
/ /\ / (_| \__ \ (_| | | / /\ / (_| \__ \ (_| | |
\_\ \/ \__,_|___/\__,_|_| \_\ \/ \__,_|___/\__,_|_|
nasal interpreter ver 8.0 nasal interpreter ver 9.0
thanks to : https://github.com/andyross/nasal thanks to : https://github.com/andyross/nasal
code repo : https://github.com/ValKmjolnir/Nasal-Interpreter code repo : https://github.com/ValKmjolnir/Nasal-Interpreter
code repo : https://gitee.com/valkmjolnir/Nasal-Interpreter code repo : https://gitee.com/valkmjolnir/Nasal-Interpreter
@ -145,7 +148,7 @@ Use these commands to get help(see more debug commands in help):
nasal <option> nasal <option>
option: option:
-h, --help | get help. -h, --help | get help.
-v, --version | get version of nasal interpreter. -v, --version | get version of nasal interpreter.
nasal <file> nasal <file>
file: file:
@ -154,12 +157,15 @@ file:
nasal [options...] <file> nasal [options...] <file>
option: option:
-l, --lex | view token info. -l, --lex | view token info.
-a, --ast | view abstract syntax tree. -a, --ast | view abstract syntax tree.
-c, --code | view bytecode. -c, --code | view bytecode.
-e, --exec | execute.
-t, --time | execute and get the running time. -t, --time | execute and get the running time.
-o, --opcnt | execute and count used operands. -o, --opcnt | execute and count used operands.
-d, --detail | execute and get detail crash info. -d, --detail | execute and get detail crash info.
| get garbage collector info if did not crash.
-op, --optimize| use optimizer(beta). -op, --optimize| use optimizer(beta).
| if want to use -op and run, please use -op -e/-t/-o/-d.
-dbg, --debug | debug mode (this will ignore -t -o -d). -dbg, --debug | debug mode (this will ignore -t -o -d).
file: file:
input file name to execute script file. input file name to execute script file.
@ -171,6 +177,21 @@ If your system is __`Windows`__ and you want to output unicode,please use this c
The interpreter's interactive mode will do this automatically,so you don't need to run this command if you use the interactive interpreter. The interpreter's interactive mode will do this automatically,so you don't need to run this command if you use the interactive interpreter.
## __Release Notes__
### __version 8.0 release__
I made a __big mistake__ in `v8.0` release:
in __`nasal_dbg.h:215`__: `auto canary=gc.stack+STACK_MAX_DEPTH-1;`
this will cause incorrect `stackoverflow` error.
please change it to:
`canary=gc.stack+STACK_MAX_DEPTH-1;`
If do not change this line, only the debugger runs abnormally. this bug is fixed in `v9.0`
## __Parser__ ## __Parser__
`LL(k)` parser. `LL(k)` parser.
@ -562,7 +583,7 @@ a=b=0;
0x00000009: nop 0x00000000 0x00000009: nop 0x00000000
``` ```
### version 8.0 vm (latest) ### version 8.0 vm (last update 2022/2/12)
2021/10/8 update: 2021/10/8 update:
@ -627,6 +648,19 @@ The format of output information of bytecodes changes to this:
Delete `op_pone` and `op_pzero`. Delete `op_pone` and `op_pzero`.
Both of them are meaningless and will be replaced by `op_pnum`. Both of them are meaningless and will be replaced by `op_pnum`.
### version 9.0 vm (latest)
2022/2/12 update:
Local values now are __stored on stack__.
So function calling will be faster than before.
Because in v8.0 when calling a function,
new `vm_vec` will be allocated by `nasal_gc`, this makes gc doing mark-sweep too many times and spends a quite lot of time.
In test file `test/bf.nas`, it takes too much time to test the file because this file has too many function calls(see test data below in table `version 8.0 (R9-5900HX ubuntu-WSL 2022/1/23)`).
Upvalue now is generated when creating first new function in the local scope, using `vm_vec`.
And after that when creating new functions, they share the same upvalue, and the upvalue will synchronize with the local scope each time creating a new function.
## Benchmark ## Benchmark
### version 6.5 (i5-8250U windows10 2021/6/19) ### version 6.5 (i5-8250U windows10 2021/6/19)
@ -702,8 +736,9 @@ running time:
|bf.nas|1100.19s|| |bf.nas|1100.19s||
|mandel.nas|28.98s|| |mandel.nas|28.98s||
|life.nas|0.857s(windows) 0.56(ubuntu WSL)|| |life.nas|0.857s(windows) 0.56(ubuntu WSL)||
|ycombinator.nas|0.64s||
|fib.nas|0.28s|| |fib.nas|0.28s||
|bfs.nas|0.156s|changed test file| |bfs.nas|0.156s|random result|
|pi.nas|0.0625s|| |pi.nas|0.0625s||
|bigloop.nas|0.047s|| |bigloop.nas|0.047s||
|calc.nas|0.03125s|changed test file| |calc.nas|0.03125s|changed test file|
@ -711,10 +746,30 @@ running time:
|ascii-art.nas|0s|| |ascii-art.nas|0s||
|quick_sort.nas|0s|| |quick_sort.nas|0s||
### version 9.0 (R9-5900HX ubuntu-WSL 2022/2/13)
running time:
|file|total time|info|
|:----|:----|:----|
|bf.nas|276.55s|great improvement|
|mandel.nas|28.16s||
|ycombinator.nas|0.578s||
|life.nas|0.649s(windows) 0.2(ubuntu WSL)||
|fib.nas|0.234s|little improvement|
|bfs.nas|0.14s|random result|
|pi.nas|0.0625s||
|bigloop.nas|0.047s||
|calc.nas|0.0469s|changed test file|
|quick_sort.nas|0.016s|changed test file:100->1e4|
|mandelbrot.nas|0.0156s||
|ascii-art.nas|0s||
## __Tutorial__ ## __Tutorial__
Nasal is really __easy__ to learn. Nasal is really __easy__ to learn.
Reading this tutorial will not takes you over 15 minutes. Reading this tutorial will not takes you over 15 minutes.
__If you have learnt C/C++/Javascript before, this will take less time.__
You could totally use it after reading this simple tutorial: You could totally use it after reading this simple tutorial:
### __basic value type__ ### __basic value type__
@ -1516,3 +1571,34 @@ If want help, input `h` to get help.
<option> <filename> <line> <option> <filename> <line>
bk, break | set break point bk, break | set break point
``` ```
When running the debugger, you could see what is on stack.
This will help you debugging or learning how the vm works:
```bash
source code:
import("lib.nas");
var fib=func(x)
{
--> if(x<2) return x;
return fib(x-1)+fib(x-2);
}
for(var i=0;i<31;i+=1)
print(fib(i),'\n');
next bytecode:
0x000002f0: para 0x3e ("x") (test/fib.nas:2)
0x000002f1: jmp 0x301 (test/fib.nas:2)
0x000002f2: calll 0x1 (test/fib.nas:4)
--> 0x000002f3: lessc 0x2 (2) (test/fib.nas:4)
0x000002f4: jf 0x2f7 (test/fib.nas:4)
0x000002f5: calll 0x1 (test/fib.nas:4)
0x000002f6: ret 0x0 (test/fib.nas:4)
0x000002f7: callg 0x33 (test/fib.nas:5)
vm stack(limit 5, total 6):
| num | 0
| addr | pc:0x30a
| num | 0
| nil |
| func | <0xed92d0> entry:0x2f2
>>
```

View File

@ -35,7 +35,7 @@ void help()
<<" | get garbage collector info if didn't crash.\n" <<" | get garbage collector info if didn't crash.\n"
<<" -op, --optimize| use optimizer(beta).\n" <<" -op, --optimize| use optimizer(beta).\n"
<<" | if want to use -op and run, please use -op -e/-t/-o/-d.\n" <<" | if want to use -op and run, please use -op -e/-t/-o/-d.\n"
<<" -dbg, --debug | debug mode (this will ignore -t -o -d).\n" <<" -dbg, --debug | debug mode (this will ignore -t -o -d -e).\n"
<<"file:\n" <<"file:\n"
<<" input file name to execute script file.\n"; <<" input file name to execute script file.\n";
} }

View File

@ -210,10 +210,6 @@ void nasal_dbg::run(
code.push_back(opr_table[i.op]); code.push_back(opr_table[i.op]);
imm.push_back(i.num); imm.push_back(i.num);
} }
// set canary and program counter
canary=gc.stack+STACK_MAX_DEPTH-1;
pc=0;
// goto the first operand // goto the first operand
goto *code[pc]; goto *code[pc];

View File

@ -39,6 +39,7 @@ protected:
void die(std::string); void die(std::string);
/* vm calculation functions*/ /* vm calculation functions*/
bool condition(nasal_ref); bool condition(nasal_ref);
/* vm operands */
void opr_nop(); void opr_nop();
void opr_intg(); void opr_intg();
void opr_intl(); void opr_intl();
@ -132,6 +133,9 @@ void nasal_vm::init(
str_table=strs.data(); str_table=strs.data();
files=filenames.data(); files=filenames.data();
files_size=filenames.size(); files_size=filenames.size();
/* set canary and program counter */
canary=gc.stack+STACK_MAX_DEPTH-1;
pc=0;
} }
void nasal_vm::valinfo(nasal_ref& val) void nasal_vm::valinfo(nasal_ref& val)
{ {
@ -900,10 +904,6 @@ void nasal_vm::run(
code.push_back(opr_table[i.op]); code.push_back(opr_table[i.op]);
imm.push_back(i.num); imm.push_back(i.num);
} }
// set canary and program counter
canary=gc.stack+STACK_MAX_DEPTH-1;
pc=0;
// goto the first operand // goto the first operand
goto *code[pc]; goto *code[pc];

View File

@ -151,7 +151,7 @@ var bf=func(program)
{ {
var stack=[]; var stack=[];
var len=size(program); var len=size(program);
var f="import('lib.nas');\nvar ptr=0;\nvar paper=[];\nsetsize(paper,131072);\n"; var f="#automatically generated by bfconvertor.nas\nimport('lib.nas');\nvar ptr=0;\nvar paper=[];\nsetsize(paper,131072);\n";
for(var i=0;i<len;i+=1) for(var i=0;i<len;i+=1)
{ {
var c=chr(program[i]); var c=chr(program[i]);

View File

@ -87,7 +87,7 @@ var calc=func(codetype,files){
semi+=semi_cnt; semi+=semi_cnt;
} }
println('total: | ',line,' \tline | ',semi,' \tsemi'); println('total: | ',line,' \tline | ',semi,' \tsemi');
println('bytes: | ',bytes,'\tbytes| ',int(bytes/1024),' \tkb'); println(' | ',bytes,'\tbytes| ',int(bytes/1024),' \tkb');
} }
calc("source code:",source); calc("source code:",source);

View File

@ -1,3 +1,4 @@
#automatically generated by bfconvertor.nas
import('lib.nas'); import('lib.nas');
var ptr=0; var ptr=0;
var paper=[]; var paper=[];
@ -76,8 +77,7 @@ while(paper[ptr])
} }
ptr+=7.000000; ptr+=7.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=26.000000; ptr+=27.000000;
ptr+=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=17.000000; ptr-=17.000000;
while(paper[ptr]) while(paper[ptr])
@ -107,8 +107,7 @@ while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
} }
ptr+=2.000000; ptr+=7.000000;
ptr+=5.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -138,8 +137,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=3.000000; ptr+=9.000000;
ptr+=6.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=9.000000; ptr-=9.000000;
} }
@ -162,8 +160,7 @@ while(paper[ptr])
ptr+=6.000000; ptr+=6.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=5.000000; ptr+=7.000000;
ptr+=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -218,8 +215,7 @@ while(paper[ptr])
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=7.000000; ptr-=9.000000;
ptr-=2.000000;
} }
ptr+=7.000000; ptr+=7.000000;
while(paper[ptr]) while(paper[ptr])
@ -368,8 +364,7 @@ while(paper[ptr])
{ {
ptr+=9.000000; ptr+=9.000000;
} }
ptr-=7.000000; ptr-=9.000000;
ptr-=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=1.000000; ptr+=1.000000;
@ -443,8 +438,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=9.000000; ptr-=9.000000;
} }
ptr+=5.000000; ptr+=9.000000;
ptr+=4.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=1.000000; ptr+=1.000000;
@ -509,8 +503,7 @@ while(paper[ptr])
ptr+=9.000000; ptr+=9.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=2.000000; ptr+=9.000000;
ptr+=7.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -580,8 +573,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=3.000000; ptr+=3.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=2.000000; ptr-=3.000000;
ptr-=1.000000;
} }
ptr-=1.000000; ptr-=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
@ -596,8 +588,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=36.000000; ptr-=36.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=13.000000; ptr+=36.000000;
ptr+=23.000000;
} }
ptr+=5.000000; ptr+=5.000000;
} }
@ -612,8 +603,7 @@ while(paper[ptr])
{ {
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=4.000000; ptr+=9.000000;
ptr+=5.000000;
} }
ptr-=9.000000; ptr-=9.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -631,8 +621,7 @@ while(paper[ptr])
ptr-=3.000000; ptr-=3.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=6.000000; ptr-=9.000000;
ptr-=3.000000;
} }
ptr+=9.000000; ptr+=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -669,8 +658,7 @@ while(paper[ptr])
ptr-=13.000000; ptr-=13.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=5.000000; ptr-=9.000000;
ptr-=4.000000;
} }
ptr+=4.000000; ptr+=4.000000;
while(paper[ptr]) while(paper[ptr])
@ -716,8 +704,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=1.000000; ptr+=3.000000;
ptr+=2.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=12.000000; ptr-=12.000000;
while(paper[ptr]) while(paper[ptr])
@ -754,8 +741,7 @@ while(paper[ptr])
{ {
ptr+=9.000000; ptr+=9.000000;
} }
ptr-=6.000000; ptr-=8.000000;
ptr-=2.000000;
} }
ptr+=8.000000; ptr+=8.000000;
} }
@ -775,8 +761,7 @@ while(paper[ptr])
ptr-=4.000000; ptr-=4.000000;
} }
ptr+=9.000000; ptr+=9.000000;
paper[ptr]+=19.000000; paper[ptr]+=26.000000;
paper[ptr]+=7.000000;
ptr+=2.000000; ptr+=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
@ -898,8 +883,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=8.000000; ptr-=9.000000;
ptr-=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=9.000000; ptr+=9.000000;
} }
@ -979,8 +963,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=8.000000; ptr+=8.000000;
} }
ptr-=3.000000; ptr-=9.000000;
ptr-=6.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -1016,8 +999,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=2.000000; ptr+=2.000000;
} }
ptr-=1.000000; ptr-=2.000000;
ptr-=1.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -1048,8 +1030,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=4.000000; ptr+=9.000000;
ptr+=5.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=9.000000; ptr-=9.000000;
} }
@ -1123,8 +1104,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=1.000000; ptr-=5.000000;
ptr-=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=5.000000; ptr+=5.000000;
} }
@ -1313,8 +1293,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=36.000000; ptr-=36.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=1.000000; ptr+=36.000000;
ptr+=35.000000;
} }
ptr+=6.000000; ptr+=6.000000;
} }
@ -1324,8 +1303,7 @@ while(paper[ptr])
ptr-=9.000000; ptr-=9.000000;
} }
ptr+=9.000000; ptr+=9.000000;
paper[ptr]+=8.000000; paper[ptr]+=15.000000;
paper[ptr]+=7.000000;
while(paper[ptr]) while(paper[ptr])
{ {
while(paper[ptr]) while(paper[ptr])
@ -1415,8 +1393,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=1.000000; ptr-=5.000000;
ptr-=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=5.000000; ptr+=5.000000;
} }
@ -1550,8 +1527,7 @@ while(paper[ptr])
ptr-=11.000000; ptr-=11.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=5.000000; ptr-=9.000000;
ptr-=4.000000;
} }
ptr+=4.000000; ptr+=4.000000;
while(paper[ptr]) while(paper[ptr])
@ -1629,8 +1605,7 @@ while(paper[ptr])
} }
ptr+=8.000000; ptr+=8.000000;
} }
ptr-=5.000000; ptr-=8.000000;
ptr-=3.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=1.000000; ptr-=1.000000;
while(paper[ptr]) while(paper[ptr])
@ -1665,8 +1640,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=3.000000; ptr+=3.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=9.000000; ptr-=14.000000;
ptr-=5.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=11.000000; ptr+=11.000000;
} }
@ -1698,8 +1672,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=3.000000; ptr-=3.000000;
} }
ptr-=2.000000; ptr-=12.000000;
ptr-=10.000000;
} }
ptr+=4.000000; ptr+=4.000000;
while(paper[ptr]) while(paper[ptr])
@ -1745,8 +1718,7 @@ while(paper[ptr])
} }
ptr+=8.000000; ptr+=8.000000;
} }
ptr-=3.000000; ptr-=8.000000;
ptr-=5.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=1.000000; ptr-=1.000000;
while(paper[ptr]) while(paper[ptr])
@ -1781,8 +1753,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=4.000000; ptr+=4.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=7.000000; ptr-=14.000000;
ptr-=7.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=10.000000; ptr+=10.000000;
} }
@ -1905,8 +1876,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=3.000000; ptr-=3.000000;
} }
ptr-=7.000000; ptr-=12.000000;
ptr-=5.000000;
} }
} }
ptr+=1.000000; ptr+=1.000000;
@ -1951,8 +1921,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=1.000000; ptr-=4.000000;
ptr-=3.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=4.000000; ptr+=4.000000;
} }
@ -2102,8 +2071,7 @@ while(paper[ptr])
{ {
ptr+=9.000000; ptr+=9.000000;
} }
ptr-=8.000000; ptr-=9.000000;
ptr-=1.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=1.000000; ptr+=1.000000;
@ -2188,8 +2156,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=36.000000; ptr+=36.000000;
} }
ptr+=1.000000; ptr+=6.000000;
ptr+=5.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -2211,8 +2178,7 @@ while(paper[ptr])
} }
ptr-=9.000000; ptr-=9.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=5.000000; ptr-=9.000000;
ptr-=4.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -2252,8 +2218,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=4.000000; ptr+=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=5.000000; ptr-=13.000000;
ptr-=8.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -2337,8 +2302,7 @@ while(paper[ptr])
ptr-=1.000000; ptr-=1.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=2.000000; ptr+=9.000000;
ptr+=7.000000;
} }
ptr-=8.000000; ptr-=8.000000;
} }
@ -2491,8 +2455,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=2.000000; ptr-=2.000000;
} }
ptr+=2.000000; ptr+=8.000000;
ptr+=6.000000;
} }
ptr-=8.000000; ptr-=8.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
@ -2531,8 +2494,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=10.000000; ptr-=10.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=4.000000; ptr+=11.000000;
ptr+=7.000000;
} }
ptr-=2.000000; ptr-=2.000000;
} }
@ -2610,8 +2572,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=5.000000; ptr-=6.000000;
ptr-=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=6.000000; ptr+=6.000000;
} }
@ -2642,8 +2603,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=4.000000; ptr-=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=4.000000; ptr+=5.000000;
ptr+=1.000000;
} }
ptr+=2.000000; ptr+=2.000000;
while(paper[ptr]) while(paper[ptr])
@ -2687,8 +2647,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=5.000000; ptr+=5.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=2.000000; ptr-=5.000000;
ptr-=3.000000;
} }
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=4.000000; ptr+=4.000000;
@ -2738,8 +2697,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=2.000000; ptr+=2.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=2.000000; ptr-=11.000000;
ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -2784,8 +2742,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=3.000000; ptr+=3.000000;
} }
ptr-=1.000000; ptr-=3.000000;
ptr-=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -2826,8 +2783,7 @@ while(paper[ptr])
{ {
ptr+=9.000000; ptr+=9.000000;
} }
ptr-=1.000000; ptr-=8.000000;
ptr-=7.000000;
} }
ptr+=8.000000; ptr+=8.000000;
} }
@ -2972,8 +2928,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=4.000000; ptr-=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=1.000000; ptr+=4.000000;
ptr+=3.000000;
} }
ptr-=4.000000; ptr-=4.000000;
while(paper[ptr]) while(paper[ptr])
@ -3087,8 +3042,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=4.000000; ptr-=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=2.000000; ptr+=4.000000;
ptr+=2.000000;
} }
ptr-=4.000000; ptr-=4.000000;
while(paper[ptr]) while(paper[ptr])
@ -3122,8 +3076,7 @@ while(paper[ptr])
ptr+=9.000000; ptr+=9.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=6.000000; ptr+=9.000000;
ptr+=3.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -3158,8 +3111,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=2.000000; ptr+=2.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=8.000000; ptr-=13.000000;
ptr-=5.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=11.000000; ptr+=11.000000;
} }
@ -3191,8 +3143,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=2.000000; ptr-=2.000000;
} }
ptr-=8.000000; ptr-=12.000000;
ptr-=4.000000;
} }
} }
ptr+=9.000000; ptr+=9.000000;
@ -3287,8 +3238,7 @@ while(paper[ptr])
{ {
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=4.000000; ptr+=9.000000;
ptr+=5.000000;
} }
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=1.000000; ptr+=1.000000;
@ -3349,8 +3299,7 @@ while(paper[ptr])
{ {
ptr+=1.000000; ptr+=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=2.000000; ptr+=8.000000;
ptr+=6.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -3517,8 +3466,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=5.000000; ptr+=5.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=4.000000; ptr-=6.000000;
ptr-=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -3552,8 +3500,7 @@ while(paper[ptr])
ptr+=9.000000; ptr+=9.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=6.000000; ptr+=9.000000;
ptr+=3.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -3578,8 +3525,7 @@ while(paper[ptr])
} }
ptr-=2.000000; ptr-=2.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=3.000000; ptr+=8.000000;
ptr+=5.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -3639,8 +3585,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=36.000000; ptr-=36.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=17.000000; ptr+=36.000000;
ptr+=19.000000;
} }
ptr+=5.000000; ptr+=5.000000;
} }
@ -3655,8 +3600,7 @@ while(paper[ptr])
{ {
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=8.000000; ptr+=9.000000;
ptr+=1.000000;
} }
ptr-=9.000000; ptr-=9.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -3759,8 +3703,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=3.000000; ptr+=3.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=1.000000; ptr-=12.000000;
ptr-=11.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -3797,8 +3740,7 @@ while(paper[ptr])
} }
ptr-=8.000000; ptr-=8.000000;
} }
ptr+=1.000000; ptr+=8.000000;
ptr+=7.000000;
} }
ptr-=9.000000; ptr-=9.000000;
while(paper[ptr]) while(paper[ptr])
@ -3962,8 +3904,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=9.000000; ptr+=9.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=8.000000; ptr-=14.000000;
ptr-=6.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -3991,8 +3932,7 @@ while(paper[ptr])
{ {
ptr+=9.000000; ptr+=9.000000;
} }
ptr-=5.000000; ptr-=9.000000;
ptr-=4.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=7.000000; ptr+=7.000000;
@ -4022,8 +3962,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=3.000000; ptr+=3.000000;
} }
ptr-=4.000000; ptr-=10.000000;
ptr-=6.000000;
} }
} }
ptr+=7.000000; ptr+=7.000000;
@ -4057,8 +3996,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=3.000000; ptr+=4.000000;
ptr+=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=4.000000; ptr-=4.000000;
} }
@ -4084,8 +4022,7 @@ while(paper[ptr])
{ {
ptr+=9.000000; ptr+=9.000000;
} }
ptr-=5.000000; ptr-=9.000000;
ptr-=4.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=1.000000; ptr+=1.000000;
@ -4163,8 +4100,7 @@ while(paper[ptr])
ptr+=2.000000; ptr+=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=2.000000; ptr+=5.000000;
ptr+=3.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4211,8 +4147,7 @@ while(paper[ptr])
} }
ptr+=7.000000; ptr+=7.000000;
} }
ptr-=2.000000; ptr-=6.000000;
ptr-=4.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4240,8 +4175,7 @@ while(paper[ptr])
} }
ptr+=4.000000; ptr+=4.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=3.000000; ptr-=5.000000;
ptr-=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -4272,8 +4206,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=7.000000; ptr+=7.000000;
} }
ptr-=4.000000; ptr-=7.000000;
ptr-=3.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4305,8 +4238,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=1.000000; ptr-=7.000000;
ptr-=6.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=7.000000; ptr+=7.000000;
} }
@ -4334,8 +4266,7 @@ while(paper[ptr])
ptr-=14.000000; ptr-=14.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=3.000000; ptr-=9.000000;
ptr-=6.000000;
} }
ptr+=3.000000; ptr+=3.000000;
while(paper[ptr]) while(paper[ptr])
@ -4371,8 +4302,7 @@ while(paper[ptr])
} }
ptr+=8.000000; ptr+=8.000000;
} }
ptr-=7.000000; ptr-=9.000000;
ptr-=2.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=9.000000; ptr-=9.000000;
@ -4401,8 +4331,7 @@ while(paper[ptr])
ptr-=5.000000; ptr-=5.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=7.000000; ptr-=9.000000;
ptr-=2.000000;
} }
} }
ptr+=3.000000; ptr+=3.000000;
@ -4432,8 +4361,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr+=8.000000; ptr+=9.000000;
ptr+=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=9.000000; ptr-=9.000000;
} }
@ -4452,8 +4380,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=6.000000; ptr-=8.000000;
ptr-=2.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=8.000000; ptr+=8.000000;
} }
@ -4481,8 +4408,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=7.000000; ptr-=7.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=6.000000; ptr+=7.000000;
ptr+=1.000000;
} }
ptr-=7.000000; ptr-=7.000000;
while(paper[ptr]) while(paper[ptr])
@ -4510,8 +4436,7 @@ while(paper[ptr])
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
ptr-=5.000000; ptr-=8.000000;
ptr-=3.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr+=8.000000; ptr+=8.000000;
} }
@ -4542,8 +4467,7 @@ while(paper[ptr])
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=5.000000; ptr-=5.000000;
} }
ptr+=6.000000; ptr+=8.000000;
ptr+=2.000000;
} }
ptr-=1.000000; ptr-=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
@ -4612,8 +4536,7 @@ while(paper[ptr])
} }
ptr-=1.000000; ptr-=1.000000;
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=6.000000; ptr-=9.000000;
ptr-=3.000000;
} }
ptr+=8.000000; ptr+=8.000000;
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4644,8 +4567,7 @@ while(paper[ptr])
ptr+=1.000000; ptr+=1.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=3.000000; ptr+=6.000000;
ptr+=3.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4692,8 +4614,7 @@ while(paper[ptr])
} }
ptr+=8.000000; ptr+=8.000000;
} }
ptr-=2.000000; ptr-=7.000000;
ptr-=5.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4740,8 +4661,7 @@ while(paper[ptr])
ptr+=6.000000; ptr+=6.000000;
} }
paper[ptr]+=1.000000; paper[ptr]+=1.000000;
ptr-=1.000000; ptr-=6.000000;
ptr-=5.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4764,8 +4684,7 @@ while(paper[ptr])
ptr-=17.000000; ptr-=17.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=7.000000; ptr-=9.000000;
ptr-=2.000000;
} }
ptr+=4.000000; ptr+=4.000000;
while(paper[ptr]) while(paper[ptr])
@ -4827,8 +4746,7 @@ while(paper[ptr])
ptr+=6.000000; ptr+=6.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr+=6.000000; ptr+=9.000000;
ptr+=3.000000;
} }
ptr+=1.000000; ptr+=1.000000;
while(paper[ptr]) while(paper[ptr])
@ -4864,8 +4782,7 @@ while(paper[ptr])
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
} }
ptr-=3.000000; ptr-=3.000000;
paper[ptr]+=4.000000; paper[ptr]+=5.000000;
paper[ptr]+=1.000000;
while(paper[ptr]) while(paper[ptr])
{ {
paper[ptr]-=1.000000; paper[ptr]-=1.000000;
@ -4885,8 +4802,7 @@ while(paper[ptr])
ptr-=6.000000; ptr-=6.000000;
while(paper[ptr]) while(paper[ptr])
{ {
ptr-=4.000000; ptr-=9.000000;
ptr-=5.000000;
} }
} }
ptr+=3.000000; ptr+=3.000000;