Skip to content

Commit e133465

Browse files
committed
refactor(parser): use diagnostics
1 parent 071c04c commit e133465

File tree

11 files changed

+799
-579
lines changed

11 files changed

+799
-579
lines changed

src/compile.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,21 @@ pub fn compile(args: CompileArgs) -> Result<(), Box<dyn std::error::Error>> {
4646

4747
file.read_to_string(&mut source_code)?;
4848

49-
let report_diag_and_exit = |diag: &Diagnostics| {
49+
let report_diag_and_exit = |diag: &Diagnostics| -> ! {
5050
println!("{diag}");
5151

52-
std::process::exit(0x45);
52+
std::process::exit(0x45)
5353
};
5454

5555
let mut diagnostics = Diagnostics::new(&source_code);
5656
let lexer = Lexer::new(&source_code);
57-
let ast = parser::Parser::new(lexer, &mut diagnostics)?.parse()?;
57+
let ast = match parser::Parser::new(lexer, &mut diagnostics) {
58+
Ok(mut parser) => match parser.parse() {
59+
Ok(ast) => ast,
60+
Err(_) => report_diag_and_exit(&diagnostics),
61+
},
62+
Err(_) => report_diag_and_exit(&diagnostics),
63+
};
5864

5965
if diagnostics.has_errors() {
6066
report_diag_and_exit(&mut diagnostics);

src/diagnostics.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
1-
use crate::lexer::span::Span;
1+
use crate::lexer::{span::Span, TokenKind};
22
use derive_more::derive::Display;
33

44
#[derive(Debug, Display)]
55
pub enum Diagnostic {
66
#[display("syntax error: unknown character")]
77
UnknownChar,
8+
#[display("syntax error: expected {_0}")]
9+
ParseExpected(String),
10+
#[display("syntax error: {_0} is not a valid prefix operator")]
11+
ExpressionPrefix(TokenKind),
12+
#[display("syntax error: {_0} is not a valid infix operator")]
13+
ExpressionInfix(TokenKind),
14+
#[display("field `{_0}` is already declared")]
15+
RepeatingField(String),
16+
#[display("parameter `{_0}` is already declared")]
17+
RepeatingParam(String),
18+
#[display("integer literal is too large value exceeds limit of `{}`", u64::MAX)]
19+
IntegerLitralTooLong,
20+
#[display("function definition is not allowed here")]
21+
IllegalFunctionDefinition,
822
}
923

1024
#[derive(Debug, Eq, PartialEq, Display)]
@@ -70,7 +84,7 @@ impl<'src> Diagnostics<'src> {
7084
}
7185

7286
fn lines(&self, span: &Span) -> usize {
73-
self.source[span.end..span.start]
87+
self.source[span.start..span.end]
7488
.chars()
7589
.filter(|ch| ch == &'\n')
7690
.count()

0 commit comments

Comments
 (0)