Newer
Older
#[cfg(test)]
mod test_suite;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use crate::error::{ForgeError, ForgeErrorKind, ForgeResult};
use crate::print_forge_error;
pub use atoms::TokenSlice;
pub fn slice<'a>(toks: &'a [crate::lexer::ScriptToken]) -> TokenSlice<'a> {
TokenSlice(toks)
}
pub fn parse_expression(expr: &str) -> ForgeResult<ast::Expression> {
let tokens = crate::lexer::script_to_tokens(expr)?;
let result = match grammar::expression(&TokenSlice(tokens.as_slice())) {
Ok(expr) => Ok(expr),
Err(parse_error) => {
let bad_token = &tokens[parse_error.location];
Err(ForgeError {
kind: ForgeErrorKind::UnexpectedToken {
found: bad_token.clone(),
expected: parse_error.expected,
},
})
}
};
result.map_err(|e| {
print_forge_error(expr, &e);
e
})
}
pub fn parse_program(prog: &str) -> ForgeResult<ast::Program> {
let tokens = crate::lexer::script_to_tokens(prog)?;
let result = match grammar::program(&TokenSlice(tokens.as_slice())) {
Ok(prog) => Ok(prog.clone()),
Err(parse_error) => {
let bad_token = &tokens[parse_error.location];
Err(ForgeError {
kind: ForgeErrorKind::UnexpectedToken {
found: bad_token.clone(),
expected: parse_error.expected,
},
})
}
};
result.map_err(|e| {
print_forge_error(prog, &e);
e
})
}