|
|
|
@ -2,15 +2,23 @@ use compiler::{backend::spirv_meta, meta_compile};
|
|
|
|
|
use error::print_error;
|
|
|
|
|
use std::{env, fs, path::PathBuf};
|
|
|
|
|
|
|
|
|
|
use parser::parse_string;
|
|
|
|
|
use parser::{parse_string, tokenize, Token};
|
|
|
|
|
pub mod compiler;
|
|
|
|
|
mod error;
|
|
|
|
|
pub mod parser;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Default, PartialEq)]
|
|
|
|
|
enum Trace {
|
|
|
|
|
Tokens,
|
|
|
|
|
AST,
|
|
|
|
|
#[default] Normal
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Default)]
|
|
|
|
|
struct CompilerArgs {
|
|
|
|
|
input: Option<PathBuf>,
|
|
|
|
|
output: Option<PathBuf>,
|
|
|
|
|
trace: Trace,
|
|
|
|
|
print_help: bool,
|
|
|
|
|
print_version: bool,
|
|
|
|
|
}
|
|
|
|
@ -43,6 +51,17 @@ fn main() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if args.trace == Trace::Tokens {
|
|
|
|
|
let tokens = tokenize(&src);
|
|
|
|
|
for tok in tokens {
|
|
|
|
|
match tok.item {
|
|
|
|
|
Token::LeftParen => println!("{:>3}:{:<3} LeftParen",tok.location.line_start(), tok.location.col_start()),
|
|
|
|
|
Token::RightParen => println!("{:>3}:{:<3} RightParen",tok.location.line_start(), tok.location.col_start()),
|
|
|
|
|
Token::Symbol( val ) => println!("{:>3}:{:<3} Symbol `{}`",tok.location.line_start(), tok.location.col_start(), val)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let ast = match parse_string(&src) {
|
|
|
|
|
Ok(i) => i,
|
|
|
|
@ -51,6 +70,11 @@ fn main() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if args.trace == Trace::AST {
|
|
|
|
|
ast.pretty_print(None,None);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let module = match meta_compile(ast) {
|
|
|
|
|
Ok(m) => m,
|
|
|
|
@ -111,6 +135,36 @@ fn parse_args() -> CompilerArgs {
|
|
|
|
|
return parsed_args;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
"trace" => {
|
|
|
|
|
if parsed_args.trace == Trace::Normal {
|
|
|
|
|
let Some(output) = args.next() else {
|
|
|
|
|
parsed_args.print_help = true;
|
|
|
|
|
eprintln!("trace needs a file");
|
|
|
|
|
eprintln!();
|
|
|
|
|
return parsed_args;
|
|
|
|
|
};
|
|
|
|
|
match output.as_str() {
|
|
|
|
|
"ast" | "AST" | "Ast" => {
|
|
|
|
|
parsed_args.trace = Trace::AST;
|
|
|
|
|
}
|
|
|
|
|
"token" | "tokens" => {
|
|
|
|
|
parsed_args.trace = Trace::Tokens;
|
|
|
|
|
}
|
|
|
|
|
a => {
|
|
|
|
|
eprintln!("unknown trace value {a}");
|
|
|
|
|
eprintln!();
|
|
|
|
|
parsed_args.print_help = true;
|
|
|
|
|
return parsed_args;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
eprintln!("trace can be passed only once");
|
|
|
|
|
eprintln!();
|
|
|
|
|
parsed_args.print_help = true;
|
|
|
|
|
return parsed_args;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
a => {
|
|
|
|
|
eprintln!("unknown arg --{a}");
|
|
|
|
|
eprintln!();
|
|
|
|
|