feat(tazjin/rlox): Wire up bytecode interpreter & print results

This makes the bytecode interpreter actually usable.

Change-Id: I24afc7ce461c6673dc42581378f6e14da7aece5c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2566
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2021-02-28 01:13:52 +02:00 committed by tazjin
parent 0c9a7de5be
commit 995d024f03
3 changed files with 11 additions and 19 deletions

View file

@ -4,9 +4,6 @@ use super::opcode::OpCode;
use super::value::Value;
use crate::scanner::{self, Token, TokenKind};
#[cfg(test)]
mod tests;
struct Compiler<T: Iterator<Item = Token>> {
tokens: T,
chunk: Chunk,
@ -225,7 +222,10 @@ impl<T: Iterator<Item = Token>> Compiler<T> {
self.emit_op(OpCode::OpReturn);
#[cfg(feature = "disassemble")]
chunk::disassemble_chunk(&self.chunk);
{
chunk::disassemble_chunk(&self.chunk);
println!("== compilation finished ==");
}
Ok(())
}

View file

@ -28,14 +28,3 @@ impl crate::Lox for Interpreter {
vm::interpret(chunk).map_err(|e| vec![e])
}
}
// pub fn main() {
// let mut chunk: Chunk = Default::default();
// let constant = chunk.add_constant(1.2);
// chunk.add_op(OpCode::OpConstant(constant), 1);
// let constant = chunk.add_constant(2.0);
// chunk.add_op(OpCode::OpConstant(constant), 2);
// chunk.add_op(OpCode::OpAdd, 3);
// chunk.add_op(OpCode::OpReturn, 4);
// vm::interpret(chunk).expect("it should work");
// }

View file

@ -11,7 +11,7 @@ mod treewalk;
/// Trait for making the different interpreters callable in the same
/// way.
pub trait Lox {
type Value;
type Value: std::fmt::Debug;
type Error: std::fmt::Display;
fn create() -> Self;
@ -69,9 +69,12 @@ fn run_prompt<I: Lox>() {
}
fn run<I: Lox>(lox: &mut I, code: String) {
if let Err(errors) = lox.interpret(code) {
for error in errors {
eprintln!("{}", error);
match lox.interpret(code) {
Ok(result) => println!("=> {:?}", result),
Err(errors) => {
for error in errors {
eprintln!("{}", error);
}
}
}
}