motoko/
parser_types.rs

1use serde::{Deserialize, Serialize};
2
3// TODO: move?
4#[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}