php_parser_rs/lexer/
error.rs

1use std::fmt::Display;
2
3use crate::lexer::token::Span;
4
5pub type SyntaxResult<T> = Result<T, SyntaxError>;
6
7#[derive(Debug, Eq, PartialEq)]
8pub enum SyntaxError {
9    UnexpectedEndOfFile(Span),
10    UnexpectedError(Span),
11    UnexpectedCharacter(u8, Span),
12    InvalidHaltCompiler(Span),
13    InvalidOctalEscape(Span),
14    InvalidOctalLiteral(Span),
15    InvalidUnicodeEscape(Span),
16    UnpredictableState(Span),
17    InvalidDocIndentation(Span),
18    InvalidDocBodyIndentationLevel(usize, Span),
19    UnrecognisedToken(u8, Span),
20}
21
22impl SyntaxError {
23    pub fn span(&self) -> Span {
24        match self {
25            Self::UnexpectedEndOfFile(span) => *span,
26            Self::UnexpectedError(span) => *span,
27            Self::UnexpectedCharacter(_, span) => *span,
28            Self::InvalidHaltCompiler(span) => *span,
29            Self::InvalidOctalEscape(span) => *span,
30            Self::InvalidOctalLiteral(span) => *span,
31            Self::InvalidUnicodeEscape(span) => *span,
32            Self::UnpredictableState(span) => *span,
33            Self::InvalidDocIndentation(span) => *span,
34            Self::InvalidDocBodyIndentationLevel(_, span) => *span,
35            Self::UnrecognisedToken(_, span) => *span,
36        }
37    }
38}
39
40impl Display for SyntaxError {
41    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42        match self {
43            Self::UnexpectedEndOfFile(span) => write!(
44                f,
45                "Syntax Error: unexpected end of file on line {} column {}",
46                span.line, span.column
47            ),
48            Self::UnexpectedError(span) => write!(
49                f,
50                "Syntax Error: unexpected error on line {} column {}",
51                span.line, span.column
52            ),
53            Self::UnexpectedCharacter(char, span) => write!(
54                f,
55                "Syntax Error: unexpected character `{:?}` on line {} column {}",
56                *char as char, span.line, span.column
57            ),
58            Self::InvalidHaltCompiler(span) => write!(
59                f,
60                "Syntax Error: invalid halt compiler on line {} column {}",
61                span.line, span.column
62            ),
63            Self::InvalidOctalEscape(span) => write!(
64                f,
65                "Syntax Error: invalid octal escape on line {} column {}",
66                span.line, span.column
67            ),
68            Self::InvalidOctalLiteral(span) => write!(
69                f,
70                "Syntax Error: invalid octal literal on line {} column {}",
71                span.line, span.column
72            ),
73            Self::InvalidUnicodeEscape(span) => write!(
74                f,
75                "Syntax Error: invalid unicode escape on line {} column {}",
76                span.line, span.column
77            ),
78            Self::UnpredictableState(span) => write!(
79                f,
80                "Syntax Error: Reached an unpredictable state on line {} column {}",
81                span.line, span.column
82            ),
83            Self::InvalidDocIndentation(span) => write!(
84                f,
85                "Syntax Error: Invalid indentation - cannot use tabs and spaces on line {}",
86                span.line
87            ),
88            Self::InvalidDocBodyIndentationLevel(expected, span) => write!(
89                f,
90                "Syntax Error: Invalid body indentation level - expecting an indentation level of at least {} on line {}",
91                expected,
92                span.line
93            ),
94            Self::UnrecognisedToken(token, span) => write!(
95                f,
96                "Syntax Error: Unrecognised token {} on line {} column {}",
97                token,
98                span.line,
99                span.column
100            )
101        }
102    }
103}