mod.rs 7.4 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 41
    fn type_of(&self) -> String;
}
42

43 44
serialize_trait_object!(AbstractRule);

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

51 52
clone_trait_object!(AbstractRule);

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

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

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

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

    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>,
103 104
}

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

P
Phodal Huang 已提交
136 137 138 139 140
impl AbstractRule for BeginWhileRule {
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
141

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

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

P
Phodal Huang 已提交
171 172 173 174 175
impl AbstractRule for MatchRule {
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
176

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

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

P
Phodal Huang 已提交
226 227 228 229 230
impl AbstractRule for BeginEndRule {
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
231

P
Phodal Huang 已提交
232
#[derive(Clone, Debug, Serialize)]
233
pub struct CaptureRule {
P
Phodal Huang 已提交
234
    pub rule: Rule,
235 236
}

237
impl CaptureRule {
238
    pub fn empty() -> Self {
239
        CaptureRule {
P
Phodal Huang 已提交
240
            rule: Rule {
241
                _type: "".to_string(),
P
Phodal Huang 已提交
242 243 244
                location: None,
                id: 0,
                name: None,
245 246 247 248 249 250 251 252 253 254 255 256
                content_name: None
            }
        }
    }
    pub fn new(location: Option<ILocation>, id: i32, name: Option<String>, content_name: Option<String>) -> Self {
        CaptureRule {
            rule: Rule {
                _type: String::from("CaptureRule"),
                location,
                id,
                name,
                content_name,
P
Phodal Huang 已提交
257
            },
258 259 260 261
        }
    }
}

P
Phodal Huang 已提交
262 263 264 265 266
impl AbstractRule for CaptureRule {
    fn type_of(&self) -> String {
        String::from("CaptureRule")
    }
}
267

P
Phodal Huang 已提交
268
#[derive(Clone, Debug, Serialize)]
P
Phodal Huang 已提交
269
pub struct NoneRule {}
P
Phodal Huang 已提交
270

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

P
Phodal Huang 已提交
277 278 279
// 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 已提交
280 281 282
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
283
    fn register_id(&mut self) -> i32;
284
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
285
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
286 287 288
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
289 290 291 292 293
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
294 295 296
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}