Add lexer, parser, ast, and basic command line interaction

* Add lexer and parser using lrpar crate
* AST is added and constructed via lexer and parser
* Command line program `not` will read a file and parse it

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-09-02 14:40:43 -07:00
parent c25a3b5e2b
commit 2fd340a688
4 changed files with 45 additions and 6 deletions

View File

@@ -115,14 +115,16 @@ pub enum Atom {
String(String),
}
pub fn parse(text: &str) -> Result<Option<Vec<Stmt>>, Vec<lrpar::LexParseError<u32>>> {
pub fn parse(text: &str) -> Result<Option<Vec<Stmt>>, Vec<String>> {
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())

View File

@@ -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"

View File

@@ -12,6 +12,7 @@ Body -> Result<Vec<Stmt>>:
Body 'EOL' Stmt {
flatten($1, $3)
}
| Body 'EOL' { $1 }
| Stmt { Ok(vec![$1?]) }
| { Ok(Vec::new()) }
;
@@ -48,6 +49,9 @@ AccessExpr -> Result<Expr>:
AtomExpr AccessExprTail {
Ok(AccessExpr::new_expr($1?, $2?))
}
| AtomExpr {
Ok(AccessExpr::new_expr($1?, Default::default()))
}
;
AccessExprTail -> Result<Vec<Access>>: