46 lines
780 B
Rust
46 lines
780 B
Rust
mod parser;
|
|
|
|
use fs_err as fs;
|
|
|
|
#[derive(Debug, PartialEq, logos::Logos)]
|
|
enum Kind {
|
|
#[token("(")]
|
|
Lparen,
|
|
|
|
#[token(")")]
|
|
Rparen,
|
|
|
|
#[regex(r"[A-Za-z0-9!$%&*+-./:<=>?@^_~]+")]
|
|
// Most literals are floats, and can be seperated later
|
|
Symbol,
|
|
|
|
#[regex(r"#(f|t)")]
|
|
Boolean,
|
|
|
|
#[regex(r#""(\\.|[^"\\])*""#)]
|
|
String,
|
|
|
|
#[error]
|
|
#[regex(r"[ \t\n\f\r]+", logos::skip)]
|
|
#[regex(r";.*", logos::skip)]
|
|
Error,
|
|
}
|
|
|
|
fn main() -> anyhow::Result<()> {
|
|
let arg = std::env::args()
|
|
.nth(1)
|
|
.ok_or_else(|| anyhow::anyhow!("Useage: handball sources.scm"))?;
|
|
|
|
let src = fs::read_to_string(&arg)?;
|
|
|
|
dbg!(parser::parse(&src));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
enum Ast<'s> {
|
|
Tree(Vec<Ast<'s>>),
|
|
Leaf(&'s str),
|
|
}
|