Skip to main content

titan_ast_runtime_lib/
ast_application.rs

1use 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    //matadata
17    pub(crate) grammars: Vec<AstGrammar>,
18    //dfa
19    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}