titan_ast_runtime_lib/
ast_application.rs1use crate::{
2 ast::{Ast, AstGrammar},
3 ast_automata::AstBuilder,
4 ast_automata_builder,
5 automata_data::AutomataData,
6 error::AstAppError,
7 persistent_object::PersistentObject,
8 super_backtracking_bottom_up_ast_automata::SuperBacktrackingBottomUpAstAutomata,
9 super_dfa_token_automata::SuperDfaTokenAutomata,
10 token_automata::TokenBuilder,
11 token_automata_builder,
12};
13
14#[derive(Clone)]
15pub struct RuntimeAutomataAstApplication {
16 pub(crate) grammars: Vec<AstGrammar>,
18 pub(crate) token_automata: SuperDfaTokenAutomata,
20 pub(crate) ast_automata: SuperBacktrackingBottomUpAstAutomata,
21}
22
23impl RuntimeAutomataAstApplication {
24 pub fn build_ast(&mut self, source_code_file_path: &String) -> Result<Ast, AstAppError> {
25 let tokens = self.token_automata.build_token(source_code_file_path)?;
26 self.ast_automata.build_ast(tokens)
27 }
28
29 pub fn set_context(&mut self, automata_file_path: &String) -> Result<(), AstAppError> {
30 let mut persistent_object: PersistentObject = Default::default();
31
32 persistent_object.persistent_data.init(automata_file_path)?;
33 persistent_object.init();
34
35 let automata_data: AutomataData = persistent_object.into();
36
37 self.token_automata = token_automata_builder::build(&automata_data);
38 self.ast_automata = ast_automata_builder::build(&automata_data);
39
40 self.set_meta_data(automata_data);
41
42 Ok(())
43 }
44
45 pub fn get_grammars(&self) -> Vec<AstGrammar> {
46 self.grammars.clone()
47 }
48
49 fn set_meta_data(&mut self, automata_data: AutomataData) {
50 let mut grammars: Vec<AstGrammar> = Vec::with_capacity(automata_data.grammars.len());
51 for original_grammar in automata_data.grammars.iter() {
52 grammars.push(original_grammar.get_ast_grammar());
53 }
54 self.grammars = grammars;
55 }
56}
57
58impl Default for RuntimeAutomataAstApplication {
59 fn default() -> Self {
60 Self {
61 token_automata: Default::default(),
62 ast_automata: Default::default(),
63 grammars: Default::default(),
64 }
65 }
66}