tenda_parser/
parser_error.rs

1use tenda_common::span::SourceSpan;
2use tenda_reporting_derive::Diagnostic;
3use tenda_scanner::Token;
4use thiserror::Error;
5
6pub type Result<T> = std::result::Result<T, Vec<ParserError>>;
7
8#[derive(Error, Debug, PartialEq, Clone, Diagnostic)]
9#[report("erro sintático")]
10pub enum ParserError {
11    #[error("fim inesperado de entrada")]
12    UnexpectedEoi {
13        #[span]
14        span: SourceSpan,
15    },
16
17    #[error("esperado ')'")]
18    MissingParentheses {
19        #[span]
20        span: SourceSpan,
21    },
22
23    #[error("esperado ']'")]
24    MissingBrackets {
25        #[span]
26        span: SourceSpan,
27    },
28
29    #[error("esperado '}}'")]
30    MissingBraces {
31        #[span]
32        span: SourceSpan,
33    },
34
35    #[error("esperado ':'")]
36    MissingColon {
37        #[span]
38        span: SourceSpan,
39    },
40
41    #[error("token inesperado: {}", .token.lexeme.escape_debug())]
42    UnexpectedToken {
43        token: Token,
44
45        #[span]
46        span: SourceSpan,
47    },
48
49    #[error("o valor à direita do '=' não é um valor válido para receber atribuições")]
50    InvalidAssignmentTarget {
51        token: Token,
52
53        #[span]
54        span: SourceSpan,
55    },
56
57    #[error("retorno fora de uma função")]
58    IllegalReturn {
59        #[span]
60        span: SourceSpan,
61    },
62
63    #[error("'pare' fora de uma estrutura de repetição")]
64    IllegalBreak {
65        #[span]
66        span: SourceSpan,
67    },
68
69    #[error("'continue' fora de uma estrutura de repetição")]
70    IllegalContinue {
71        #[span]
72        span: SourceSpan,
73    },
74
75    #[error("parâmetro '{}' duplicado na função", .name)]
76    DuplicateParameter {
77        name: String,
78
79        #[span]
80        span: SourceSpan,
81    },
82
83    #[error("o operador '{}' não pode ser encadeado", .op.lexeme)]
84    InvalidChaining {
85        op: Token,
86
87        #[span]
88        span: SourceSpan,
89
90        #[message]
91        message: Option<String>,
92
93        #[help]
94        help: Option<String>,
95    },
96}
97
98macro_rules! unexpected_token {
99    ($token:expr) => {{
100        let token = $token;
101
102        match token.kind {
103            TokenKind::Eof => ParserError::UnexpectedEoi {
104                span: token.span.clone(),
105            },
106            _ => ParserError::UnexpectedToken {
107                token: token.clone_ref(),
108                span: token.span.clone(),
109            },
110        }
111    }};
112}
113
114pub(crate) use unexpected_token;