feat: make rule basic parse

上级 e84b420c
......@@ -38,6 +38,8 @@ pub trait IGrammar {
fn tokenize_line2(line_text: String, prev_state: Option<StackElement>) -> ITokenizeLineResult2;
}
#[derive(Debug, Clone)]
pub struct Grammar {
root_id: i32,
grammar: IRawGrammar,
......@@ -117,14 +119,17 @@ impl IGrammarRegistry for Grammar {
}
impl IRuleRegistry for Grammar {
fn register_id(&mut self) -> i32 {
self.last_rule_id = self.last_rule_id + 1;
self.last_rule_id
}
fn get_rule(&self, pattern_id: i32) -> Rule {
Rule::new(ILocation::new(), pattern_id, None, None)
}
fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule> {
self.last_rule_id = self.last_rule_id + 1;
let id = self.last_rule_id;
self.rule_id2desc.insert(id.clone(), result.clone());
self.rule_id2desc.insert(self.last_rule_id.clone(), result.clone());
result
}
}
......
......@@ -2,6 +2,7 @@ use crate::inter::{IRawRepository, IRawGrammar, ILocation, IRawRule, IRawCapture
use dyn_clone::{clone_trait_object, DynClone};
use std::borrow::Borrow;
use crate::grammar::grammar::Grammar;
use core::fmt;
pub struct RuleFactory {}
......@@ -14,9 +15,24 @@ impl RuleFactory {
pub fn get_compiled_rule_id(mut desc: IRawRule, helper: &mut Grammar, repository: IRawRepository) -> i32 {
match desc.id {
None => {
let id = helper.register_id();
desc.id = Some(id.clone());
match desc.match_s {
None => {}
Some(match_s) => {
MatchRule::new(
desc.location.clone(),
id.clone(),
desc.name.clone(),
match_s.clone(),
RuleFactory::_compile_captures(desc.captures.clone(), helper, repository.clone()),
);
}
};
// helper.register_rule();
},
Some(_) => {},
}
Some(_) => {}
}
desc.id.unwrap()
......@@ -45,6 +61,12 @@ pub struct RegExpSource {}
pub trait AbstractRule: DynClone {}
impl fmt::Debug for dyn AbstractRule {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "AbstractRule")
}
}
clone_trait_object!(AbstractRule);
#[derive(Clone, Debug)]
......@@ -106,6 +128,7 @@ pub trait IRuleRegistry {
// type Output;
// fn method(&self) -> Self::Output;
fn register_id(&mut self) -> i32;
fn get_rule(&self, pattern_id: i32) -> Rule;
fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册