doughlang: Preserve errors through entire pipeline
lexer: - Un-stringify errors - Reserve more words - Doc the comments parser: - MASSIVE changes to peek, peek_if, next_if, consume_if=>expect. - Keep track of when EOF is allowable - TKind is stupidly cheap with >100 niches, so we can fit like 4 of them in a single ParseError lmao - TODO: make sure EOF/UnexpectedEOF propagation is correct. It seems... Kinda Not correct. - Add meta-expressions
This commit is contained in:
27
src/main.rs
27
src/main.rs
@@ -9,7 +9,7 @@ use doughlang::{
|
||||
Expr,
|
||||
macro_matcher::{Match, Subst},
|
||||
},
|
||||
lexer::{LexError, Lexer},
|
||||
lexer::{EOF, LexError, Lexer},
|
||||
parser::{ParseError, Parser},
|
||||
span::Span,
|
||||
token::{TKind, Token},
|
||||
@@ -73,7 +73,7 @@ fn lex() -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
loop {
|
||||
match lexer.scan() {
|
||||
Err(LexError { res: "EOF", .. }) => {
|
||||
Err(LexError { res: EOF, .. }) => {
|
||||
break Ok(Response::Accept);
|
||||
}
|
||||
Err(e) => {
|
||||
@@ -97,7 +97,7 @@ fn exprs() -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
for idx in 0.. {
|
||||
match parser.parse::<Anno<Expr>>(0) {
|
||||
Err(ParseError::FromLexer(LexError { res: "EOF", .. })) => {
|
||||
Err(ParseError::FromLexer(LexError { res: EOF, .. })) => {
|
||||
return Ok(Response::Accept);
|
||||
}
|
||||
Err(e) => {
|
||||
@@ -120,7 +120,7 @@ fn pats() -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
loop {
|
||||
match parser.parse::<Pat>(PPrec::Min) {
|
||||
Err(ParseError::FromLexer(LexError { res: "EOF", .. })) => {
|
||||
Err(ParseError::FromLexer(LexError { res: EOF, .. })) => {
|
||||
break Ok(Response::Accept);
|
||||
}
|
||||
Err(e) => {
|
||||
@@ -142,7 +142,7 @@ fn tys() -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
loop {
|
||||
match parser.parse::<Ty>(()) {
|
||||
Err(ParseError::FromLexer(LexError { res: "EOF", .. })) => {
|
||||
Err(ParseError::FromLexer(LexError { res: EOF, .. })) => {
|
||||
break Ok(Response::Accept);
|
||||
}
|
||||
Err(e) => {
|
||||
@@ -205,16 +205,25 @@ fn subst() -> Result<(), Box<dyn Error>> {
|
||||
|
||||
fn parse(document: &str) {
|
||||
let mut parser = Parser::new(Lexer::new(document));
|
||||
let isatty = std::io::stdin().is_terminal();
|
||||
for idx in 0.. {
|
||||
match parser.parse::<Expr>(0) {
|
||||
Err(ParseError::FromLexer(LexError { res: "EOF", .. })) => break,
|
||||
Err(e) => {
|
||||
println!("\x1b[31m{e}\x1b[0m");
|
||||
Err(e @ ParseError::EOF(s)) if s.tail == document.len() as _ => {
|
||||
println!("\x1b[92m{e} (total {} bytes)\x1b[0m", document.len());
|
||||
break;
|
||||
}
|
||||
Ok(v) => {
|
||||
Err(e @ ParseError::EOF(_)) => {
|
||||
println!("\x1b[93m{e} (total {} bytes)\x1b[0m", document.len());
|
||||
break;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("\x1b[91m{e}\x1b[0m");
|
||||
break;
|
||||
}
|
||||
Ok(v) if isatty => {
|
||||
println!("\x1b[{}m{v}", (idx + 5) % 6 + 31);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user