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