lwb_parser/parser/syntax_file/
mod.rs

1use 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(SERIALIZED_AST).unwrap();
33    // let legacy_ast = convert(syntax_file_ast)?; // TODO: make peg parser use new version of ast
34    let syntax_file_ast: ast::AST_ROOT<BasicAstInfo> = bincode::deserialize(parser)?;
35    let legacy_ast = convert(syntax_file_ast)?; // TODO: make peg parser use new version of ast
36
37    // let sf = SourceFile::open("rust-lwb-bootstrap/syntax-file.syntax").expect("open error");
38    // let legacy_ast = bootstrap::parse(&sf).expect("should parse");
39
40    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}