mirror of
https://github.com/MorizzG/rlox.git
synced 2025-12-06 04:12:42 +00:00
minor stuff
This commit is contained in:
parent
128c2771dc
commit
f6dbc17f92
3 changed files with 20 additions and 15 deletions
|
|
@ -93,10 +93,12 @@ impl Display for Stmt {
|
||||||
else_branch,
|
else_branch,
|
||||||
} => {
|
} => {
|
||||||
writeln!(f, "if {condition}")?;
|
writeln!(f, "if {condition}")?;
|
||||||
|
|
||||||
match then_branch.as_ref() {
|
match then_branch.as_ref() {
|
||||||
Stmt::Block { .. } => write!(f, "{then_branch}")?,
|
Stmt::Block { .. } => write!(f, "{}", indent(then_branch.to_string()))?,
|
||||||
_ => write!(f, "{}", indent(then_branch.to_string()))?,
|
_ => write!(f, "{}", indent(then_branch.to_string()))?,
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(else_branch) = else_branch {
|
if let Some(else_branch) = else_branch {
|
||||||
writeln!(f, "\nelse")?;
|
writeln!(f, "\nelse")?;
|
||||||
match else_branch.as_ref() {
|
match else_branch.as_ref() {
|
||||||
|
|
@ -104,6 +106,7 @@ impl Display for Stmt {
|
||||||
_ => write!(f, "{}", indent(else_branch.to_string()))?,
|
_ => write!(f, "{}", indent(else_branch.to_string()))?,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Stmt::While { condition, body } => {
|
Stmt::While { condition, body } => {
|
||||||
|
|
|
||||||
|
|
@ -135,10 +135,6 @@ impl Eval for Expr {
|
||||||
}
|
}
|
||||||
Expr::Call { callee, args } => {
|
Expr::Call { callee, args } => {
|
||||||
let callee = callee.eval(env)?;
|
let callee = callee.eval(env)?;
|
||||||
/* let args = args
|
|
||||||
.iter()
|
|
||||||
.map(|arg| arg.eval(env))
|
|
||||||
.collect::<EvalResult<Vec<Value>>>()?; */
|
|
||||||
|
|
||||||
for arg in args {
|
for arg in args {
|
||||||
let arg = arg.eval(env)?;
|
let arg = arg.eval(env)?;
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ impl Resolver {
|
||||||
if let Some(local_scope) = self.local_scopes_mut().last_mut() {
|
if let Some(local_scope) = self.local_scopes_mut().last_mut() {
|
||||||
local_scope.insert(name, ResolveStatus::Defined);
|
local_scope.insert(name, ResolveStatus::Defined);
|
||||||
} else {
|
} else {
|
||||||
self.global_scope.insert(name, ResolveStatus::Declared);
|
self.global_scope.insert(name, ResolveStatus::Defined);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -119,8 +119,15 @@ impl Resolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_var(&mut self, name: &str) -> ResolverResult<Expr> {
|
fn resolve_var(&mut self, name: &str) -> ResolverResult<Expr> {
|
||||||
|
if name == "this" {
|
||||||
|
return Err(ResolverError::ThisOutsideMethod);
|
||||||
|
} else if name == "super" {
|
||||||
|
return Err(ResolverError::SuperOutsideMethod);
|
||||||
|
}
|
||||||
|
|
||||||
let mut level = 0;
|
let mut level = 0;
|
||||||
|
|
||||||
|
// resolve normal local variable
|
||||||
for scope in self.local_scopes().iter().rev() {
|
for scope in self.local_scopes().iter().rev() {
|
||||||
if scope.contains_key(name) {
|
if scope.contains_key(name) {
|
||||||
return Ok(Expr::local_variable(name, level));
|
return Ok(Expr::local_variable(name, level));
|
||||||
|
|
@ -128,6 +135,7 @@ impl Resolver {
|
||||||
level += 1;
|
level += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// resolve closure variable
|
||||||
for frame in self.frames.iter().rev().skip(1) {
|
for frame in self.frames.iter().rev().skip(1) {
|
||||||
for scope in frame.iter().rev() {
|
for scope in frame.iter().rev() {
|
||||||
if scope.contains_key(name) {
|
if scope.contains_key(name) {
|
||||||
|
|
@ -147,18 +155,14 @@ impl Resolver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// resolve global variable
|
||||||
if self.global_scope.contains_key(name) {
|
if self.global_scope.contains_key(name) {
|
||||||
return Ok(Expr::global_variable(name));
|
return Ok(Expr::global_variable(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
if name == "this" {
|
let name = name.into();
|
||||||
Err(ResolverError::ThisOutsideMethod)
|
|
||||||
} else if name == "super" {
|
Err(ResolverError::UnresolvableVariable { name })
|
||||||
Err(ResolverError::SuperOutsideMethod)
|
|
||||||
} else {
|
|
||||||
let name = name.into();
|
|
||||||
Err(ResolverError::UnresolvableVariable { name })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_stmt(&mut self, stmt: &mut Stmt) -> ResolverResult<()> {
|
fn resolve_stmt(&mut self, stmt: &mut Stmt) -> ResolverResult<()> {
|
||||||
|
|
@ -234,6 +238,7 @@ impl Resolver {
|
||||||
Expr::Variable { name } => {
|
Expr::Variable { name } => {
|
||||||
if let Some(ResolveStatus::Declared) = self.check(name) {
|
if let Some(ResolveStatus::Declared) = self.check(name) {
|
||||||
let name = name.clone();
|
let name = name.clone();
|
||||||
|
|
||||||
return Err(ResolverError::VarInOwnInitializer { name });
|
return Err(ResolverError::VarInOwnInitializer { name });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -241,7 +246,7 @@ impl Resolver {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Expr::LocalVariable { name, level: _ } => {
|
Expr::LocalVariable { name, .. } => {
|
||||||
panic!("Tried to resolve variable {name} twice")
|
panic!("Tried to resolve variable {name} twice")
|
||||||
}
|
}
|
||||||
Expr::GlobalVariable { name } => {
|
Expr::GlobalVariable { name } => {
|
||||||
|
|
@ -302,6 +307,7 @@ impl Resolver {
|
||||||
|
|
||||||
for param_name in param_names.iter() {
|
for param_name in param_names.iter() {
|
||||||
self.declare(param_name.clone())?;
|
self.declare(param_name.clone())?;
|
||||||
|
|
||||||
self.define(param_name.clone());
|
self.define(param_name.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue