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

P
Phodal Huang 已提交
3
use crate::inter::{ILocation, IRawGrammar, IRawRepository};
P
Phodal Huang 已提交
4
use crate::reg_exp_source::{RegExpSource, RegExpSourceList};
5
use crate::rule::rule_factory::ICompilePatternsResult;
P
Phodal Huang 已提交
6
use core::fmt;
P
Phodal Huang 已提交
7
use dyn_clone::{clone_trait_object, DynClone};
8
use serde::{Serialize, Serializer};
9

P
Phodal Huang 已提交
10
#[derive(Clone, Debug, Serialize)]
11
pub struct Rule {
P
Phodal Huang 已提交
12
    pub _type: String,
P
Phodal Huang 已提交
13
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
14
    pub location: Option<ILocation>,
15
    pub id: i32,
P
Phodal Huang 已提交
16
    #[serde(skip_serializing_if="Option::is_none")]
17
    pub name: Option<String>,
P
Phodal Huang 已提交
18
    #[serde(skip_serializing_if="Option::is_none")]
19 20 21 22
    pub content_name: Option<String>,
}

impl Rule {
P
Phodal Huang 已提交
23 24 25 26 27 28 29
    pub fn new(
        location: ILocation,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
    ) -> Self {
        Rule {
P
Phodal Huang 已提交
30
            _type: "".to_string(),
P
Phodal Huang 已提交
31 32 33 34 35
            location: Some(location),
            id,
            name,
            content_name,
        }
36
    }
37
}
38

P
Phodal Huang 已提交
39
pub trait AbstractRule: DynClone + erased_serde::Serialize {
P
Phodal Huang 已提交
40
    fn id(&self) -> i32;
P
Phodal Huang 已提交
41 42
    fn type_of(&self) -> String;
}
43

44 45
serialize_trait_object!(AbstractRule);

P
Phodal Huang 已提交
46 47 48 49 50 51
impl fmt::Debug for dyn AbstractRule {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "AbstractRule")
    }
}

52 53
clone_trait_object!(AbstractRule);

P
Phodal Huang 已提交
54
#[derive(Clone, Debug, Serialize)]
55
pub struct IncludeOnlyRule {
P
Phodal Huang 已提交
56
    #[serde(flatten)]
P
Phodal Huang 已提交
57
    pub rule: Rule,
P
Phodal Huang 已提交
58
    pub patterns: Vec<i32>,
P
Phodal Huang 已提交
59 60 61 62 63 64 65
}

impl IncludeOnlyRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
P
Phodal Huang 已提交
66
        content_name: Option<String>,
P
Phodal Huang 已提交
67 68 69 70
        captures: ICompilePatternsResult,
    ) -> Self {
        IncludeOnlyRule {
            rule: Rule {
P
Phodal Huang 已提交
71
                _type: String::from("IncludeOnlyRule"),
P
Phodal Huang 已提交
72 73 74
                location,
                id,
                name,
P
Phodal Huang 已提交
75
                content_name,
P
Phodal Huang 已提交
76
            },
P
Phodal Huang 已提交
77
            patterns: captures.patterns,
P
Phodal Huang 已提交
78 79
        }
    }
P
Phodal Huang 已提交
80
}
P
Phodal Huang 已提交
81

P
Phodal Huang 已提交
82
impl AbstractRule for IncludeOnlyRule {
P
Phodal Huang 已提交
83
    fn id(&self) -> i32 { self.rule.id }
P
Phodal Huang 已提交
84 85 86 87
    fn type_of(&self) -> String {
        String::from("IncludeOnlyRule")
    }
}
88

P
Phodal Huang 已提交
89
#[derive(Clone, Debug, Serialize)]
90
pub struct BeginWhileRule {
P
Phodal Huang 已提交
91
    pub rule: Rule,
P
Phodal Huang 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104

    pub begin: RegExpSource,
    pub begin_captures: Vec<Box<dyn AbstractRule>>,

    pub while_s: Option<String>,
    pub while_captures: Vec<Box<dyn AbstractRule>>,

    #[serde(skip_serializing_if="Option::is_none")]
    pub apply_end_pattern_last: Option<bool>,

    pub patterns: ICompilePatternsResult,
    #[serde(skip_serializing_if="Option::is_none")]
    pub cached_compiled_patterns: Option<RegExpSourceList>,
105 106
}

P
Phodal Huang 已提交
107
impl BeginWhileRule {
P
Phodal Huang 已提交
108 109 110 111 112 113
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: Option<String>,
P
Phodal Huang 已提交
114
        begin_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
115
        _while: Option<String>,
P
Phodal Huang 已提交
116
        while_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
117
        patterns: ICompilePatternsResult,
P
Phodal Huang 已提交
118 119
    ) -> BeginWhileRule {
        BeginWhileRule {
P
Phodal Huang 已提交
120
            rule: Rule {
P
Phodal Huang 已提交
121
                _type: String::from("BeginEndRule"),
P
Phodal Huang 已提交
122 123 124 125 126
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
127
            begin: RegExpSource::new(begin.unwrap().clone(), id.clone()),
P
Phodal Huang 已提交
128 129 130
            begin_captures,
            while_s: _while,
            while_captures,
P
Phodal Huang 已提交
131
            apply_end_pattern_last: None,
P
Phodal Huang 已提交
132
            patterns,
P
Phodal Huang 已提交
133
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
134 135 136 137
        }
    }
}

