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:
@@ -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())
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>>:
|
||||
|
||||
Reference in New Issue
Block a user