From 3a79d8650a631045e592dd8818560a719d32f904 Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Sat, 17 Jul 2021 17:14:00 +0200 Subject: [PATCH] Make more fields public --- src/dynval.rs | 6 +++--- src/error.rs | 12 ++++++++++-- src/parser/lexer.rs | 2 +- src/simplexpr_parser.lalrpop | 8 ++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/dynval.rs b/src/dynval.rs index 62b2de4..dbdd9d3 100644 --- a/src/dynval.rs +++ b/src/dynval.rs @@ -8,9 +8,9 @@ pub type Result = std::result::Result; #[derive(Debug, thiserror::Error)] #[error("Failed to turn {value} into a {target_type}")] pub struct ConversionError { - value: DynVal, - target_type: &'static str, - source: Option>, + pub value: DynVal, + pub target_type: &'static str, + pub source: Option>, } impl ConversionError { diff --git a/src/error.rs b/src/error.rs index 6e91360..e66b50c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,4 +1,8 @@ -use crate::{ast::Span, dynval, parser::lexer}; +use crate::{ + ast::Span, + dynval, + parser::lexer::{self, LexicalError}, +}; use codespan_reporting::diagnostic; pub type Result = std::result::Result; @@ -25,6 +29,10 @@ impl Error { Error::ParseError { source: err } } + pub fn at(self, span: Span) -> Self { + Self::Spanned(span, Box::new(self)) + } + pub fn get_span(&self) -> Option { match self { Self::ParseError { source } => get_parse_error_span(source), @@ -68,7 +76,7 @@ fn get_parse_error_span(err: &lalrpop_util::ParseError Some(Span(*location, *location)), lalrpop_util::ParseError::UnrecognizedToken { token, expected: _ } => Some(Span(token.0, token.2)), lalrpop_util::ParseError::ExtraToken { token } => Some(Span(token.0, token.2)), - lalrpop_util::ParseError::User { error: _ } => None, + lalrpop_util::ParseError::User { error: LexicalError(l, r) } => Some(Span(*l, *r)), } } diff --git a/src/parser/lexer.rs b/src/parser/lexer.rs index 7d49959..e3c2447 100644 --- a/src/parser/lexer.rs +++ b/src/parser/lexer.rs @@ -44,7 +44,7 @@ pub enum Token { } #[derive(Debug, Eq, PartialEq, Copy, Clone)] -pub struct LexicalError(usize, usize); +pub struct LexicalError(pub usize, pub usize); impl std::fmt::Display for LexicalError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/src/simplexpr_parser.lalrpop b/src/simplexpr_parser.lalrpop index ea1ba6f..2f1c8dd 100644 --- a/src/simplexpr_parser.lalrpop +++ b/src/simplexpr_parser.lalrpop @@ -1,6 +1,7 @@ use crate::ast::{SimplExpr::{self, *}, Span, BinOp::*, UnaryOp::*}; use crate::parser::lexer::{Token, LexicalError}; use crate::parser::lalrpop_helpers::*; +use lalrpop_util::ParseError; grammar; @@ -42,6 +43,8 @@ extern { "number" => Token::NumLit(), "string" => Token::StrLit(), + "lexer_error" => Token::Error, + } } @@ -56,7 +59,12 @@ Comma: Vec = { }; pub Expr: SimplExpr = { + #[precedence(level="0")] + "lexer_error" =>? { + Err(ParseError::User { error: LexicalError(l, r) }) + }, + , => VarRef(Span(l, r), ident.to_string()), "(" ")",