feat: add simple way to register rule

上级 69af1691
......@@ -13,3 +13,5 @@ onig = "6"
# json convert
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dyn-clone = "1.0"
use crate::inter::{IRawGrammar, IRawRepository, ILocation, IRawRule, IRawRepositoryMap};
use crate::rule::{RuleFactory, IRuleFactoryHelper, IGrammarRegistry, IRuleRegistry, Rule, AbstractRule, BeginEndRule};
use onig::*;
use std::collections::HashMap;
use std::borrow::Borrow;
pub struct StackElement {}
......@@ -39,6 +41,8 @@ pub trait IGrammar {
pub struct Grammar {
root_id: i32,
grammar: IRawGrammar,
pub last_rule_id: i32,
pub rule_id2desc: HashMap<i32, Box<dyn AbstractRule>>,
}
pub fn init_grammar(grammar: IRawGrammar, base: Option<IRawRule>) -> IRawGrammar {
......@@ -57,7 +61,7 @@ pub fn init_grammar(grammar: IRawGrammar, base: Option<IRawRule>) -> IRawGrammar
_grammar.repository = Some(IRawRepository {
map: Box::new(repository_map.clone()),
location: None
location: None,
});
_grammar
......@@ -67,8 +71,10 @@ impl Grammar {
pub fn new(grammar: IRawGrammar) -> Grammar {
let _grammar = init_grammar(grammar.clone(), None);
Grammar {
last_rule_id: 0,
grammar: _grammar,
root_id: -1,
rule_id2desc: Default::default(),
}
}
// todo: refactor to callback ??
......@@ -83,7 +89,7 @@ impl Grammar {
}
fn tokenize(
&self,
&mut self,
line_text: String,
prev_state: Option<StackElement>,
emit_binary_tokens: bool,
......@@ -91,11 +97,11 @@ impl Grammar {
if self.root_id == -1 {
let repository = self.grammar.repository.clone().unwrap();
let based = repository.clone().map.base_s.unwrap();
RuleFactory::get_compiled_rule_id(based.clone(), Box::new(self.clone()), repository.clone());
RuleFactory::get_compiled_rule_id(based.clone(), self, repository.clone());
}
}
pub fn tokenize_line(&self, line_text: String, prev_state: Option<StackElement>) {
pub fn tokenize_line(&mut self, line_text: String, prev_state: Option<StackElement>) {
self.tokenize(line_text, prev_state, false)
}
......@@ -115,16 +121,12 @@ impl IRuleRegistry for Grammar {
Rule::new(ILocation::new(), pattern_id, None, None)
}
fn register_rule(&self, c: fn() -> Box<dyn AbstractRule>) -> Box<dyn AbstractRule> {
let rule = BeginEndRule {
rule: Rule {
location: ILocation::new(),
id: 0,
name: None,
content_name: None
}
};
Box::new(rule)
fn register_rule(&mut self, c: fn(id: i32) -> Box<dyn AbstractRule>) -> Box<dyn AbstractRule> {
self.last_rule_id = self.last_rule_id + 1;
let id = self.last_rule_id;
let result = c(id);
self.rule_id2desc.insert(id.clone(), result.clone());
result
}
}
......
use crate::inter::{IRawRepository, IRawGrammar, ILocation, IRawRule};
use dyn_clone::{clone_trait_object, DynClone};
use std::borrow::Borrow;
use crate::grammar::grammar::Grammar;
pub struct RuleFactory {}
fn create_rule() -> Box<dyn AbstractRule> {
fn create_rule(id: i32) -> Box<dyn AbstractRule> {
let rule = BeginEndRule {
rule: Rule {
location: ILocation::new(),
id: 0,
id: id,
name: None,
content_name: None
}
......@@ -16,7 +19,7 @@ fn create_rule() -> Box<dyn AbstractRule> {
}
impl RuleFactory {
pub fn get_compiled_rule_id(desc: IRawRule, helper: Box<&dyn IRuleFactoryHelper>, repository: IRawRepository) -> i32 {
pub fn get_compiled_rule_id(desc: IRawRule, helper: &mut Grammar, repository: IRawRepository) -> i32 {
match desc.id {
None => {
helper.register_rule(create_rule);
......@@ -31,6 +34,7 @@ impl RuleFactory {
}
#[derive(Clone, Debug)]
pub struct Rule {
pub location: ILocation,
pub id: i32,
......@@ -44,32 +48,39 @@ impl Rule {
}
}
pub trait AbstractRule {}
pub trait AbstractRule: DynClone {}
clone_trait_object!(AbstractRule);
#[derive(Clone, Debug)]
pub struct IncludeOnlyRule {
pub rule: Rule
}
impl AbstractRule for IncludeOnlyRule {}
#[derive(Clone, Debug)]
pub struct BeginWhileRule {
pub rule: Rule
}
impl AbstractRule for BeginWhileRule {}
#[derive(Clone, Debug)]
pub struct MatchRule {
pub rule: Rule
}
impl AbstractRule for MatchRule {}
#[derive(Clone, Debug)]
pub struct BeginEndRule {
pub rule: Rule
}
impl AbstractRule for BeginEndRule {}
#[derive(Clone, Debug)]
pub struct CaptureRule {
pub rule: Rule
}
......@@ -84,7 +95,7 @@ pub trait IRuleRegistry {
// fn method(&self) -> Self::Output;
fn get_rule(&self, pattern_id: i32) -> Rule;
fn register_rule(&self, c: fn() -> Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
fn register_rule(&mut self, c: fn(id: i32) -> Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
}
pub trait IGrammarRegistry {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册