1use crate::core::Language;
6
7use sdk::{ASTParser, CreateParseTree, Error, ParseTreeResult, TokenStream};
8
9pub mod core;
10pub mod dynamic;
11pub mod emit;
12pub mod grammar;
13pub mod sdk;
14
15pub fn parse_language_from_grammar(
23 grammar: &str,
24 stack_size: usize,
25) -> Result<Language, Vec<Error>> {
26 let lex_output = grammar::tokenize(grammar);
28 let mut ts = TokenStream::new(&lex_output.tokens, stack_size);
29 let ast_parser = grammar::Parser;
30 let asts = match ast_parser.parse_ast_all(&mut ts) {
31 Err((_, errors)) => {
32 return Err(errors);
35 }
36 Ok(asts) => asts,
37 };
38 let mut lang_builder = Box::default();
40 let mut errors = vec![];
41 let mut pts = vec![];
42 for ast in &asts {
43 match ast.parse_pt(lang_builder) {
44 ParseTreeResult::Err { ctx, err, .. } => {
45 errors.extend(err);
46 lang_builder = ctx;
47 }
48 ParseTreeResult::Ok { pt, ctx } => {
49 pts.push(pt);
50 lang_builder = ctx;
51 }
52 }
53 }
54 if !errors.is_empty() {
55 return Err(errors);
56 }
57 lang_builder.build(&pts)
58}