lwb_parser/parser/syntax_file/
mod.rs1use crate::error::display_miette_error;
2use crate::parser::ast::generate_ast::{generate_ast, BasicAstInfo, BasicAstNode};
3use crate::parser::peg::parse_error::PEGParseError;
4use crate::parser::peg::parser_sugar::parse_file;
5use crate::parser::syntax_file::convert_syntax_file_ast::{convert, AstConversionError};
6use crate::sources::source_file::SourceFile;
7use itertools::Itertools;
8use thiserror::Error;
9
10#[rustfmt::skip]
11pub mod ast;
12pub mod convert_syntax_file_ast;
13
14language!(pub SyntaxFile at mod ast);
15
16#[derive(Debug, Error)]
17pub enum ParseError {
18 #[error("failed to deserialize saved parser")]
19 Bincode(#[from] bincode::Error),
20
21 #[error("failed to convert saved syntax file definition ast to legacy syntax file definition ast (this is a bug! please report it)")]
22 ConvertAstError(#[from] AstConversionError),
23
24 #[error("PEG Errors: \n{}", _0.iter().map(display_miette_error).join("\n"))]
25 PEG(Vec<PEGParseError>),
26}
27
28pub fn parse_language<AST: BasicAstNode>(
29 input: &SourceFile,
30 parser: &[u8],
31) -> Result<AST, ParseError> {
32 let syntax_file_ast: ast::AST_ROOT<BasicAstInfo> = bincode::deserialize(parser)?;
35 let legacy_ast = convert(syntax_file_ast)?; let (pairs, errs) = parse_file(&legacy_ast, input);
41 if !errs.is_empty() {
42 return Err(ParseError::PEG(errs));
43 }
44
45 let ast = generate_ast(&pairs);
46
47 Ok(ast)
48}