diff --git a/src/bin/not.rs b/src/bin/not.rs index 7d672dd..67bab79 100644 --- a/src/bin/not.rs +++ b/src/bin/not.rs @@ -1,5 +1,38 @@ -use not_python::syn; +use not_python::syn::ast; -fn main() { - println!("hell world"); +use std::{fs, path::PathBuf}; +use structopt::StructOpt; + +type Result = std::result::Result>; + +#[derive(StructOpt, Debug)] +struct Options { + /// The input file to work with. + /// + /// By default, the file will be executed. If -c is passed, it will not run and only compile. + /// Supplying - for the path will read from STDIN. + #[structopt(name = "FILE", parse(from_os_str))] + input: PathBuf, + /* + /// Disassemble object that would be passed to VM and exit before running it. + #[structopt(short = "d", long)] + disassemble: bool, + */ +} + +fn main() -> Result<()> { + let opt = Options::from_args(); + let text = fs::read_to_string(&opt.input)?; + let ast = match ast::parse(text.as_str()) { + Ok(ast) => ast, + Err(errs) => { + for err in errs { + eprintln!("{}", err); + } + return Err("errors reported, exiting".into()); + } + }; + println!("{:#?}", ast); + + Ok(()) } diff --git a/src/syn/ast.rs b/src/syn/ast.rs index 9f08842..5646294 100644 --- a/src/syn/ast.rs +++ b/src/syn/ast.rs @@ -115,14 +115,16 @@ pub enum Atom { String(String), } -pub fn parse(text: &str) -> Result>, Vec>> { +pub fn parse(text: &str) -> Result>, Vec> { use crate::syn::{lexer, parser}; let lexerdef = lexer::lexerdef(); let lexer = lexerdef.lexer(text); let (res, errors) = parser::parse(&lexer); if !errors.is_empty() { - return Err(errors) + return Err(errors.into_iter() + .map(|e| e.pp(&lexer, &parser::token_epp)) + .collect()) } Ok(res.transpose().unwrap()) diff --git a/src/syn/lexer.l b/src/syn/lexer.l index 75f1ce9..3ffc65e 100644 --- a/src/syn/lexer.l +++ b/src/syn/lexer.l @@ -1,5 +1,5 @@ %% -[\n;]+ "EOL" +[\r\n;]+ "EOL" [a-zA-Z_][a-zA-Z0-9_]* "IDENT" :[a-zA-Z_][a-zA-Z0-9_]* "SYM" [0-9]+ "NUM" diff --git a/src/syn/parser.y b/src/syn/parser.y index 1ab1161..853762f 100644 --- a/src/syn/parser.y +++ b/src/syn/parser.y @@ -12,6 +12,7 @@ Body -> Result>: Body 'EOL' Stmt { flatten($1, $3) } + | Body 'EOL' { $1 } | Stmt { Ok(vec![$1?]) } | { Ok(Vec::new()) } ; @@ -48,6 +49,9 @@ AccessExpr -> Result: AtomExpr AccessExprTail { Ok(AccessExpr::new_expr($1?, $2?)) } + | AtomExpr { + Ok(AccessExpr::new_expr($1?, Default::default())) + } ; AccessExprTail -> Result>: