mod.rs 6.0 KB
Newer Older
P
Phodal Huang 已提交
1 2
pub mod factory;

3
use crate::grammar::grammar::Grammar;
P
Phodal Huang 已提交
4
use crate::inter::{ILocation, IRawCaptures, IRawGrammar, IRawRepository, IRawRule};
P
Phodal Huang 已提交
5
use crate::reg_exp_source::{RegExpSource, RegExpSourceList};
P
Phodal Huang 已提交
6
use core::fmt;
P
Phodal Huang 已提交
7
use dyn_clone::{clone_trait_object, DynClone};
P
Phodal Huang 已提交
8
use crate::support::get_type_of;
P
Phodal Huang 已提交
9
use crate::rule::factory::ICompilePatternsResult;
10

11
#[derive(Clone, Debug)]
12
pub struct Rule {
P
Phodal Huang 已提交
13
    pub location: Option<ILocation>,
14 15 16 17 18 19
    pub id: i32,
    pub name: Option<String>,
    pub content_name: Option<String>,
}

impl Rule {
P
Phodal Huang 已提交
20 21 22 23 24 25 26 27 28 29 30 31
    pub fn new(
        location: ILocation,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
    ) -> Self {
        Rule {
            location: Some(location),
            id,
            name,
            content_name,
        }
32
    }
33
}
34

P
Phodal Huang 已提交
35 36 37
pub trait AbstractRule: DynClone {
    fn type_of(&self) -> String;
}
38

P
Phodal Huang 已提交
39 40 41 42 43 44
impl fmt::Debug for dyn AbstractRule {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "AbstractRule")
    }
}

45 46 47
clone_trait_object!(AbstractRule);

#[derive(Clone, Debug)]
48
pub struct IncludeOnlyRule {
P
Phodal Huang 已提交
49
    pub rule: Rule,
P
Phodal Huang 已提交
50 51 52 53 54 55 56 57
    pub captures: ICompilePatternsResult,
}

impl IncludeOnlyRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
P
Phodal Huang 已提交
58
        content_name: Option<String>,
P
Phodal Huang 已提交
59 60 61 62 63 64 65 66 67 68 69 70
        captures: ICompilePatternsResult,
    ) -> Self {
        IncludeOnlyRule {
            rule: Rule {
                location,
                id,
                name,
                content_name: None,
            },
            captures,
        }
    }
P
Phodal Huang 已提交
71
}
P
Phodal Huang 已提交
72

P
Phodal Huang 已提交
73 74 75 76 77
impl AbstractRule for IncludeOnlyRule {
    fn type_of(&self) -> String {
        String::from("IncludeOnlyRule")
    }
}
78

79
#[derive(Clone, Debug)]
80
pub struct BeginWhileRule {
P
Phodal Huang 已提交
81
    pub rule: Rule,
82 83
}

P
Phodal Huang 已提交
84
impl BeginWhileRule {
P
Phodal Huang 已提交
85 86 87 88 89 90 91 92 93 94 95
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: Option<String>,
        begin_captures: Vec<CaptureRule>,
        _while: Option<String>,
        while_captures: Vec<CaptureRule>,
        patterns: ICompilePatternsResult,
    ) -> BeginEndRule {
P
Phodal Huang 已提交
96
        BeginEndRule {
P
Phodal Huang 已提交
97 98 99 100 101 102
            rule: Rule {
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
103 104 105 106 107 108
            _begin: RegExpSource::new(begin.unwrap().clone(), id.clone()),
            begin_captures: None,
            _end: None,
            end_captures: None,
            apply_end_pattern_last: None,
            patterns: None,
P
Phodal Huang 已提交
109
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
110 111 112 113
        }
    }
}

