2022-01-07 20:30:55 -08:00
|
|
|
mod compile;
|
2021-12-21 11:29:59 -08:00
|
|
|
mod object;
|
|
|
|
|
mod syn;
|
2022-01-07 20:30:55 -08:00
|
|
|
mod vm;
|
2021-12-21 11:29:59 -08:00
|
|
|
|
|
|
|
|
use std::io::Read;
|
|
|
|
|
use std::path::PathBuf;
|
|
|
|
|
use structopt::StructOpt;
|
2022-01-07 20:30:55 -08:00
|
|
|
use syn::parser::Parser;
|
|
|
|
|
use vm::machine::MachineBuilder;
|
2021-12-21 11:29:59 -08:00
|
|
|
|
|
|
|
|
#[derive(Debug, StructOpt)]
|
|
|
|
|
struct Opt {
|
|
|
|
|
#[structopt(name = "PATH", parse(from_os_str))]
|
|
|
|
|
path: Option<PathBuf>,
|
2022-01-07 20:30:55 -08:00
|
|
|
|
|
|
|
|
#[structopt(long)]
|
|
|
|
|
max_stack_size: Option<usize>,
|
|
|
|
|
|
|
|
|
|
#[structopt(long)]
|
|
|
|
|
max_arena_objects: Option<usize>,
|
2021-12-21 11:29:59 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Result<T = (), E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
|
|
|
|
|
|
|
|
|
|
fn main() -> Result {
|
|
|
|
|
let opt = Opt::from_args();
|
|
|
|
|
|
|
|
|
|
let text = if let Some(path) = opt.path.as_ref() {
|
|
|
|
|
std::fs::read_to_string(path)?
|
|
|
|
|
} else {
|
|
|
|
|
let mut input = String::new();
|
|
|
|
|
std::io::stdin().read_to_string(&mut input)?;
|
|
|
|
|
input
|
|
|
|
|
};
|
|
|
|
|
|
2022-01-07 20:30:55 -08:00
|
|
|
let mut parser = Parser::from(text.as_str());
|
|
|
|
|
let mut exprs = Vec::new();
|
|
|
|
|
while !parser.is_eof() {
|
|
|
|
|
exprs.extend(parser.next_expr_list()?);
|
2021-12-21 11:29:59 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-07 20:30:55 -08:00
|
|
|
let machine = MachineBuilder::default()
|
|
|
|
|
.max_stack_size(opt.max_stack_size)
|
|
|
|
|
.max_arena_objects(opt.max_arena_objects)
|
|
|
|
|
.finish();
|
|
|
|
|
|
2021-12-21 11:29:59 -08:00
|
|
|
Ok(())
|
|
|
|
|
}
|