1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
5#[serde(tag = "syntax_error_type")]
6pub enum SyntaxError {
7 InvalidToken {
8 location: usize,
9 },
10 UnrecognizedEOF {
11 location: usize,
12 expected: Vec<String>,
13 },
14 UnrecognizedToken {
15 token: String,
16 start: usize,
17 end: usize,
18 expected: Vec<String>,
19 },
20 ExtraToken {
21 token: String,
22 start: usize,
23 end: usize,
24 },
25 Custom {
26 message: String,
27 },
28}
29
30impl SyntaxError {
31 pub fn from_parse_error<'input>(
32 err: lalrpop_util::ParseError<usize, lalrpop_util::lexer::Token<'input>, &'static str>,
33 ) -> SyntaxError {
34 use lalrpop_util::ParseError::*;
35 match err {
36 InvalidToken { location } => Self::InvalidToken { location },
37 UnrecognizedEOF { location, expected } => Self::UnrecognizedEOF { location, expected },
38 UnrecognizedToken { token, expected } => Self::UnrecognizedToken {
39 token: token.1.to_string(),
40 start: token.0,
41 end: token.2,
42 expected,
43 },
44 ExtraToken { token } => Self::ExtraToken {
45 token: token.1.to_string(),
46 start: token.0,
47 end: token.2,
48 },
49 User { error } => Self::Custom {
50 message: error.to_owned(),
51 },
52 }
53 }
54}