1#![deny(
2 warnings,
3 clippy::all,
4 clippy::pedantic,
5 unreachable_pub,
6 unused_allocation,
7 unused_extern_crates,
8 unused_assignments,
9 unused_comparisons
10)]
11#![allow(
12 clippy::missing_errors_doc, clippy::semicolon_if_nothing_returned, clippy::too_many_lines, )]
16
17use std::borrow::ToOwned;
18
19use lalrpop_util::lalrpop_mod;
20lalrpop_mod!(
21 #[allow(
22 warnings,
23 clippy::all,
24 clippy::pedantic,
25 unreachable_pub,
26 unused_allocation,
27 unused_extern_crates,
28 unused_assignments,
29 unused_comparisons
30 )]
31 parser,
32 "/src/parser/parser.rs"
33);
34
35pub mod ast;
36mod lex;
37pub mod template_string;
38
39pub use crate::diagnostic::Span;
40pub use ast::{Literal, Program};
41pub use lex::{Error, Token};
42
43pub fn parse(input: impl AsRef<str>) -> Result<Program, Error> {
44 let lexer = lex::Lexer::new(input.as_ref());
45
46 parser::ProgramParser::new()
47 .parse(input.as_ref(), lexer)
48 .map_err(|source| match source {
49 lalrpop_util::ParseError::User { error } => error,
50 source => Error::ParseError {
51 span: Span::new(0, input.as_ref().len()),
52 source: source
53 .map_token(|t| t.map(ToOwned::to_owned))
54 .map_error(|err| err.to_string()),
55 dropped_tokens: vec![],
56 },
57 })
58}
59
60pub fn parse_literal(input: impl AsRef<str>) -> Result<Literal, Error> {
61 let lexer = lex::Lexer::new(input.as_ref());
62
63 parser::LiteralParser::new()
64 .parse(input.as_ref(), lexer)
65 .map_err(|source| Error::ParseError {
66 span: Span::new(0, input.as_ref().len()),
67 source: source
68 .map_token(|t| t.map(ToOwned::to_owned))
69 .map_error(|err| err.to_string()),
70 dropped_tokens: vec![],
71 })
72}