From 0399f9b7d8382bceb9c8169ee3a1ed1d2fe34dcb Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Wed, 21 Oct 2020 16:12:17 +0200 Subject: [PATCH] initial commit wip2 --- examples/stacked_borrows.rs | 40 ++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/examples/stacked_borrows.rs b/examples/stacked_borrows.rs index e87e08e..f938cec 100644 --- a/examples/stacked_borrows.rs +++ b/examples/stacked_borrows.rs @@ -57,18 +57,43 @@ enum Stmt { Assign(Expr, Expr), } -fn left_expr(e: &Expr) -> &Id { +fn left_expr(e: &Expr) -> Id { match e { - Expr::Id(id) => id, + Expr::Id(id) => id.to_owned(), Expr::Deref(e) => left_expr(e), _ => unimplemented!("illegal left hand"), } } +fn right_expr(e: &Expr) -> &Expr { + println!("right_expr {:?}", e); + match e { + Expr::Id(_) => e, + Expr::Lit => e, + Expr::Ref(_) => { + println!("Ref"); + e + } + Expr::RefMut(_) => { + println!("RefMut"); + e + } + Expr::Deref(e) => { + println!("Deref"); + right_expr(e) + } + } +} + fn check_stmt(s: &Stmt, store: &mut Store) { match s { Stmt::Let(id, e) => store.alloc(id.to_owned()), - Stmt::Assign(le, re) => {} + Stmt::Assign(le, re) => { + println!("assign le :{:?}, re: {:?}", le, re); + let id = left_expr(le); + let e = right_expr(re); + println!("assign id :{:?}, re: {:?}", id, e); + } } } @@ -83,10 +108,11 @@ fn main() { use {Expr::*, Stmt::*}; let v = vec![ - Let(id("a"), Lit), // let a = ...; - Let(id("b"), Lit), // let b = ...; - Let(id("c"), Ref(Box::new(Id(id("a"))))), // let c = &a; - Assign(Id(id("a")), Lit), // a = ...; + Let(id("a"), Lit), // let a = ...; + Let(id("b"), Lit), // let b = ...; + Let(id("c"), Ref(Box::new(Id(id("a"))))), // let c = &a; + Assign(Id(id("a")), Lit), // a = ...; + Assign(Deref(Box::new(Id(id("c")))), Lit), // *c = ..; ]; println!("prog {:?}", v); -- GitLab