|
|
|
@ -7,7 +7,7 @@ module Lox
|
|
|
|
|
@scopes = []
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def resolve(values)
|
|
|
|
|
def resolve(*values)
|
|
|
|
|
values.each do
|
|
|
|
|
value.accept(self)
|
|
|
|
|
end
|
|
|
|
@ -15,11 +15,18 @@ module Lox
|
|
|
|
|
|
|
|
|
|
def visit_block(stmt)
|
|
|
|
|
with_scope do
|
|
|
|
|
resolve(stmt.stmts)
|
|
|
|
|
resolve(*stmt.stmts)
|
|
|
|
|
end
|
|
|
|
|
nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def visit_var(stmt)
|
|
|
|
|
declare(stmt.name)
|
|
|
|
|
resolve(stmt.initializer) if stmt.initializer
|
|
|
|
|
define(stmt.name)
|
|
|
|
|
nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def with_block
|
|
|
|
@ -28,6 +35,19 @@ module Lox
|
|
|
|
|
@scopes.pop
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def declare(name)
|
|
|
|
|
scope = @scopes.last
|
|
|
|
|
return if scope.nil?
|
|
|
|
|
|
|
|
|
|
scope[name.lexeme] = false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def define(name)
|
|
|
|
|
scope = @scopes.last
|
|
|
|
|
return if scope.nil?
|
|
|
|
|
|
|
|
|
|
scopes[name.lexeme] = true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|