Skip to content

Commit 54c2d27

Browse files
more fixes
1 parent 1fe8ffc commit 54c2d27

4 files changed

Lines changed: 27 additions & 6 deletions

File tree

src/interpreter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::common::diagnostics::sinks::Diagnostics;
44
use crate::syntax::*;
55

66
pub struct Env<'a> {
7-
parent: Option<&'a Env<'a>>
7+
parent: Option<&'a Env<'a>>,
88
vars: HashMap<&'a str, f64>,
99
}
1010

@@ -84,10 +84,10 @@ fn eval_expr<'a>(expr: &Expr<'a>, env: &Env<'a>) -> Result<f64, EvalError> {
8484
let mut inner_env = Env { parent: Some(env), vars: HashMap::new() };
8585

8686
for stmt in stmts {
87-
eval_stmt(&mut inner_env, stmt)?;
87+
eval_stmt(stmt, &mut inner_env)?;
8888
}
8989

90-
tail_expr.map(|expr| eval_expr(&inner_env, expr)).unwrap_or(Ok(0.0))
90+
tail_expr.map(|expr| eval_expr(expr, &inner_env)).unwrap_or(Ok(0.0))
9191
}
9292

9393
ExprKind::Error => Err(EvalError::InvalidExpression(expr.span)),

src/ir/lowerer.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ impl FunctionIRBuilder<'_> {
128128
});
129129
dst
130130
}
131+
t::ExprKind::Block { stmts, tail_expr } => {
132+
for stmt in stmts {
133+
self.lower_stmt();
134+
}
135+
136+
match tail_expr {
137+
Some(expr) => self.lower_expr(*expr),
138+
None => {
139+
let dst = self.new_temp(Type::Unit);
140+
todo!("Load unit into temporary")
141+
}
142+
}
143+
}
131144
t::ExprKind::Error => {
132145
let dst = self.new_temp(expr.ty);
133146
self.emit(Instr::Poision { dst: Some(dst) });

src/semantics/typechecker.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ impl TypeChecker<'_> {
106106
.map(|stmt| self.check_stmt(stmt))
107107
.collect();
108108

109-
let typed_expr = tail_expr.map(|expr| self.infer(expr));
109+
let typed_expr = tail_expr.map(|expr| Box::new(self.infer(*expr)));
110110

111111
let ty = typed_expr.map(|e| e.ty.clone()).unwrap_or(Type::Unit);
112112

src/syntax/parser.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,18 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
156156
}
157157

158158
fn expect_terminator(&mut self) -> Option<Token> {
159+
let save = self.stream.get_position();
160+
self.skip_newlines();
159161
match self.peek_token() {
160-
Token { kind: TokenKind::Semicolon | TokenKind::Newline, .. } => self.stream.next(),
162+
Token { kind: TokenKind::Semicolon, .. } => self.stream.next(),
161163
Token { kind: TokenKind::RBrace | TokenKind::EOF, .. } => None,
162164
other => {
165+
// skipped at least one newline
166+
if save != self.stream.get_position() {
167+
self.stream.set_position(save);
168+
return self.stream.next();
169+
}
170+
163171
self.diags.emit(
164172
Diagnostic::error("missing statement terminator")
165173
.with_span(other.span)
@@ -343,7 +351,7 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
343351
let span = closing_tok.map(|t| t.span.concat(&tok.span)).unwrap_or(tok.span);
344352

345353
let tail_expr = match stmts.pop() {
346-
Some(Stmt { kind: StmtKind::Expr(expr), span }) if expr.span != span => Some(Box::new(expr)),
354+
Some(Stmt { kind: StmtKind::Expr(expr), span }) if expr.span == span => Some(Box::new(expr)),
347355
Some(other) => { stmts.push(other); None }
348356
_ => None,
349357
};

0 commit comments

Comments
 (0)