tenda_parser/
parser_error.rs1use 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;