Skip to content

Commit 1341ca2

Browse files
Feat: Implement return value.
1 parent 16b80af commit 1341ca2

3 files changed

Lines changed: 20 additions & 6 deletions

File tree

compiler/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fn main() {
2929

3030
initialize_logger();
3131

32-
let source = "result = 2 + 3 * 7";
32+
let source = "def add(a, b): return a + b\nresult = add(1, 2)";
3333

3434
let chunk = modules::parser::Parser::new(source, modules::lexer::lexer(source)).parse();
3535

compiler/src/modules/parser.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,15 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
188188
Some(TokenType::For) => self.for_stmt(),
189189
Some(TokenType::Name) => { let t = self.advance(); self.name_stmt(t); }
190190
Some(TokenType::Def) => { self.advance(); self.func_def(); }
191+
Some(TokenType::Return) => {
192+
self.advance();
193+
if matches!(self.peek(), Some(TokenType::Newline | TokenType::Endmarker)) {
194+
self.emit_const(Value::None);
195+
} else {
196+
self.expr();
197+
}
198+
self.chunk.emit(OpCode::ReturnValue, 0);
199+
}
191200
_ => self.expr()
192201
}
193202
}
@@ -532,12 +541,17 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
532541
if matches!(self.peek(), Some(TokenType::Colon)) { self.advance(); }
533542
params
534543
}
535-
544+
536545
fn compile_body(&mut self, params: &[String]) -> SSAChunk {
537546
let (saved_chunk, saved_ver) = (std::mem::take(&mut self.chunk), std::mem::take(&mut self.ssa_versions));
538547
for p in params { self.ssa_versions.insert(p.clone(), 0); }
539-
self.stmt();
540-
self.chunk.emit(OpCode::ReturnValue, 0);
548+
549+
loop {
550+
let is_return = matches!(self.peek(), Some(TokenType::Return));
551+
self.stmt();
552+
if is_return || self.at_end() { break; }
553+
}
554+
541555
let body = std::mem::take(&mut self.chunk);
542556
(self.chunk, self.ssa_versions) = (saved_chunk, saved_ver);
543557
body

compiler/tests/cases/parser_cases.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"src": "range(4)",
3232
"constants": ["4"],
3333
"names": [],
34-
"instructions": [["LoadConst", 0], ["CallRange", 1], ["PopTop", 0], ["ReturnValue", 0]],
34+
"instructions": [["LoadConst",0], ["CallRange",1], ["PopTop",0], ["ReturnValue",0]],
3535
"annotations": {}
3636
},
3737
{
@@ -42,7 +42,7 @@
4242
"annotations": {}
4343
},
4444
{
45-
"src": "def add(a, b): a + b\nresult = add(1, 2)",
45+
"src": "def add(a, b): return a + b\nresult = add(1, 2)",
4646
"constants": ["1", "2"],
4747
"names": ["add_1", "result_1"],
4848
"instructions": [["MakeFunction",0], ["StoreName",0], ["LoadName",0], ["LoadConst",0], ["LoadConst",1], ["Call",2], ["StoreName",1], ["PopTop",0], ["ReturnValue",0]],

0 commit comments

Comments
 (0)