P
Phodal Huang 已提交
114 115 116 117 118
impl AbstractRule for BeginWhileRule {
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
119

120
#[derive(Clone, Debug)]
121
pub struct MatchRule {
P
Phodal Huang 已提交
122 123
    pub rule: Rule,
    pub _match: RegExpSource,
124
    pub captures: Vec<CaptureRule>,
P
Phodal Huang 已提交
125 126 127
}

impl MatchRule {
P
Phodal Huang 已提交
128 129 130 131 132 133 134
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        match_s: String,
        captures: Vec<CaptureRule>,
    ) -> Self {
P
Phodal Huang 已提交
135
        MatchRule {
P
Phodal Huang 已提交
136 137 138 139 140 141
            rule: Rule {
                location,
                id,
                name,
                content_name: None,
            },
P
Phodal Huang 已提交
142
            _match: RegExpSource::new(match_s, id),
P
Phodal Huang 已提交
143 144 145
            captures,
        }
    }
146 147
}

P
Phodal Huang 已提交
148 149 150 151 152
impl AbstractRule for MatchRule {
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
153

154
#[derive(Clone, Debug)]
155
pub struct BeginEndRule {
P
Phodal Huang 已提交
156
    pub rule: Rule,
P
Phodal Huang 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    pub _begin: RegExpSource,
    pub begin_captures: Option<Vec<CaptureRule>>,
    pub _end: Option<RegExpSource>,
    // pub endHasBackReferences: Option<bool>,
    pub end_captures: Option<Vec<CaptureRule>>,
    pub apply_end_pattern_last: Option<bool>,
    // pub hasMissingPatterns: Option<bool>,
    pub patterns: Option<i32>,
    pub cached_compiled_patterns: Option<RegExpSourceList>,
}

impl BeginEndRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: String,
        begin_captures: Vec<CaptureRule>,
        _while: Option<String>,
        while_captures: Vec<CaptureRule>,
        apply_end_pattern_last: Option<bool>,
179
        // patterns: ICompilePatternsResult,
P
Phodal Huang 已提交
180 181
    ) -> BeginEndRule {
        BeginEndRule {
P
Phodal Huang 已提交
182 183 184 185 186 187
            rule: Rule {
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
188 189 190 191 192 193
            _begin: RegExpSource::new(begin.clone(), id.clone()),
            begin_captures: None,
            _end: None,
            end_captures: None,
            apply_end_pattern_last,
            patterns: None,
P
Phodal Huang 已提交
194
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
195 196
        }
    }
197 198
}

P
Phodal Huang 已提交
199 200 201 202 203
impl AbstractRule for BeginEndRule {
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
204

205
#[derive(Clone, Debug)]
206
pub struct CaptureRule {
P
Phodal Huang 已提交
207
    pub rule: Rule,
208 209
}

210 211 212
impl CaptureRule {
    pub fn new() -> Self {
        CaptureRule {
P
Phodal Huang 已提交
213 214 215 216 217 218
            rule: Rule {
                location: None,
                id: 0,
                name: None,
                content_name: None,
            },
219 220 221 222
        }
    }
}

P
Phodal Huang 已提交
223 224 225 226 227
impl AbstractRule for CaptureRule {
    fn type_of(&self) -> String {
        String::from("CaptureRule")
    }
}
228

P
Phodal Huang 已提交
229
#[derive(Clone, Debug)]
P
Phodal Huang 已提交
230
pub struct NoneRule {}
P
Phodal Huang 已提交
231

P
Phodal Huang 已提交
232 233 234 235 236
impl AbstractRule for NoneRule {
    fn type_of(&self) -> String {
        String::from("NoneRule")
    }
}
P
Phodal Huang 已提交
237

P
Phodal Huang 已提交
238 239 240
// todo: trait with types
// https://users.rust-lang.org/t/impl-trait-with-generic-function-for-generic-struct/27083/2
pub trait IRuleRegistry {
P
Phodal Huang 已提交
241 242 243
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
244
    fn register_id(&mut self) -> i32;
245
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
246
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
247 248 249
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
250 251 252 253 254
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
255 256 257
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}