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

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

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

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

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

45 46
serialize_trait_object!(AbstractRule);

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

53 54
clone_trait_object!(AbstractRule);

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

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

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

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

    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>,
106 107
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}