merge(glittershark/achilles): Subtree import at 'b93268085a'
Imported from https://github.com/glittershark/achilles/ git-subtree-dir: users/glittershark/achilles git-subtree-mainline:4d193f2395git-subtree-split:b93268085aChange-Id: I64a583b454bbe03e20358ad7808939a4cbc212ba
This commit is contained in:
commit
b6895a5b30
33 changed files with 4508 additions and 0 deletions
39
users/glittershark/achilles/src/commands/check.rs
Normal file
39
users/glittershark/achilles/src/commands/check.rs
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
use clap::Clap;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::ast::Type;
|
||||
use crate::{parser, tc, Result};
|
||||
|
||||
/// Typecheck a file or expression
|
||||
#[derive(Clap)]
|
||||
pub struct Check {
|
||||
/// File to check
|
||||
path: Option<PathBuf>,
|
||||
|
||||
/// Expression to check
|
||||
#[clap(long, short = 'e')]
|
||||
expr: Option<String>,
|
||||
}
|
||||
|
||||
fn run_expr(expr: String) -> Result<Type<'static>> {
|
||||
let (_, parsed) = parser::expr(&expr)?;
|
||||
let hir_expr = tc::typecheck_expr(parsed)?;
|
||||
Ok(hir_expr.type_().to_owned())
|
||||
}
|
||||
|
||||
fn run_path(path: PathBuf) -> Result<Type<'static>> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
impl Check {
|
||||
pub fn run(self) -> Result<()> {
|
||||
let type_ = match (self.path, self.expr) {
|
||||
(None, None) => Err("Must specify either a file or expression to check".into()),
|
||||
(Some(_), Some(_)) => Err("Cannot specify both a file and expression to check".into()),
|
||||
(None, Some(expr)) => run_expr(expr),
|
||||
(Some(path), None) => run_path(path),
|
||||
}?;
|
||||
println!("type: {}", type_);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
31
users/glittershark/achilles/src/commands/compile.rs
Normal file
31
users/glittershark/achilles/src/commands/compile.rs
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
use std::path::PathBuf;
|
||||
|
||||
use clap::Clap;
|
||||
|
||||
use crate::common::Result;
|
||||
use crate::compiler::{self, CompilerOptions};
|
||||
|
||||
/// Compile a source file
|
||||
#[derive(Clap)]
|
||||
pub struct Compile {
|
||||
/// File to compile
|
||||
file: PathBuf,
|
||||
|
||||
/// Output file
|
||||
#[clap(short = 'o')]
|
||||
out_file: PathBuf,
|
||||
|
||||
#[clap(flatten)]
|
||||
options: CompilerOptions,
|
||||
}
|
||||
|
||||
impl Compile {
|
||||
pub fn run(self) -> Result<()> {
|
||||
eprintln!(
|
||||
">>> {} -> {}",
|
||||
&self.file.to_string_lossy(),
|
||||
self.out_file.to_string_lossy()
|
||||
);
|
||||
compiler::compile_file(&self.file, &self.out_file, &self.options)
|
||||
}
|
||||
}
|
||||
32
users/glittershark/achilles/src/commands/eval.rs
Normal file
32
users/glittershark/achilles/src/commands/eval.rs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
use clap::Clap;
|
||||
|
||||
use crate::codegen;
|
||||
use crate::interpreter;
|
||||
use crate::parser;
|
||||
use crate::tc;
|
||||
use crate::Result;
|
||||
|
||||
/// Evaluate an expression and print its result
|
||||
#[derive(Clap)]
|
||||
pub struct Eval {
|
||||
/// JIT-compile with LLVM instead of interpreting
|
||||
#[clap(long)]
|
||||
jit: bool,
|
||||
|
||||
/// Expression to evaluate
|
||||
expr: String,
|
||||
}
|
||||
|
||||
impl Eval {
|
||||
pub fn run(self) -> Result<()> {
|
||||
let (_, parsed) = parser::expr(&self.expr)?;
|
||||
let hir = tc::typecheck_expr(parsed)?;
|
||||
let result = if self.jit {
|
||||
codegen::jit_eval::<i64>(&hir)?.into()
|
||||
} else {
|
||||
interpreter::eval(&hir)?
|
||||
};
|
||||
println!("{}", result);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
7
users/glittershark/achilles/src/commands/mod.rs
Normal file
7
users/glittershark/achilles/src/commands/mod.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
pub mod check;
|
||||
pub mod compile;
|
||||
pub mod eval;
|
||||
|
||||
pub use check::Check;
|
||||
pub use compile::Compile;
|
||||
pub use eval::Eval;
|
||||
Loading…
Add table
Add a link
Reference in a new issue