P
Phodal Huang 已提交
138
impl AbstractRule for BeginWhileRule {
P
Phodal Huang 已提交
139
    fn id(&self) -> i32 { self.rule.id }
P
Phodal Huang 已提交
140 141 142 143
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
144

P
Phodal Huang 已提交
145
#[derive(Clone, Debug, Serialize)]
146
pub struct MatchRule {
P
Phodal Huang 已提交
147 148
    pub rule: Rule,
    pub _match: RegExpSource,
P
Phodal Huang 已提交
149
    pub captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
150 151 152
}

impl MatchRule {
P
Phodal Huang 已提交
153 154 155 156 157
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        match_s: String,
P
Phodal Huang 已提交
158
        captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
159
    ) -> Self {
P
Phodal Huang 已提交
160
        MatchRule {
P
Phodal Huang 已提交
161
            rule: Rule {
P
Phodal Huang 已提交
162
                _type: String::from("MatchRule"),
P
Phodal Huang 已提交
163 164 165 166 167
                location,
                id,
                name,
                content_name: None,
            },
P
Phodal Huang 已提交
168
            _match: RegExpSource::new(match_s, id),
P
Phodal Huang 已提交
169 170 171
            captures,
        }
    }
172 173
}

P
Phodal Huang 已提交
174
impl AbstractRule for MatchRule {
P
Phodal Huang 已提交
175
    fn id(&self) -> i32 { self.rule.id }
P
Phodal Huang 已提交
176 177 178 179
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
180

P
Phodal Huang 已提交
181
#[derive(Clone, Debug, Serialize)]
182
pub struct BeginEndRule {
P
Phodal Huang 已提交
183
    #[serde(flatten)]
P
Phodal Huang 已提交
184
    pub rule: Rule,
P
Phodal Huang 已提交
185
    pub begin: RegExpSource,
P
Phodal Huang 已提交
186 187
    pub begin_captures: Vec<Box<dyn AbstractRule>>,
    pub end: RegExpSource,
P
Phodal Huang 已提交
188
    // pub endHasBackReferences: Option<bool>,
P
Phodal Huang 已提交
189
    pub end_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
190
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
191 192
    pub apply_end_pattern_last: Option<bool>,
    // pub hasMissingPatterns: Option<bool>,
P
Phodal Huang 已提交
193
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
194
    pub cached_compiled_patterns: Option<RegExpSourceList>,
P
Phodal Huang 已提交
195
    pub patterns: Vec<i32>,
P
Phodal Huang 已提交
196 197 198 199 200 201 202 203 204
}

impl BeginEndRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: String,
P
Phodal Huang 已提交
205 206 207
        begin_captures: Vec<Box<dyn AbstractRule>>,
        _end: String,
        end_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
208
        apply_end_pattern_last: Option<bool>,
P
Phodal Huang 已提交
209
        patterns: Vec<i32>,
P
Phodal Huang 已提交
210 211
    ) -> BeginEndRule {
        BeginEndRule {
P
Phodal Huang 已提交
212
            rule: Rule {
P
Phodal Huang 已提交
213
                _type: String::from("BeginEndRule"),
P
Phodal Huang 已提交
214 215 216 217 218
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
219
            begin: RegExpSource::new(begin.clone(), id.clone()),
220
            begin_captures,
P
Phodal Huang 已提交
221
            end: RegExpSource::new(_end.clone(), id.clone()),
222
            end_captures,
P
Phodal Huang 已提交
223
            apply_end_pattern_last,
P
Phodal Huang 已提交
224
            patterns,
P
Phodal Huang 已提交
225
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
226 227
        }
    }
228 229
}

P
Phodal Huang 已提交
230
impl AbstractRule for BeginEndRule {
P
Phodal Huang 已提交
231
    fn id(&self) -> i32 { self.rule.id }
P
Phodal Huang 已提交
232 233 234 235
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
236

P
Phodal Huang 已提交
237
#[derive(Clone, Debug, Serialize)]
238
pub struct CaptureRule {
P
Phodal Huang 已提交
239
    pub rule: Rule,
240
    pub retokenize_captured_with_rule_id: i32
241 242
}

243
impl CaptureRule {
244
    pub fn empty() -> Self {
245
        CaptureRule {
P
Phodal Huang 已提交
246
            rule: Rule {
247
                _type: "".to_string(),
P
Phodal Huang 已提交
248 249 250
                location: None,
                id: 0,
                name: None,
251
                content_name: None
252 253
            },
            retokenize_captured_with_rule_id: 0
254 255
        }
    }
256
    pub fn new(location: Option<ILocation>, id: i32, name: Option<String>, content_name: Option<String>, retokenize_captured_with_rule_id: i32) -> Self {
257 258 259 260 261 262 263
        CaptureRule {
            rule: Rule {
                _type: String::from("CaptureRule"),
                location,
                id,
                name,
                content_name,
P
Phodal Huang 已提交
264
            },
265
            retokenize_captured_with_rule_id
266 267 268 269
        }
    }
}

P
Phodal Huang 已提交
270
impl AbstractRule for CaptureRule {
P
Phodal Huang 已提交
271 272
    fn id(&self) -> i32 { self.rule.id }
    fn type_of(&self) -> String { String::from("CaptureRule") }
P
Phodal Huang 已提交
273
}
274

P
Phodal Huang 已提交
275
#[derive(Clone, Debug, Serialize)]
P
Phodal Huang 已提交
276
pub struct NoneRule {}
P
Phodal Huang 已提交
277

P
Phodal Huang 已提交
278
impl AbstractRule for NoneRule {
P
Phodal Huang 已提交
279
    fn id(&self) -> i32 { 0 }
P
Phodal Huang 已提交
280 281 282 283
    fn type_of(&self) -> String {
        String::from("NoneRule")
    }
}
P
Phodal Huang 已提交
284

P
Phodal Huang 已提交
285 286 287
// 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 已提交
288 289 290
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
291
    fn register_id(&mut self) -> i32;
292
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
293
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
294 295 296
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
297 298 299 300 301
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
302 303 304
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}