Starting to keep track of locations of errors in file
This commit is contained in:
parent
2efac109ef
commit
8eda74c9a5
@ -19,7 +19,7 @@ impl Fold for RecursiveDescentFn {
|
|||||||
|
|
||||||
let new_block: syn::Block = parse_quote! {
|
let new_block: syn::Block = parse_quote! {
|
||||||
{
|
{
|
||||||
let next_token_before_parse = self.peek_with_token_offset();
|
let next_token_before_parse = self.token_handler.peek_token();
|
||||||
let record = ParseRecord {
|
let record = ParseRecord {
|
||||||
production_name: stringify!(#ident).to_string(),
|
production_name: stringify!(#ident).to_string(),
|
||||||
next_token: format!("{}", next_token_before_parse.to_string_with_metadata()),
|
next_token: format!("{}", next_token_before_parse.to_string_with_metadata()),
|
||||||
@ -34,7 +34,7 @@ impl Fold for RecursiveDescentFn {
|
|||||||
}
|
}
|
||||||
match result {
|
match result {
|
||||||
Err(ParseError { token: None, msg }) => {
|
Err(ParseError { token: None, msg }) => {
|
||||||
let next_token_after_parse = self.peek_with_token_offset();
|
let next_token_after_parse = self.token_handler.peek_token();
|
||||||
println!("HERE? {:?}", next_token_after_parse);
|
println!("HERE? {:?}", next_token_after_parse);
|
||||||
Err(ParseError { token: Some(next_token_after_parse), msg })
|
Err(ParseError { token: Some(next_token_after_parse), msg })
|
||||||
},
|
},
|
||||||
|
@ -124,7 +124,13 @@ fn parsing(handle: &mut Schala, input: Vec<tokenizing::Token>, comp: Option<&mut
|
|||||||
Some(ref x) => println!("Bad parsing debug option: {}", x),
|
Some(ref x) => println!("Bad parsing debug option: {}", x),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
ast.map_err(|err| err.msg)
|
ast.map_err(|error: parsing::ParseError| {
|
||||||
|
let location_frag = match error.token {
|
||||||
|
Some(tok) => format!(" at line: {} column: {}", tok.offset.0, tok.offset.1),
|
||||||
|
None => "".into()
|
||||||
|
};
|
||||||
|
format!("'{}'{}", error.msg, location_frag)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn symbol_table(handle: &mut Schala, input: ast::AST, comp: Option<&mut UnfinishedComputation>) -> Result<ast::AST, String> {
|
fn symbol_table(handle: &mut Schala, input: ast::AST, comp: Option<&mut UnfinishedComputation>) -> Result<ast::AST, String> {
|
||||||
|
@ -23,6 +23,13 @@ impl ParseError {
|
|||||||
token: None
|
token: None
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_with_token<T>(msg: &str, t: Token) -> ParseResult<T>{
|
||||||
|
Err(ParseError {
|
||||||
|
msg: msg.to_string(),
|
||||||
|
token: Some(t)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type ParseResult<T> = Result<T, ParseError>;
|
pub type ParseResult<T> = Result<T, ParseError>;
|
||||||
@ -47,19 +54,26 @@ struct ParserRestrictions {
|
|||||||
|
|
||||||
struct TokenHandler {
|
struct TokenHandler {
|
||||||
tokens: Peekable<IntoIter<Token>>,
|
tokens: Peekable<IntoIter<Token>>,
|
||||||
|
end_of_file: (usize, usize),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TokenHandler {
|
impl TokenHandler {
|
||||||
fn new(tokens: Vec<Token>) -> TokenHandler {
|
fn new(tokens: Vec<Token>) -> TokenHandler {
|
||||||
|
let end_of_file = match tokens.last() {
|
||||||
|
None => (0, 0),
|
||||||
|
Some(s) => {
|
||||||
|
s.offset.clone()
|
||||||
|
}
|
||||||
|
};
|
||||||
let tokens = tokens.into_iter().peekable();
|
let tokens = tokens.into_iter().peekable();
|
||||||
TokenHandler { tokens }
|
TokenHandler { tokens, end_of_file }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn peek(&mut self) -> TokenKind {
|
fn peek(&mut self) -> TokenKind {
|
||||||
self.tokens.peek().map(|ref t| { t.kind.clone() }).unwrap_or(TokenKind::EOF)
|
self.tokens.peek().map(|ref t| { t.kind.clone() }).unwrap_or(TokenKind::EOF)
|
||||||
}
|
}
|
||||||
fn peek_with_token_offset(&mut self) -> Token {
|
fn peek_token(&mut self) -> Token {
|
||||||
self.tokens.peek().map(|t: &Token| { t.clone()}).unwrap_or(Token { kind: TokenKind::EOF, offset: (0,0)})
|
self.tokens.peek().map(|t: &Token| { t.clone()}).unwrap_or(Token { kind: TokenKind::EOF, offset: self.end_of_file})
|
||||||
}
|
}
|
||||||
fn next(&mut self) -> TokenKind {
|
fn next(&mut self) -> TokenKind {
|
||||||
self.tokens.next().map(|ref t| { t.kind.clone() }).unwrap_or(TokenKind::EOF)
|
self.tokens.next().map(|ref t| { t.kind.clone() }).unwrap_or(TokenKind::EOF)
|
||||||
@ -79,9 +93,6 @@ impl Parser {
|
|||||||
fn peek(&mut self) -> TokenKind {
|
fn peek(&mut self) -> TokenKind {
|
||||||
self.token_handler.peek()
|
self.token_handler.peek()
|
||||||
}
|
}
|
||||||
fn peek_with_token_offset(&mut self) -> Token {
|
|
||||||
self.token_handler.peek_with_token_offset()
|
|
||||||
}
|
|
||||||
fn next(&mut self) -> TokenKind {
|
fn next(&mut self) -> TokenKind {
|
||||||
self.token_handler.next()
|
self.token_handler.next()
|
||||||
}
|
}
|
||||||
@ -544,7 +555,7 @@ impl Parser {
|
|||||||
fn precedence_expr(&mut self, precedence: i32) -> ParseResult<Expression> {
|
fn precedence_expr(&mut self, precedence: i32) -> ParseResult<Expression> {
|
||||||
let record = ParseRecord {
|
let record = ParseRecord {
|
||||||
production_name: "precedence_expr".to_string(),
|
production_name: "precedence_expr".to_string(),
|
||||||
next_token: format!("{}", self.peek_with_token_offset().to_string_with_metadata()),
|
next_token: format!("{}", self.token_handler.peek_token().to_string_with_metadata()),
|
||||||
level: self.parse_level,
|
level: self.parse_level,
|
||||||
};
|
};
|
||||||
self.parse_level += 1;
|
self.parse_level += 1;
|
||||||
@ -994,7 +1005,10 @@ impl Parser {
|
|||||||
#[recursive_descent_method]
|
#[recursive_descent_method]
|
||||||
fn literal(&mut self) -> ParseResult<Expression> {
|
fn literal(&mut self) -> ParseResult<Expression> {
|
||||||
use self::ExpressionType::*;
|
use self::ExpressionType::*;
|
||||||
match self.peek() {
|
|
||||||
|
let tok = self.token_handler.peek_token();
|
||||||
|
let kind = tok.kind.clone();
|
||||||
|
match kind {
|
||||||
DigitGroup(_) | HexLiteral(_) | BinNumberSigil | Period => self.number_literal(),
|
DigitGroup(_) | HexLiteral(_) | BinNumberSigil | Period => self.number_literal(),
|
||||||
Keyword(Kw::True) => {
|
Keyword(Kw::True) => {
|
||||||
self.next();
|
self.next();
|
||||||
@ -1006,9 +1020,9 @@ impl Parser {
|
|||||||
},
|
},
|
||||||
StrLiteral(s) => {
|
StrLiteral(s) => {
|
||||||
self.next();
|
self.next();
|
||||||
Ok(Expression(StringLiteral(s), None))
|
Ok(Expression(StringLiteral(s.clone()), None))
|
||||||
}
|
}
|
||||||
e => ParseError::new(&format!("Expected a literal expression, got {:?}", e)),
|
e => ParseError::new_with_token(&format!("Expected a literal expression, got {:?}", e), tok),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user