Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Phodal
scie
提交
348b4833
S
scie
项目概览
Phodal
/
scie
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scie
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
348b4833
编写于
8月 23, 2020
作者:
P
Phodal Huang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: add simple way to register rule
上级
69af1691
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
34 addition
and
19 deletion
+34
-19
scie-grammar/Cargo.toml
scie-grammar/Cargo.toml
+2
-0
scie-grammar/src/grammar/grammar/mod.rs
scie-grammar/src/grammar/grammar/mod.rs
+16
-14
scie-grammar/src/rule.rs
scie-grammar/src/rule.rs
+16
-5
未找到文件。
scie-grammar/Cargo.toml
浏览文件 @
348b4833
...
...
@@ -13,3 +13,5 @@ onig = "6"
# json convert
serde
=
{
version
=
"1.0"
,
features
=
["derive"]
}
serde_json
=
"1.0"
dyn-clone
=
"1.0"
scie-grammar/src/grammar/grammar/mod.rs
浏览文件 @
348b4833
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
}
}
...
...
scie-grammar/src/rule.rs
浏览文件 @
348b4833
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录