php_parser_rs/lexer/
error.rs1use 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}