sbpf_assembler/
errors.rs

1use crate::define_compile_errors;
2use std::ops::Range;
3
4// labels could be overridden by passing a valid custom_label in the error variant
5// if not provided, the label will use default messages from below
6define_compile_errors! {
7    // Lexical errors
8    InvalidNumber {
9        error = "Invalid number '{number}'",
10        label = "Invalid number",
11        fields = { number: String, span: Range<usize> }
12    },
13    InvalidRegister {
14        error = "Invalid register '{register}'",
15        label = "Invalid register",
16        fields = { register: String, span: Range<usize> }
17    },
18    UnexpectedCharacter {
19        error = "Unexpected character '{character}'",
20        label = "Unexpected character",
21        fields = { character: char, span: Range<usize> }
22    },
23    UnterminatedStringLiteral {
24        error = "Unterminated string literal",
25        label = "Unterminated string literal",
26        fields = { span: Range<usize> }
27    },
28    // Syntactic errors
29    InvalidGlobalDecl {
30        error = "Invalid global declaration",
31        label = "Expected <identifier> for entry label",
32        fields = { span: Range<usize> }
33    },
34    InvalidExternDecl {
35        error = "Invalid extern declaration",
36        label = "Invalid extern declaration",
37        fields = { span: Range<usize> }
38    },
39    InvalidRodataDecl {
40        error = "Invalid rodata declaration",
41        label = "Invalid rodata declaration",
42        fields = { span: Range<usize> }
43    },
44    InvalidEquDecl {
45        error = "Invalid equ declaration",
46        label = "Invalid equ declaration",
47        fields = { span: Range<usize> }
48    },
49    InvalidDirective {
50        error = "Invalid directive '{directive}'",
51        label = "Invalid directive",
52        fields = { directive: String, span: Range<usize> }
53    },
54    InvalidInstruction {
55        error = "Invalid '{instruction}' instruction",
56        label = "Invalid instruction",
57        fields = { instruction: String, span: Range<usize> }
58    },
59    UnexpectedToken {
60        error = "Unexpected token '{token}'",
61        label = "Unexpected token",
62        fields = { token: String, span: Range<usize> }
63    },
64    UnmatchedParen {
65        error = "Unmatched parenthesis",
66        label = "Unmatched parenthesis",
67        fields = { span: Range<usize> }
68    },
69    OutOfRangeLiteral {
70        error = "Out of range literal'",
71        label = "Out of range literal",
72        fields = { span: Range<usize> }
73    },
74    InvalidRODataDirective {
75        error = "Invalid rodata directive",
76        label = "Invalid rodata directive",
77        fields = { span: Range<usize> }
78    },
79    // Semantic errors
80    UndefinedLabel {
81        error = "Undefined label '{label}'",
82        label = "Undefined label",
83        fields = { label: String, span: Range<usize> }
84    },
85    DuplicateLabel {
86        error = "Duplicate label '{label}'",
87        label = "Label redefined",
88        fields = { label: String, span: Range<usize>, original_span: Range<usize> }
89    },
90}