From 9d2b001c4cc86cc57bdb890037c80b7a1c766ecd Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 23 Nov 2020 00:59:03 +0100 Subject: feat(tazjin/rlox): Add basic program structure ... as well as a Nix derivation, because why not. Change-Id: Iaf2591ab72676fe0732c3f807b3aa0cff13fb4ef Reviewed-on: https://cl.tvl.fyi/c/depot/+/2143 Reviewed-by: tazjin Tested-by: BuildkiteCI --- users/tazjin/rlox/src/interpreter.rs | 4 ++++ users/tazjin/rlox/src/main.rs | 37 ++++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 users/tazjin/rlox/src/interpreter.rs (limited to 'users/tazjin/rlox/src') diff --git a/users/tazjin/rlox/src/interpreter.rs b/users/tazjin/rlox/src/interpreter.rs new file mode 100644 index 000000000000..6a7687c2685e --- /dev/null +++ b/users/tazjin/rlox/src/interpreter.rs @@ -0,0 +1,4 @@ +// Run some Lox code and print it to stdout +pub fn run(_code: &str) { + println!("no interpreter yet, sorry") +} diff --git a/users/tazjin/rlox/src/main.rs b/users/tazjin/rlox/src/main.rs index 3f173673a177..83d220c81631 100644 --- a/users/tazjin/rlox/src/main.rs +++ b/users/tazjin/rlox/src/main.rs @@ -1,23 +1,40 @@ -use std::process; use std::env; +use std::fs; +use std::io; +use std::io::Write; +use std::process; -fn run_file(_file: &str) { - unimplemented!("no file support yet") -} - -fn run_prompt() { - unimplemented!("no prompt support yet") -} +mod interpreter; fn main() { let mut args = env::args(); - if args.len() > 1 { + if args.len() > 2 { println!("Usage: rlox [script]"); process::exit(1); - } else if let Some(file) = args.next() { + } else if let Some(file) = args.nth(1) { run_file(&file); } else { run_prompt(); } } + +// Run Lox code from a file and print results to stdout +fn run_file(file: &str) { + let contents = fs::read_to_string(file).expect("failed to read the input file"); + interpreter::run(&contents); +} + +// Evaluate Lox code interactively in a shitty REPL. +fn run_prompt() { + let mut line = String::new(); + + loop { + print!("> "); + io::stdout().flush().unwrap(); + io::stdin() + .read_line(&mut line) + .expect("failed to read user input"); + interpreter::run(&line); + } +} -- cgit 1.4.1