Compare commits

...

2 commits

Author SHA1 Message Date
98e7f950cf Change stack.push(v) to stack ~= v 2025-06-07 23:57:45 +00:00
72a41e81e6 Local Variables 22 2025-06-07 23:52:16 +00:00
18 changed files with 1343 additions and 125 deletions

View file

@ -9,9 +9,9 @@ targetType "executable"
sourcePaths
configuration "clox" {
buildOptions "betterC"
/* debugVersions "memTrace" */
debugVersions "traceExec"
/* buildOptions "betterC" */
debugVersions "memTrace"
/* debugVersions "traceExec" */
/* debugVersions "printCode" */
dflags "-checkaction=C"
libs "libbacktrace"

View file

@ -4,6 +4,7 @@ import std.algorithm.searching;
import clox.memory;
import clox.value;
import clox.container.dynarray;
struct OpColour{
string r, g, b;
@ -16,8 +17,10 @@ enum OpCode : ubyte{
@(OpColour("255", "200", "100")) False,
@(OpColour("000", "200", "100")) Pop,
@(OpColour("060", "200", "150")) GetLocal,
@(OpColour("000", "200", "150")) GetGlobal,
@(OpColour("000", "200", "150")) DefineGlobal,
@(OpColour("060", "200", "150")) SetLocal,
@(OpColour("000", "200", "150")) SetGlobal,
@(OpColour("255", "100", "100")) Equal,
@ -39,40 +42,32 @@ enum OpCode : ubyte{
}
struct Chunk{
uint count;
uint capacity;
ubyte* code;
uint* lines;
ValueArray constants;
DynArray!ubyte code;
DynArray!uint lines;
DynArray!Value constants;
void initialise(){
count = 0;
capacity = 0;
code = null;
lines = null;
code.initialise();
lines.initialise();
constants.initialise();
}
void write(ubyte b, uint line = 0){
if(capacity < count + 1){
uint oldCapacity = capacity;
capacity = GROW_CAPACITY(oldCapacity);
code = GROW_ARRAY!ubyte(code, oldCapacity, capacity);
lines = GROW_ARRAY!uint(lines, oldCapacity, capacity);
}
code[count] = b;
lines[count] = line;
count++;
void write(in ubyte[] bytes, uint line = 0){
foreach(b; bytes)
write(b, line);
}
int addConstant(Value value){
int index = cast(int)constants.values[0 .. constants.count].countUntil(value);
void write(ubyte b, uint line = 0){
code ~= b;
lines ~= line;
}
size_t addConstant(Value value){
long index = constants[].countUntil(value);
if(index >= 0)
return index;
assert(constants.count <= ubyte.max);
constants.write(value);
constants ~= value;
return constants.count - 1;
}
void free(){
FREE_ARRAY!ubyte(code, capacity);
FREE_ARRAY!uint(lines, capacity);
code.free();
lines.free();
constants.free();
initialise();
}

View file

@ -7,17 +7,26 @@ import clox.parser;
import clox.chunk;
import clox.emitter;
import clox.dbg;
import clox.container.dynarray;
struct Compiler{
Scanner scanner;
Parser parser;
Emitter emitter;
struct Local{
enum Uninitialised = -1;
Token name;
int depth;
}
DynArray!Local locals;
int scopeDepth;
private Chunk* compilingChunk;
Chunk* currentChunk() => compilingChunk;
bool compile(const(char)* source, Chunk* chunk){
scanner.initialise(source);
parser.initialise(&this);
emitter.initialise(&this);
locals.initialise();
compilingChunk = chunk;
parser.advance();
@ -33,6 +42,7 @@ struct Compiler{
if(!parser.hadError)
currentChunk.disassembleChunk();
}
locals.free();
}
}

View file

@ -0,0 +1,45 @@
module clox.container.dynarray;
import clox.memory;
struct DynArray(T){
size_t count;
size_t capacity;
T* ptr;
void initialise(){
count = 0;
capacity = 0;
ptr = null;
}
void opOpAssign(string op: "~")(in T value){
if(capacity < count + 1){
size_t oldCapacity = capacity;
capacity = GROW_CAPACITY(oldCapacity);
ptr = GROW_ARRAY!T(ptr, oldCapacity, capacity);
}
ptr[count] = value;
count++;
}
auto opSlice(){
assert(ptr || !count);
return ptr[0 .. count];
}
ref auto opIndex(size_t i){
assert(ptr && count);
return ptr[i];
}
size_t opDollar(size_t pos: 0)(){
return count;
}
void free(){
if(ptr)
FREE_ARRAY!T(ptr, capacity);
initialise();
}
auto pop(){
assert(count);
count--;
return this[count-1];
}
}

View file

@ -1,26 +1,30 @@
module clox.container.stack;
struct Stack(T, size_t N){
@nogc: nothrow:
import clox.container.dynarray;
struct Stack(T){
T* top;
T[N] data;
/* invariant{ assert(top <= data.ptr + N); assert(top >= data.ptr); } */
void reset(){
private DynArray!T data;
void initialise(){
data.initialise();
top = data.ptr;
}
void push(T value){
assert(top < data.ptr + N);
debug assert(*top is T.init);
*(top++) = value;
void opOpAssign(string op: "~")(T value){
data ~= value;
top = data.ptr + data.count;
}
T pop(){
assert(top > data.ptr);
T t = *(--top);
debug *(top) = T.init;
assert(data.count-- >= 0);
return t;
}
const(T)[] live() const @safe{
return data[0 .. (top - data.ptr)];
ref T opIndex(size_t i) => data[i];
const(T)[] live(){
return data[];
}
void free(){
data.free();
}
}

View file

@ -10,7 +10,7 @@ import clox.memory;
enum TABLE_MAX_LOAD = 0.75;
struct Table{
uint count, capacity;
size_t count, capacity;
Entry* entries;
struct Entry{
Obj.String* key;
@ -25,7 +25,7 @@ struct Table{
FREE_ARRAY!Entry(entries, capacity);
initialise();
}
private void adjustCapacity(uint cap){
private void adjustCapacity(size_t cap){
Entry* ent = ALLOCATE!Entry(cap);
for(int i = 0; i < cap; i++){
ent[i].key = null;
@ -46,7 +46,7 @@ struct Table{
entries = ent;
capacity = cap;
}
private Entry* findEntry(Entry* entries, int capacity, in Obj.String* key){
private Entry* findEntry(Entry* entries, size_t capacity, in Obj.String* key){
uint index = key.hash % capacity;
Entry* tombstone = null;
while(true){
@ -66,7 +66,7 @@ struct Table{
}
bool set(Obj.String* key, Value value){
if(count + 1 > capacity * TABLE_MAX_LOAD){
uint cap = GROW_CAPACITY(capacity);
size_t cap = GROW_CAPACITY(capacity);
adjustCapacity(cap);
}
Entry* entry = findEntry(entries, capacity, key);
@ -121,12 +121,13 @@ struct Table{
}
unittest{
import clox.vm : vm;
Table tbl;
tbl.initialise();
scope(exit)
scope(exit){
tbl.free();
scope(exit)
freeObjects();
vm.free();
}
assert(tbl.count == 0);
@ -146,7 +147,7 @@ unittest{
assert(tbl.count == 1);
foreach(i; 0..25){
Obj.String* str2 = Obj.String.copy("hello");
Obj.String* str2 = Obj.String.copy("hi 2");
tbl.set(str2, Value.from(i));
assert(tbl.get(str2, val));
assert(val.asNumber == i);

View file

@ -0,0 +1,73 @@
module clox.container.varint;
struct VarUint{
import std.bitmanip;
nothrow: @nogc:
uint i;
ubyte len;
private ubyte[4] data;
this(size_t l) @safe {
if(l < 0b1000_0000){
len = 1;
data[0] = (cast(ubyte)l);
return;
}
if(l < 0b0100_0000__0000_0000){
len = 2;
data[0 .. 2] = nativeToBigEndian(cast(ushort)l);
data[0] |= 0b1000_0000;
return;
}
if(l < 0b0010_0000__0000_0000__0000_0000__0000_0000){
len = 4;
data[0 .. 4] = nativeToBigEndian(cast(uint)l);
data[0] |= 0b1100_0000;
return;
}
assert(0);
}
static VarUint read(in ubyte* data){
VarUint v;
ubyte a = data[0];
if((data[0] & 0b1000_0000) == 0){
v.i = a;
v.len = 1;
return v;
}
if((a & 0b0100_0000) == 0){
ubyte[2] d = data[0 .. 2];
d[0] &= 0b0111_1111;
v.i = bigEndianToNative!ushort(d);
v.len = 2;
return v;
}
if((a & 0b0010_0000) == 0){
ubyte[4] d = data[0 .. 4];
d[0] &= 0b0011_1111;
v.i = bigEndianToNative!uint(d);
v.len = 4;
return v;
}
assert(0);
}
ubyte[] bytes(){
return data[0 .. len];
}
}
unittest{
import std.range;
assert(VarUint(5).bytes.length == 1);
assert(VarUint(127).bytes.length == 1);
assert(VarUint(128).bytes.length == 2);
assert(VarUint(536_870_911).bytes.length == 4);
foreach(i; [
0, 1, 2, 5,
150, 127, 128,
536_870_911,
ushort.max * 100
]){
auto vi = VarUint(i);
assert(i == VarUint.read(vi.bytes.ptr).i);
}
}

View file

@ -7,32 +7,35 @@ import std.traits : EnumMembers, hasUDA, getUDAs;
import clox.chunk;
import clox.value;
import clox.util;
import clox.container.varint;
private int simpleInstruction(alias OpCode op)(const char* name, int offset){
import std.stdio;
private long simpleInstruction(alias OpCode op)(const char* name, long offset){
enum c = getUDAs!(op, OpColour)[0];
printf(colour!("%-27s ", c.r, c.g, c.b).ptr, name);
return offset + 1;
}
private int constantInstruction(alias OpCode op)(const char* name, Chunk* chunk, int offset){
private long constantInstruction(alias OpCode op)(const char* name, Chunk* chunk, long offset){
VarUint constant = VarUint.read(&chunk.code[offset + 1]);
enum c = getUDAs!(op, OpColour)[0];
ubyte constant = chunk.code[offset + 1];
printf(ctEval!(colour!("%-14s", c.r, c.g, c.b) ~ colour!(" %4d ", Colour.Black)).ptr, name, constant);
int pl = chunk.constants.values[constant].print();
printf(ctEval!(colour!("%-14s", c.r, c.g, c.b) ~ colour!(" %4d ", Colour.Black)).ptr, name, constant.i);
long pl = chunk.constants[constant.i].print();
foreach(i; 0 .. 16-pl)
printf(" ");
return offset + 2;
return offset + 1 + constant.len;
}
void disassembleChunk(Chunk* chunk, const char* name = "chunk"){
printf(" == %s ==\n", name);
for(int offset = 0; offset < chunk.count;){
for(long offset = 0; offset < chunk.code.count;){
offset = disassembleInstruction(chunk, offset);
printf("\n");
}
}
int disassembleInstruction(Chunk* chunk, int offset){
printf("%5d ", offset);
long disassembleInstruction(Chunk* chunk, long offset){
printf("%5ld ", offset);
if(offset > 0 && chunk.lines[offset] == chunk.lines[offset - 1]){
printf(colour!(" | ", Colour.Black).ptr);
} else {
@ -48,7 +51,7 @@ int disassembleInstruction(Chunk* chunk, int offset){
return simpleInstruction!e(e.stringof, offset);
}
}
default: printf("Unknown opcode %d", instruction);
default: printf("(Unknown opcode %d)", instruction);
return offset + 1;
}
}

View file

@ -5,6 +5,7 @@ import core.stdc.stdio;
import clox.chunk;
import clox.compiler;
import clox.value;
import clox.container.varint;
struct Emitter{
Compiler* compiler;
@ -13,18 +14,19 @@ struct Emitter{
void initialise(Compiler* compiler){
this.compiler = compiler;
}
void emit(ubyte[] bytes...){
foreach(b; bytes)
void emit(Args...)(Args a){
static foreach(b; a)
compiler.currentChunk.write(b, compiler.parser.previous.line);
}
void emitReturn(){
emit(OpCode.Return);
}
void emitConstant(Value value){
emit(OpCode.Constant, cast(ubyte)makeConstant(value));
size_t c = makeConstant(value);
emit(OpCode.Constant, VarUint(c).bytes);
}
uint makeConstant(Value value){
uint constant = compiler.currentChunk.addConstant(value);
size_t makeConstant(Value value){
size_t constant = compiler.currentChunk.addConstant(value);
return constant;
}
}

View file

@ -18,6 +18,7 @@ int interpretResult(VM.InterpretResult result){
}
int runPrompt(){
vm.isREPL = true;
char[1024 * 4] line;
while(true){
printf(colour!("lox> ", Colour.Green).ptr);

View file

@ -2,7 +2,7 @@ module clox.memory;
import core.stdc.stdlib;
auto GROW_CAPACITY(uint capacity) => capacity < 8 ? 8 : capacity * 2;
auto GROW_CAPACITY(size_t capacity) => capacity < 8 ? 8 : capacity * 2;
auto GROW_ARRAY(T)(T* ptr, size_t oldCount, size_t newCount) => cast(T*)reallocate(ptr, T.sizeof * oldCount, T.sizeof * newCount);
auto FREE_ARRAY(T)(T* ptr, size_t oldCount) => reallocate!T(ptr, T.sizeof * oldCount, 0);
auto FREE(T)(T* ptr) => reallocate(ptr, T.sizeof, 0);

View file

@ -10,6 +10,8 @@ import clox.parserules;
import clox.util;
import clox.object;
import clox.value;
import clox.vm;
import clox.container.varint;
struct Parser{
Compiler* compiler;
@ -48,11 +50,16 @@ struct Parser{
}
void expressionStatement(){
expression();
consume(Token.Type.Semicolon, "Expect ';' after expression.");
compiler.emitter.emit(OpCode.Pop);
if(vm.isREPL){
match(Token.Type.Semicolon);
compiler.emitter.emit(OpCode.Print);
} else {
consume(Token.Type.Semicolon, "Expect ';' after expression.");
compiler.emitter.emit(OpCode.Pop);
}
}
void varDeclaration(){
ubyte global = parseVariable("Expect variable name.");
long global = parseVariable("Expect variable name.");
if(match(Token.Type.Equal))
expression();
else
@ -66,12 +73,16 @@ struct Parser{
else
statement();
if(compiler.parser.panicMode)
synchronize();
synchronise();
}
void statement(){
if(match(Token.Type.Print))
if(match(Token.Type.Print)){
printStatement();
else
} else if(match(Token.Type.LeftBrace)){
beginScope();
block();
endScope();
} else
expressionStatement();
}
void printStatement(){
@ -79,25 +90,87 @@ struct Parser{
consume(Token.Type.Semicolon, "Expect ';' after value.");
compiler.emitter.emit(OpCode.Print);
}
void defineVariable(ubyte global){
compiler.emitter.emit(OpCode.DefineGlobal, global);
void block(){
while(!check(Token.Type.RightBrace) && !check(Token.Type.EOF))
declaration();
consume(Token.Type.RightBrace, "Expect '}' after block.");
}
ubyte parseVariable(const char* errorMessage){
void defineVariable(long global){
if(compiler.scopeDepth > 0){
markInitialised();
return;
}
compiler.emitter.emit(OpCode.DefineGlobal, VarUint(global).bytes);
}
void markInitialised(){
compiler.locals[compiler.locals.count - 1].depth = compiler.scopeDepth;
}
void declareVariable(){
if(compiler.scopeDepth == 0)
return;
Token* name = &compiler.parser.previous;
for(long i = compiler.locals.count - 1; i >= 0; i--){
Compiler.Local* local = &compiler.locals[i];
if(local.depth != Compiler.Local.Uninitialised && local.depth < compiler.scopeDepth)
break;
if(name.lexeme == local.name.lexeme)
error("Already a variable with this name in this scope.");
}
addLocal(*name);
}
long parseVariable(const char* errorMessage){
consume(Token.Type.Identifier, errorMessage);
declareVariable();
if(compiler.scopeDepth > 0)
return 0;
return identifierConstant(&previous);
}
ubyte identifierConstant(Token* name){
long identifierConstant(Token* name){
Value nameVal = Value.from(Obj.String.copy(name.lexeme));
return cast(ubyte)compiler.emitter.makeConstant(nameVal);
return compiler.emitter.makeConstant(nameVal);
}
void namedVariable(Token name, bool canAssign){
ubyte arg = compiler.parser.identifierConstant(&name);
OpCode getOp, setOp;
long arg = resolveLocal(&name);
if(arg != -1){
getOp = OpCode.GetLocal;
setOp = OpCode.SetLocal;
} else {
arg = identifierConstant(&name);
getOp = OpCode.GetGlobal;
setOp = OpCode.SetGlobal;
}
if(canAssign && match(Token.Type.Equal)){
expression();
compiler.emitter.emit(OpCode.SetGlobal, arg);
compiler.emitter.emit(setOp, VarUint(arg).bytes);
} else {
compiler.emitter.emit(OpCode.GetGlobal, arg);
compiler.emitter.emit(getOp, VarUint(arg).bytes);
}
}
long resolveLocal(Token* name){
for(long i = compiler.locals.count - 1; i >= 0; i--){
Compiler.Local* local = &compiler.locals[i];
if(name.lexeme == local.name.lexeme){
if(local.depth == Compiler.Local.Uninitialised)
error("Can't read local variable in its own initialiser.");
return i;
}
}
return -1;
}
void addLocal(Token name){
compiler.locals ~= Compiler.Local(name, Compiler.Local.Uninitialised);
}
void beginScope(){
compiler.scopeDepth++;
}
void endScope(){
assert(--compiler.scopeDepth >= 0);
while(compiler.locals.count > 0 && compiler.locals[compiler.locals.count - 1].depth > compiler.scopeDepth){
compiler.emitter.emit(OpCode.Pop);
compiler.locals.count--;
}
}
@ -119,7 +192,7 @@ struct Parser{
error("Invalid assignment target.");
}
void synchronize(){
void synchronise(){
panicMode = false;
while(current.type != Token.Type.EOF){
if(previous.type == Token.Type.Semicolon)

View file

@ -99,7 +99,7 @@ struct Scanner{
while(true){
char c = peek();
switch(c){
case ' ', '\r':
case ' ', '\r', '\t':
advance();
break;
case '\n':

View file

@ -71,29 +71,3 @@ struct Value{
}
}
struct ValueArray{
uint count;
uint capacity;
Value* values;
void initialise(){
count = 0;
capacity = 0;
values = null;
}
void write(Value value){
if(capacity < count + 1){
int oldCapacity = capacity;
capacity = GROW_CAPACITY(oldCapacity);
values = GROW_ARRAY!Value(values, oldCapacity, capacity);
}
values[count] = value;
count++;
}
void free(){
if(values)
FREE_ARRAY!Value(values, capacity);
initialise();
}
}

View file

@ -12,19 +12,21 @@ import clox.compiler;
import clox.memory;
import clox.container.stack;
import clox.container.table;
import clox.container.varint;
VM vm;
struct VM{
Chunk* chunk;
ubyte* ip;
Stack!(Value, 256) stack;
Stack!Value stack;
Table globals;
Table strings;
Obj* objects;
bool isREPL;
enum InterpretResult{ Ok, CompileError, RuntimeError }
void initialise(){
stack.reset();
stack.initialise();
strings.initialise();
globals.initialise();
}
@ -32,6 +34,7 @@ struct VM{
freeObjects();
strings.free();
globals.free();
stack.free();
}
InterpretResult interpret(const char* source){
Chunk cnk;
@ -42,21 +45,25 @@ struct VM{
if(!compiler.compile(source, &cnk))
return InterpretResult.CompileError;
this.chunk = &cnk;
this.ip = cnk.code;
this.ip = cnk.code.ptr;
return run();
}
void runtimeError(Args...)(const char* format, Args args){
fprintf(stderr, format, args);
fputs("\n", stderr);
size_t instruction = vm.ip - vm.chunk.code - 1;
int line = vm.chunk.lines[instruction];
size_t instruction = vm.ip - vm.chunk.code.ptr - 1;
uint line = vm.chunk.lines[instruction];
fprintf(stderr, "[line %d] in script\n", line);
stack.reset();
}
InterpretResult run(){
ubyte readByte() => *vm.ip++;
auto readConstant() => chunk.constants.values[readByte()];
ubyte readByte() => *ip++;
long readVarUint(){
VarUint vi = VarUint.read(ip);
ip += vi.len;
return vi.i;
}
Value readConstant() => chunk.constants[readVarUint()];
Obj.String* readString() => readConstant().asObj.asString;
Value peek(int distance = 0) => stack.top[-1 - distance];
bool checkBinaryType(alias type)() => peek(0).isType(type) && peek(1).isType(type);
@ -68,12 +75,12 @@ struct VM{
}
auto b = stack.pop().as!pre;
auto a = stack.pop().as!pre;
stack.push(Value.from(mixin("a", op, "b")));
stack ~= Value.from(mixin("a", op, "b"));
return 0;
}
while(true){
debug(traceExec){
disassembleInstruction(vm.chunk, cast(int)(vm.ip - vm.chunk.code));
disassembleInstruction(vm.chunk, vm.ip - vm.chunk.code.ptr);
printf(" ");
foreach(slot; stack.live){
printf("");
@ -86,13 +93,21 @@ struct VM{
opSwitch: final switch(instruction = cast(OpCode)readByte()){
case OpCode.Constant:
Value constant = readConstant();
stack.push(constant);
stack ~= constant;
break;
case OpCode.Nil: stack.push(Value.nil); break;
case OpCode.True: stack.push(Value.from(true)); break;
case OpCode.False: stack.push(Value.from(false)); break;
case OpCode.Nil: stack ~= Value.nil; break;
case OpCode.True: stack ~= Value.from(true); break;
case OpCode.False: stack ~= Value.from(false); break;
case OpCode.Pop: stack.pop(); break;
case OpCode.GetLocal:
long slot = readVarUint();
stack ~= stack[slot];
break;
case OpCode.SetLocal:
long slot = readVarUint();
stack[slot] = peek(0);
break;
case OpCode.GetGlobal:
Obj.String* name = readString();
Value value;
@ -100,7 +115,7 @@ struct VM{
runtimeError("Undefined variable '%s'.", name.chars.ptr);
return InterpretResult.RuntimeError;
}
stack.push(value);
stack ~= value;
break;
case OpCode.DefineGlobal:
Obj.String* name = readString();
@ -135,7 +150,7 @@ struct VM{
Obj.String* b = stack.pop().asObj.asString;
Obj.String* a = stack.pop().asObj.asString;
Obj.String* result = Obj.String.concat(a, b);
stack.push(Value.from(result));
stack ~= Value.from(result);
break opSwitch;
}
}
@ -145,14 +160,14 @@ struct VM{
}
case OpCode.Not:
stack.push(Value.from(stack.pop().isFalsey));
stack ~= Value.from(stack.pop().isFalsey);
break;
case OpCode.Negate:
if(!peek(0).isType(Value.Type.Number)){
runtimeError("Operand must be a number.");
return InterpretResult.RuntimeError;
}
stack.push(Value.from(-stack.pop().asNumber));
stack ~= Value.from(-stack.pop().asNumber);
break;
case OpCode.Print:
stack.pop().print();

507
test/biglocals.lox Normal file
View file

@ -0,0 +1,507 @@
var sum = 0;
{
var v1 = 1; sum = sum + v1;
var v2 = 2; sum = sum + v2;
var v3 = 3; sum = sum + v3;
var v4 = 4; sum = sum + v4;
var v5 = 5; sum = sum + v5;
var v6 = 6; sum = sum + v6;
var v7 = 7; sum = sum + v7;
var v8 = 8; sum = sum + v8;
var v9 = 9; sum = sum + v9;
var v10 = 10; sum = sum + v10;
var v11 = 11; sum = sum + v11;
var v12 = 12; sum = sum + v12;
var v13 = 13; sum = sum + v13;
var v14 = 14; sum = sum + v14;
var v15 = 15; sum = sum + v15;
var v16 = 16; sum = sum + v16;
var v17 = 17; sum = sum + v17;
var v18 = 18; sum = sum + v18;
var v19 = 19; sum = sum + v19;
var v20 = 20; sum = sum + v20;
var v21 = 21; sum = sum + v21;
var v22 = 22; sum = sum + v22;
var v23 = 23; sum = sum + v23;
var v24 = 24; sum = sum + v24;
var v25 = 25; sum = sum + v25;
var v26 = 26; sum = sum + v26;
var v27 = 27; sum = sum + v27;
var v28 = 28; sum = sum + v28;
var v29 = 29; sum = sum + v29;
var v30 = 30; sum = sum + v30;
var v31 = 31; sum = sum + v31;
var v32 = 32; sum = sum + v32;
var v33 = 33; sum = sum + v33;
var v34 = 34; sum = sum + v34;
var v35 = 35; sum = sum + v35;
var v36 = 36; sum = sum + v36;
var v37 = 37; sum = sum + v37;
var v38 = 38; sum = sum + v38;
var v39 = 39; sum = sum + v39;
var v40 = 40; sum = sum + v40;
var v41 = 41; sum = sum + v41;
var v42 = 42; sum = sum + v42;
var v43 = 43; sum = sum + v43;
var v44 = 44; sum = sum + v44;
var v45 = 45; sum = sum + v45;
var v46 = 46; sum = sum + v46;
var v47 = 47; sum = sum + v47;
var v48 = 48; sum = sum + v48;
var v49 = 49; sum = sum + v49;
var v50 = 50; sum = sum + v50;
var v51 = 51; sum = sum + v51;
var v52 = 52; sum = sum + v52;
var v53 = 53; sum = sum + v53;
var v54 = 54; sum = sum + v54;
var v55 = 55; sum = sum + v55;
var v56 = 56; sum = sum + v56;
var v57 = 57; sum = sum + v57;
var v58 = 58; sum = sum + v58;
var v59 = 59; sum = sum + v59;
var v60 = 60; sum = sum + v60;
var v61 = 61; sum = sum + v61;
var v62 = 62; sum = sum + v62;
var v63 = 63; sum = sum + v63;
var v64 = 64; sum = sum + v64;
var v65 = 65; sum = sum + v65;
var v66 = 66; sum = sum + v66;
var v67 = 67; sum = sum + v67;
var v68 = 68; sum = sum + v68;
var v69 = 69; sum = sum + v69;
var v70 = 70; sum = sum + v70;
var v71 = 71; sum = sum + v71;
var v72 = 72; sum = sum + v72;
var v73 = 73; sum = sum + v73;
var v74 = 74; sum = sum + v74;
var v75 = 75; sum = sum + v75;
var v76 = 76; sum = sum + v76;
var v77 = 77; sum = sum + v77;
var v78 = 78; sum = sum + v78;
var v79 = 79; sum = sum + v79;
var v80 = 80; sum = sum + v80;
var v81 = 81; sum = sum + v81;
var v82 = 82; sum = sum + v82;
var v83 = 83; sum = sum + v83;
var v84 = 84; sum = sum + v84;
var v85 = 85; sum = sum + v85;
var v86 = 86; sum = sum + v86;
var v87 = 87; sum = sum + v87;
var v88 = 88; sum = sum + v88;
var v89 = 89; sum = sum + v89;
var v90 = 90; sum = sum + v90;
var v91 = 91; sum = sum + v91;
var v92 = 92; sum = sum + v92;
var v93 = 93; sum = sum + v93;
var v94 = 94; sum = sum + v94;
var v95 = 95; sum = sum + v95;
var v96 = 96; sum = sum + v96;
var v97 = 97; sum = sum + v97;
var v98 = 98; sum = sum + v98;
var v99 = 99; sum = sum + v99;
var v100 = 100; sum = sum + v100;
var v101 = 101; sum = sum + v101;
var v102 = 102; sum = sum + v102;
var v103 = 103; sum = sum + v103;
var v104 = 104; sum = sum + v104;
var v105 = 105; sum = sum + v105;
var v106 = 106; sum = sum + v106;
var v107 = 107; sum = sum + v107;
var v108 = 108; sum = sum + v108;
var v109 = 109; sum = sum + v109;
var v110 = 110; sum = sum + v110;
var v111 = 111; sum = sum + v111;
var v112 = 112; sum = sum + v112;
var v113 = 113; sum = sum + v113;
var v114 = 114; sum = sum + v114;
var v115 = 115; sum = sum + v115;
var v116 = 116; sum = sum + v116;
var v117 = 117; sum = sum + v117;
var v118 = 118; sum = sum + v118;
var v119 = 119; sum = sum + v119;
var v120 = 120; sum = sum + v120;
var v121 = 121; sum = sum + v121;
var v122 = 122; sum = sum + v122;
var v123 = 123; sum = sum + v123;
var v124 = 124; sum = sum + v124;
var v125 = 125; sum = sum + v125;
var v126 = 126; sum = sum + v126;
var v127 = 127; sum = sum + v127;
var v128 = 128; sum = sum + v128;
var v129 = 129; sum = sum + v129;
var v130 = 130; sum = sum + v130;
var v131 = 131; sum = sum + v131;
var v132 = 132; sum = sum + v132;
var v133 = 133; sum = sum + v133;
var v134 = 134; sum = sum + v134;
var v135 = 135; sum = sum + v135;
var v136 = 136; sum = sum + v136;
var v137 = 137; sum = sum + v137;
var v138 = 138; sum = sum + v138;
var v139 = 139; sum = sum + v139;
var v140 = 140; sum = sum + v140;
var v141 = 141; sum = sum + v141;
var v142 = 142; sum = sum + v142;
var v143 = 143; sum = sum + v143;
var v144 = 144; sum = sum + v144;
var v145 = 145; sum = sum + v145;
var v146 = 146; sum = sum + v146;
var v147 = 147; sum = sum + v147;
var v148 = 148; sum = sum + v148;
var v149 = 149; sum = sum + v149;
var v150 = 150; sum = sum + v150;
var v151 = 151; sum = sum + v151;
var v152 = 152; sum = sum + v152;
var v153 = 153; sum = sum + v153;
var v154 = 154; sum = sum + v154;
var v155 = 155; sum = sum + v155;
var v156 = 156; sum = sum + v156;
var v157 = 157; sum = sum + v157;
var v158 = 158; sum = sum + v158;
var v159 = 159; sum = sum + v159;
var v160 = 160; sum = sum + v160;
var v161 = 161; sum = sum + v161;
var v162 = 162; sum = sum + v162;
var v163 = 163; sum = sum + v163;
var v164 = 164; sum = sum + v164;
var v165 = 165; sum = sum + v165;
var v166 = 166; sum = sum + v166;
var v167 = 167; sum = sum + v167;
var v168 = 168; sum = sum + v168;
var v169 = 169; sum = sum + v169;
var v170 = 170; sum = sum + v170;
var v171 = 171; sum = sum + v171;
var v172 = 172; sum = sum + v172;
var v173 = 173; sum = sum + v173;
var v174 = 174; sum = sum + v174;
var v175 = 175; sum = sum + v175;
var v176 = 176; sum = sum + v176;
var v177 = 177; sum = sum + v177;
var v178 = 178; sum = sum + v178;
var v179 = 179; sum = sum + v179;
var v180 = 180; sum = sum + v180;
var v181 = 181; sum = sum + v181;
var v182 = 182; sum = sum + v182;
var v183 = 183; sum = sum + v183;
var v184 = 184; sum = sum + v184;
var v185 = 185; sum = sum + v185;
var v186 = 186; sum = sum + v186;
var v187 = 187; sum = sum + v187;
var v188 = 188; sum = sum + v188;
var v189 = 189; sum = sum + v189;
var v190 = 190; sum = sum + v190;
var v191 = 191; sum = sum + v191;
var v192 = 192; sum = sum + v192;
var v193 = 193; sum = sum + v193;
var v194 = 194; sum = sum + v194;
var v195 = 195; sum = sum + v195;
var v196 = 196; sum = sum + v196;
var v197 = 197; sum = sum + v197;
var v198 = 198; sum = sum + v198;
var v199 = 199; sum = sum + v199;
var v200 = 200; sum = sum + v200;
var v201 = 201; sum = sum + v201;
var v202 = 202; sum = sum + v202;
var v203 = 203; sum = sum + v203;
var v204 = 204; sum = sum + v204;
var v205 = 205; sum = sum + v205;
var v206 = 206; sum = sum + v206;
var v207 = 207; sum = sum + v207;
var v208 = 208; sum = sum + v208;
var v209 = 209; sum = sum + v209;
var v210 = 210; sum = sum + v210;
var v211 = 211; sum = sum + v211;
var v212 = 212; sum = sum + v212;
var v213 = 213; sum = sum + v213;
var v214 = 214; sum = sum + v214;
var v215 = 215; sum = sum + v215;
var v216 = 216; sum = sum + v216;
var v217 = 217; sum = sum + v217;
var v218 = 218; sum = sum + v218;
var v219 = 219; sum = sum + v219;
var v220 = 220; sum = sum + v220;
var v221 = 221; sum = sum + v221;
var v222 = 222; sum = sum + v222;
var v223 = 223; sum = sum + v223;
var v224 = 224; sum = sum + v224;
var v225 = 225; sum = sum + v225;
var v226 = 226; sum = sum + v226;
var v227 = 227; sum = sum + v227;
var v228 = 228; sum = sum + v228;
var v229 = 229; sum = sum + v229;
var v230 = 230; sum = sum + v230;
var v231 = 231; sum = sum + v231;
var v232 = 232; sum = sum + v232;
var v233 = 233; sum = sum + v233;
var v234 = 234; sum = sum + v234;
var v235 = 235; sum = sum + v235;
var v236 = 236; sum = sum + v236;
var v237 = 237; sum = sum + v237;
var v238 = 238; sum = sum + v238;
var v239 = 239; sum = sum + v239;
var v240 = 240; sum = sum + v240;
var v241 = 241; sum = sum + v241;
var v242 = 242; sum = sum + v242;
var v243 = 243; sum = sum + v243;
var v244 = 244; sum = sum + v244;
var v245 = 245; sum = sum + v245;
var v246 = 246; sum = sum + v246;
var v247 = 247; sum = sum + v247;
var v248 = 248; sum = sum + v248;
var v249 = 249; sum = sum + v249;
var v250 = 250; sum = sum + v250;
var v251 = 251; sum = sum + v251;
var v252 = 252; sum = sum + v252;
var v253 = 253; sum = sum + v253;
var v254 = 254; sum = sum + v254;
var v255 = 255; sum = sum + v255;
var v256 = 256; sum = sum + v256;
var v257 = 257; sum = sum + v257;
var v258 = 258; sum = sum + v258;
var v259 = 259; sum = sum + v259;
var v260 = 260; sum = sum + v260;
var v261 = 261; sum = sum + v261;
var v262 = 262; sum = sum + v262;
var v263 = 263; sum = sum + v263;
var v264 = 264; sum = sum + v264;
var v265 = 265; sum = sum + v265;
var v266 = 266; sum = sum + v266;
var v267 = 267; sum = sum + v267;
var v268 = 268; sum = sum + v268;
var v269 = 269; sum = sum + v269;
var v270 = 270; sum = sum + v270;
var v271 = 271; sum = sum + v271;
var v272 = 272; sum = sum + v272;
var v273 = 273; sum = sum + v273;
var v274 = 274; sum = sum + v274;
var v275 = 275; sum = sum + v275;
var v276 = 276; sum = sum + v276;
var v277 = 277; sum = sum + v277;
var v278 = 278; sum = sum + v278;
var v279 = 279; sum = sum + v279;
var v280 = 280; sum = sum + v280;
var v281 = 281; sum = sum + v281;
var v282 = 282; sum = sum + v282;
var v283 = 283; sum = sum + v283;
var v284 = 284; sum = sum + v284;
var v285 = 285; sum = sum + v285;
var v286 = 286; sum = sum + v286;
var v287 = 287; sum = sum + v287;
var v288 = 288; sum = sum + v288;
var v289 = 289; sum = sum + v289;
var v290 = 290; sum = sum + v290;
var v291 = 291; sum = sum + v291;
var v292 = 292; sum = sum + v292;
var v293 = 293; sum = sum + v293;
var v294 = 294; sum = sum + v294;
var v295 = 295; sum = sum + v295;
var v296 = 296; sum = sum + v296;
var v297 = 297; sum = sum + v297;
var v298 = 298; sum = sum + v298;
var v299 = 299; sum = sum + v299;
var v300 = 300; sum = sum + v300;
var v301 = 301; sum = sum + v301;
var v302 = 302; sum = sum + v302;
var v303 = 303; sum = sum + v303;
var v304 = 304; sum = sum + v304;
var v305 = 305; sum = sum + v305;
var v306 = 306; sum = sum + v306;
var v307 = 307; sum = sum + v307;
var v308 = 308; sum = sum + v308;
var v309 = 309; sum = sum + v309;
var v310 = 310; sum = sum + v310;
var v311 = 311; sum = sum + v311;
var v312 = 312; sum = sum + v312;
var v313 = 313; sum = sum + v313;
var v314 = 314; sum = sum + v314;
var v315 = 315; sum = sum + v315;
var v316 = 316; sum = sum + v316;
var v317 = 317; sum = sum + v317;
var v318 = 318; sum = sum + v318;
var v319 = 319; sum = sum + v319;
var v320 = 320; sum = sum + v320;
var v321 = 321; sum = sum + v321;
var v322 = 322; sum = sum + v322;
var v323 = 323; sum = sum + v323;
var v324 = 324; sum = sum + v324;
var v325 = 325; sum = sum + v325;
var v326 = 326; sum = sum + v326;
var v327 = 327; sum = sum + v327;
var v328 = 328; sum = sum + v328;
var v329 = 329; sum = sum + v329;
var v330 = 330; sum = sum + v330;
var v331 = 331; sum = sum + v331;
var v332 = 332; sum = sum + v332;
var v333 = 333; sum = sum + v333;
var v334 = 334; sum = sum + v334;
var v335 = 335; sum = sum + v335;
var v336 = 336; sum = sum + v336;
var v337 = 337; sum = sum + v337;
var v338 = 338; sum = sum + v338;
var v339 = 339; sum = sum + v339;
var v340 = 340; sum = sum + v340;
var v341 = 341; sum = sum + v341;
var v342 = 342; sum = sum + v342;
var v343 = 343; sum = sum + v343;
var v344 = 344; sum = sum + v344;
var v345 = 345; sum = sum + v345;
var v346 = 346; sum = sum + v346;
var v347 = 347; sum = sum + v347;
var v348 = 348; sum = sum + v348;
var v349 = 349; sum = sum + v349;
var v350 = 350; sum = sum + v350;
var v351 = 351; sum = sum + v351;
var v352 = 352; sum = sum + v352;
var v353 = 353; sum = sum + v353;
var v354 = 354; sum = sum + v354;
var v355 = 355; sum = sum + v355;
var v356 = 356; sum = sum + v356;
var v357 = 357; sum = sum + v357;
var v358 = 358; sum = sum + v358;
var v359 = 359; sum = sum + v359;
var v360 = 360; sum = sum + v360;
var v361 = 361; sum = sum + v361;
var v362 = 362; sum = sum + v362;
var v363 = 363; sum = sum + v363;
var v364 = 364; sum = sum + v364;
var v365 = 365; sum = sum + v365;
var v366 = 366; sum = sum + v366;
var v367 = 367; sum = sum + v367;
var v368 = 368; sum = sum + v368;
var v369 = 369; sum = sum + v369;
var v370 = 370; sum = sum + v370;
var v371 = 371; sum = sum + v371;
var v372 = 372; sum = sum + v372;
var v373 = 373; sum = sum + v373;
var v374 = 374; sum = sum + v374;
var v375 = 375; sum = sum + v375;
var v376 = 376; sum = sum + v376;
var v377 = 377; sum = sum + v377;
var v378 = 378; sum = sum + v378;
var v379 = 379; sum = sum + v379;
var v380 = 380; sum = sum + v380;
var v381 = 381; sum = sum + v381;
var v382 = 382; sum = sum + v382;
var v383 = 383; sum = sum + v383;
var v384 = 384; sum = sum + v384;
var v385 = 385; sum = sum + v385;
var v386 = 386; sum = sum + v386;
var v387 = 387; sum = sum + v387;
var v388 = 388; sum = sum + v388;
var v389 = 389; sum = sum + v389;
var v390 = 390; sum = sum + v390;
var v391 = 391; sum = sum + v391;
var v392 = 392; sum = sum + v392;
var v393 = 393; sum = sum + v393;
var v394 = 394; sum = sum + v394;
var v395 = 395; sum = sum + v395;
var v396 = 396; sum = sum + v396;
var v397 = 397; sum = sum + v397;
var v398 = 398; sum = sum + v398;
var v399 = 399; sum = sum + v399;
var v400 = 400; sum = sum + v400;
var v401 = 401; sum = sum + v401;
var v402 = 402; sum = sum + v402;
var v403 = 403; sum = sum + v403;
var v404 = 404; sum = sum + v404;
var v405 = 405; sum = sum + v405;
var v406 = 406; sum = sum + v406;
var v407 = 407; sum = sum + v407;
var v408 = 408; sum = sum + v408;
var v409 = 409; sum = sum + v409;
var v410 = 410; sum = sum + v410;
var v411 = 411; sum = sum + v411;
var v412 = 412; sum = sum + v412;
var v413 = 413; sum = sum + v413;
var v414 = 414; sum = sum + v414;
var v415 = 415; sum = sum + v415;
var v416 = 416; sum = sum + v416;
var v417 = 417; sum = sum + v417;
var v418 = 418; sum = sum + v418;
var v419 = 419; sum = sum + v419;
var v420 = 420; sum = sum + v420;
var v421 = 421; sum = sum + v421;
var v422 = 422; sum = sum + v422;
var v423 = 423; sum = sum + v423;
var v424 = 424; sum = sum + v424;
var v425 = 425; sum = sum + v425;
var v426 = 426; sum = sum + v426;
var v427 = 427; sum = sum + v427;
var v428 = 428; sum = sum + v428;
var v429 = 429; sum = sum + v429;
var v430 = 430; sum = sum + v430;
var v431 = 431; sum = sum + v431;
var v432 = 432; sum = sum + v432;
var v433 = 433; sum = sum + v433;
var v434 = 434; sum = sum + v434;
var v435 = 435; sum = sum + v435;
var v436 = 436; sum = sum + v436;
var v437 = 437; sum = sum + v437;
var v438 = 438; sum = sum + v438;
var v439 = 439; sum = sum + v439;
var v440 = 440; sum = sum + v440;
var v441 = 441; sum = sum + v441;
var v442 = 442; sum = sum + v442;
var v443 = 443; sum = sum + v443;
var v444 = 444; sum = sum + v444;
var v445 = 445; sum = sum + v445;
var v446 = 446; sum = sum + v446;
var v447 = 447; sum = sum + v447;
var v448 = 448; sum = sum + v448;
var v449 = 449; sum = sum + v449;
var v450 = 450; sum = sum + v450;
var v451 = 451; sum = sum + v451;
var v452 = 452; sum = sum + v452;
var v453 = 453; sum = sum + v453;
var v454 = 454; sum = sum + v454;
var v455 = 455; sum = sum + v455;
var v456 = 456; sum = sum + v456;
var v457 = 457; sum = sum + v457;
var v458 = 458; sum = sum + v458;
var v459 = 459; sum = sum + v459;
var v460 = 460; sum = sum + v460;
var v461 = 461; sum = sum + v461;
var v462 = 462; sum = sum + v462;
var v463 = 463; sum = sum + v463;
var v464 = 464; sum = sum + v464;
var v465 = 465; sum = sum + v465;
var v466 = 466; sum = sum + v466;
var v467 = 467; sum = sum + v467;
var v468 = 468; sum = sum + v468;
var v469 = 469; sum = sum + v469;
var v470 = 470; sum = sum + v470;
var v471 = 471; sum = sum + v471;
var v472 = 472; sum = sum + v472;
var v473 = 473; sum = sum + v473;
var v474 = 474; sum = sum + v474;
var v475 = 475; sum = sum + v475;
var v476 = 476; sum = sum + v476;
var v477 = 477; sum = sum + v477;
var v478 = 478; sum = sum + v478;
var v479 = 479; sum = sum + v479;
var v480 = 480; sum = sum + v480;
var v481 = 481; sum = sum + v481;
var v482 = 482; sum = sum + v482;
var v483 = 483; sum = sum + v483;
var v484 = 484; sum = sum + v484;
var v485 = 485; sum = sum + v485;
var v486 = 486; sum = sum + v486;
var v487 = 487; sum = sum + v487;
var v488 = 488; sum = sum + v488;
var v489 = 489; sum = sum + v489;
var v490 = 490; sum = sum + v490;
var v491 = 491; sum = sum + v491;
var v492 = 492; sum = sum + v492;
var v493 = 493; sum = sum + v493;
var v494 = 494; sum = sum + v494;
var v495 = 495; sum = sum + v495;
var v496 = 496; sum = sum + v496;
var v497 = 497; sum = sum + v497;
var v498 = 498; sum = sum + v498;
var v499 = 499; sum = sum + v499;
var v500 = 500; sum = sum + v500;
}
print sum;

503
test/bigsum.lox Normal file
View file

@ -0,0 +1,503 @@
var x = 0 + 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500;
print x;

12
test/simplescope.lox Normal file
View file

@ -0,0 +1,12 @@
var a = "a";
{
var b = "b";
{
var c = "c";
print a + b + c;
}
var d = "d";
print a + b + d;
}