From 1d772fbaa729de9895216281bdf556e4d3fb644d Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Tue, 22 Sep 2020 01:03:26 +0200 Subject: [PATCH] move to new syntax, wip10 --- examples/wip.rs | 8 ++++++-- src/ast.rs | 13 +------------ src/check.rs | 2 +- src/grammar.lalrpop | 32 ++++++++++++++++++-------------- 4 files changed, 26 insertions(+), 29 deletions(-) diff --git a/examples/wip.rs b/examples/wip.rs index b744af2..852c5b2 100644 --- a/examples/wip.rs +++ b/examples/wip.rs @@ -3,7 +3,11 @@ fn main() { while true {} - if a {} + if true {}; + + if true { + } else { + }; let mut a = 5; a = 5; @@ -12,5 +16,5 @@ fn main() { } fn b(x: i32) -> i32 { - x + x; } diff --git a/src/ast.rs b/src/ast.rs index a0ca146..f57b199 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -214,21 +214,10 @@ impl Stmts { fn ifmt(&self, fmt: &mut Formatter, indent: usize) -> Result<(), Error> { write!(fmt, "{{")?; let len = self.stmts.len(); - for (i, s) in (&self.stmts).into_iter().enumerate() { + for s in &self.stmts { // set tab write!(fmt, "\n{}", " ".repeat(indent + 4))?; s.ifmt(fmt, indent + 4)?; - - if i < len - 1 { - match s { - Stmt::Block(_) | Stmt::If(_, _, _) | Stmt::While(_, _) => (), - _ => write!(fmt, ";")?, - } - } else { - if self.trailing_semi { - write!(fmt, ";")?; - } - } } write!(fmt, "\n{}}}", " ".repeat(indent)) } diff --git a/src/check.rs b/src/check.rs index ddb772f..84f8d92 100644 --- a/src/check.rs +++ b/src/check.rs @@ -363,7 +363,7 @@ pub fn check_stmt( } _ => Err("Condition not Boolean".to_string()), }, - Semi => panic!("ICE"), + Semi => Ok(Type::Unit), } } diff --git a/src/grammar.lalrpop b/src/grammar.lalrpop index a6ce8a2..a1d4d65 100644 --- a/src/grammar.lalrpop +++ b/src/grammar.lalrpop @@ -121,25 +121,30 @@ Type : Type = { } pub Block: Stmts = { - "{" <mut stmts: StmtSeq*> <st: Stmt?> "}" => { - match &st { - Some(st) => stmts.push(st.clone()), - _ =>(), - }; + "{" <Stmt> "}" => + Stmts { + trailing_semi : match <> { + Stmt::Semi => true, + _ => false, + }, + stmts: vec![<>], + }, + "{" <stmts: StmtSeq*> "}" => { + let stmts: Vec<Stmt> = stmts.into_iter().flatten().collect(); Stmts { + trailing_semi: match &stmts.last() { + Some(Stmt::Semi) => true, + _ => false, + }, stmts, - trailing_semi: match st { - Some(_) => false, - _ => true, - } } } } -StmtSeq: Stmt = { - ";" => Stmt::Semi, - <Stmt> ";" => <>, - StmtBlock => <>, +StmtSeq: Vec<Stmt> = { + ";" => vec![Stmt::Semi], + <Stmt> ";" => vec![<>, Stmt::Semi], + StmtBlock => vec![<>], } StmtBlock: Stmt = { @@ -149,7 +154,6 @@ StmtBlock: Stmt = { } Stmt: Stmt = { - // ";" => Stmt::Semi, "let" <m: "mut"?> <id: Id> <t: (":" <Type>)?> <e: ("=" <Expr>)?> => Stmt::Let(id, m.is_some(), t, e), <Expr> "=" <Expr> => Stmt::Assign(<>), <ExprNoBlock> => Stmt::Expr(<>), -- GitLab