改进语法,去除节点层次。

This commit is contained in:
codeboss 2025-03-29 17:53:28 +08:00
parent b500e9d095
commit 7cbe3dd220
13 changed files with 522 additions and 746 deletions

View File

@ -7,7 +7,8 @@ open System.Linq
/// ///
type AstObject() = type AstObject() =
class class
member this.address() = string(this.GetHashCode ()) abstract member address:unit -> string
default this.address():string = string(this.GetHashCode ())
abstract member members:unit -> AstObject list abstract member members:unit -> AstObject list
default this.members(): AstObject list = [] default this.members(): AstObject list = []
@ -51,19 +52,17 @@ open System.Linq
end end
/// ///
type PointRef(bind: XmlElement, texts: TextItem list) = type FragmentRef(bind: XmlElement, texts: TextItem list) =
class class
inherit AstObject() inherit AstObject()
new(bind: XmlElement) = PointRef(bind, []) new(bind: XmlElement) = FragmentRef(bind, [])
member this.pointRef() =
bind.GetAttribute "point"
member this.sliceRef() = member this.sliceRef() =
bind.GetAttribute "slice" bind.GetAttribute "slice"
member this.storyRef() = member this.storyRef() =
bind.GetAttribute "story" bind.GetAttribute "story"
member this.appendChild(objs: TextItem list) = member this.appendChild(objs: TextItem list) =
PointRef(bind, texts@objs) FragmentRef(bind, texts@objs)
member this.children() = member this.children() =
texts texts
@ -75,77 +74,35 @@ open System.Linq
| null -> [] | null -> []
| _ -> | _ ->
match TextItem.GenerateText(child) with match TextItem.GenerateText(child) with
| Some text -> text::PointRef.GenerateFromChildSibling(child.NextSibling) | Some text -> text::FragmentRef.GenerateFromChildSibling(child.NextSibling)
| None -> PointRef.GenerateFromChildSibling(child.NextSibling) | None -> FragmentRef.GenerateFromChildSibling(child.NextSibling)
static member GeneratePointRef(ref_opt: XmlNode): Option<PointRef> = static member GeneratePointRef(ref_opt: XmlNode): Option<FragmentRef> =
match ref_opt with match ref_opt with
| :? XmlElement as refo when refo.Name.Equals "refer" -> | :? XmlElement as refo when refo.Name.Equals "refer" ->
let text_objects = PointRef.GenerateFromChildSibling(refo.FirstChild) let text_objects = FragmentRef.GenerateFromChildSibling(refo.FirstChild)
Some(PointRef(refo, text_objects)) Some(FragmentRef(refo, text_objects))
| _ -> None | _ -> None
end end
/// type SliceChildType = |Text of TextItem |Ref of FragmentRef
type PointChildType = |Text of TextItem |Refer of PointRef
type PointDef(bind: XmlElement, objs: AstObject list) =
class
inherit AstObject()
new(bind: XmlElement) = PointDef(bind, [])
member this.name() = bind.GetAttribute "name"
member this.appendChild(o: PointChildType) =
match o with
|Text t -> PointDef(bind, objs@[t])
|Refer r -> PointDef(bind, objs@[r])
member this.children() = objs
override this.members(): AstObject list = objs
static member GenerateFromChildSibling(child: XmlNode): PointChildType list =
match child with
| null -> []
| _ ->
let h = match child.Name with
| "text-section" -> Some(Text(TextItem.GenerateText(child).Value))
| "refer" -> Some(Refer(PointRef.GeneratePointRef(child).Value))
| _ -> None
match h with
| Some childx -> childx::PointDef.GenerateFromChildSibling(child.NextSibling)
| None -> PointDef.GenerateFromChildSibling(child.NextSibling)
static member GeneratePointDef(def_opt: XmlNode) : Option<PointDef> =
match def_opt with
| :? XmlElement as defo when defo.Name.Equals "point" ->
let child_objs = PointDef.GenerateFromChildSibling(defo.FirstChild)
let objs = child_objs |> List.map (
fun o-> match o with
|Refer refs -> refs :> AstObject
|Text text -> text :> AstObject
)
Some(PointDef(defo, objs))
| _ -> None
end
type SliceChildType = |Text of TextItem |Define of PointDef
/// ///
type SliceDef(bind: XmlElement, objs: AstObject list) = type FragmentSlice(bind: XmlElement, objs: AstObject list) =
class class
inherit AstObject() inherit AstObject()
new(bind: XmlElement) = SliceDef(bind, []) new(bind: XmlElement) = FragmentSlice(bind, [])
member this.name() = member this.name() =
bind.GetAttribute "name" bind.GetAttribute "name"
member this.appendChild(o: SliceChildType) = member this.appendChild(o: SliceChildType) =
match o with match o with
| Text t -> SliceDef(bind, objs@[t]) | Text t -> FragmentSlice(bind, objs@[t])
| Define d -> SliceDef(bind, objs@[d]) | Ref d -> FragmentSlice(bind, objs@[d])
member this.children() = objs member this.children() = objs
override this.members(): AstObject list = objs override this.members(): AstObject list = objs
override this.address (): string =
bind.GetAttribute "address"
static member GenerateFromChildSibling(child: XmlNode): SliceChildType list = static member GenerateFromChildSibling(child: XmlNode): SliceChildType list =
match child with match child with
@ -153,27 +110,27 @@ open System.Linq
| _ -> | _ ->
let h = match child.Name with let h = match child.Name with
| "text-section" -> Some(Text(TextItem.GenerateText(child).Value)) | "text-section" -> Some(Text(TextItem.GenerateText(child).Value))
| "point" -> Some(Define(PointDef.GeneratePointDef(child).Value)) | "refer" -> Some(Ref(FragmentRef.GeneratePointRef(child).Value))
| _ -> None | _ -> None
match h with match h with
| Some value -> value::SliceDef.GenerateFromChildSibling(child.NextSibling) | Some value -> value::FragmentSlice.GenerateFromChildSibling(child.NextSibling)
| _ -> SliceDef.GenerateFromChildSibling(child.NextSibling) | _ -> FragmentSlice.GenerateFromChildSibling(child.NextSibling)
static member GenerateSliceDef(slice_opt: XmlNode): Option<SliceDef> = static member GenerateSliceDef(slice_opt: XmlNode): Option<FragmentSlice> =
match slice_opt with match slice_opt with
| :? XmlElement as slice when slice.Name.Equals "slice" -> | :? XmlElement as slice when slice.Name.Equals "slice" ->
let mbrs = SliceDef.GenerateFromChildSibling(slice.FirstChild) let mbrs = FragmentSlice.GenerateFromChildSibling(slice.FirstChild)
let objs = mbrs |> List.map ( let objs = mbrs |> List.map (
fun o-> match o with fun o-> match o with
|Define defs -> defs :> AstObject |Ref defs -> defs :> AstObject
|Text text -> text :> AstObject |Text text -> text :> AstObject
) )
Some(SliceDef(slice, objs)) Some(FragmentSlice(slice, objs))
| _ -> None | _ -> None
end end
type StoryChildType = |Text of TextItem |Slice of SliceDef type StoryChildType = |Text of TextItem |Slice of FragmentSlice
/// ///
type StoryDef(bind: XmlElement, objs: AstObject list) = type StoryDef(bind: XmlElement, objs: AstObject list) =
class class
@ -191,6 +148,8 @@ open System.Linq
member this.children() = objs member this.children() = objs
override this.members(): AstObject list = objs override this.members(): AstObject list = objs
override this.address (): string =
bind.GetAttribute "address"
static member GenerateFromChildSibling(child: XmlNode): StoryChildType list = static member GenerateFromChildSibling(child: XmlNode): StoryChildType list =
match child with match child with
@ -198,7 +157,7 @@ open System.Linq
| _ -> | _ ->
let h = match child.Name with let h = match child.Name with
| "text-section" -> Some(Text(TextItem.GenerateText(child).Value)) | "text-section" -> Some(Text(TextItem.GenerateText(child).Value))
| "slice" -> Some(Slice(SliceDef.GenerateSliceDef(child).Value)) | "slice" -> Some(Slice(FragmentSlice.GenerateSliceDef(child).Value))
| _->None | _->None
match h with match h with
| Some value -> value::StoryDef.GenerateFromChildSibling(child.NextSibling) | Some value -> value::StoryDef.GenerateFromChildSibling(child.NextSibling)
@ -218,7 +177,7 @@ open System.Linq
| _ -> None | _ -> None
end end
type ArticleChildType = |Text of TextItem |Refer of PointRef type ArticleChildType = |Text of TextItem |Refer of FragmentRef
/// ///
type ArticleDef(bind: XmlElement, objs: AstObject list) = type ArticleDef(bind: XmlElement, objs: AstObject list) =
class class
@ -237,6 +196,8 @@ open System.Linq
ArticleDef(bind, objs@items) ArticleDef(bind, objs@items)
override this.members(): AstObject list = objs override this.members(): AstObject list = objs
override this.address (): string =
bind.GetAttribute "address"
static member GenerateFromChildSibling(child: XmlNode): ArticleChildType list = static member GenerateFromChildSibling(child: XmlNode): ArticleChildType list =
match child with match child with
@ -244,7 +205,7 @@ open System.Linq
| _ -> | _ ->
let data = match child.Name with let data = match child.Name with
| "text-section" -> Some(Text(TextItem.GenerateText(child).Value)) | "text-section" -> Some(Text(TextItem.GenerateText(child).Value))
| "refer" -> Some(Refer(PointRef.GeneratePointRef(child).Value)) | "refer" -> Some(Refer(FragmentRef.GeneratePointRef(child).Value))
| _ -> None | _ -> None
match data with match data with
| Some value -> value::ArticleDef.GenerateFromChildSibling(child.NextSibling) | Some value -> value::ArticleDef.GenerateFromChildSibling(child.NextSibling)
@ -281,6 +242,8 @@ open System.Linq
VolumeDef(bind, objs@items) VolumeDef(bind, objs@items)
override this.members(): AstObject list = objs override this.members(): AstObject list = objs
override this.address (): string =
bind.GetAttribute "address"
static member GenerateFromChildSibling(child: XmlNode): VolumeChildType list = static member GenerateFromChildSibling(child: XmlNode): VolumeChildType list =
match child with match child with

File diff suppressed because it is too large Load Diff

View File

@ -39,18 +39,18 @@ entry.visitWith(visitor) |> ignore
let volume_pages = volume_page_assemble(visitor.contents()) |> List.map<VolumePage, IDomUnit> (fun x->x) let volume_pages = volume_page_assemble(visitor.contents()) |> List.map<VolumePage, IDomUnit> (fun x->x)
let story_pages = story_page_assemble(visitor.contents()) |> List.map<StoryPage, IDomUnit> (fun x->x) let story_pages = story_page_assemble(visitor.contents()) |> List.map<StoryPage, IDomUnit> (fun x->x)
let point_pages = point_page_assemble(volume_pages @ story_pages) let point_pages = slice_page_assemble(volume_pages @ story_pages)
volume_pages @ story_pages @ point_pages |> List.iter (fun it -> (it:?>PageAccess).setPageRoot(out_dir)) volume_pages @ story_pages @ point_pages |> List.iter (fun it -> (it:?>PageAccess).setPageRoot(out_dir))
let makers = volume_pages @ story_pages @ point_pages let makers = volume_pages @ story_pages @ point_pages
|> List.map(fun page_unit -> |> List.map(fun page_unit ->
match page_unit with match page_unit with
| :? PointPage as point -> | :? SlicePage as point ->
PageMaker<PointPage>(point) :> PageText PageMaker(point) :> PageText
| :? VolumePage as vol -> | :? VolumePage as vol ->
PageMaker<VolumePage>(vol) PageMaker(vol)
| :? StoryPage as story -> | :? StoryPage as story ->
PageMaker<StoryPage>(story) PageMaker(story)
| _ -> failwith "" | _ -> failwith ""
) )
@ -63,17 +63,17 @@ for refs in makers do
let file_path = (refs.bindPage() :?> PageAccess).pageURL() let file_path = (refs.bindPage() :?> PageAccess).pageURL()
File.WriteAllLines(file_path, [refs.getHtmlText()]) File.WriteAllLines(file_path, [refs.getHtmlText()])
let graph = StorylineGraphMake("故事线网络", story_pages|> List.map(fun x -> x :?> PageAccess)) //let graph = StorylineGraphMake("故事线网络", story_pages|> List.map(fun x -> x :?> PageAccess))
let graph_code = graph.getGraphCode() //let graph_code = graph.getGraphCode()
let stream = new StreamWriter(Path.Combine(dir_o.FullName, "storys_display.dot"), false) //let stream = new StreamWriter(Path.Combine(dir_o.FullName, "storys_display.dot"), false)
stream.Write(graph_code) //stream.Write(graph_code)
stream.Flush() //stream.Flush()
Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "storys_display.svg")} {Path.Combine(dir_o.FullName, "storys_display.dot")}""") |> ignore //Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "storys_display.svg")} {Path.Combine(dir_o.FullName, "storys_display.dot")}""") |> ignore
let graph2 = VolumeGraphMake("卷章引用网络", (volume_pages@story_pages)|> List.map(fun d -> d :?> PageAccess)) //let graph2 = VolumeGraphMake("卷章引用网络", (volume_pages@story_pages)|> List.map(fun d -> d :?> PageAccess))
let graph2_code = graph2.getGraphCode() //let graph2_code = graph2.getGraphCode()
let stream2 = new StreamWriter(Path.Combine(dir_o.FullName, "volume_display.dot"), false) //let stream2 = new StreamWriter(Path.Combine(dir_o.FullName, "volume_display.dot"), false)
stream2.Write(graph2_code) //stream2.Write(graph2_code)
stream2.Flush() //stream2.Flush()
Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "volume_display.svg")} {Path.Combine(dir_o.FullName, "volume_display.dot")}""") |> ignore //Process.Start("dot", $"""-Tsvg -o{Path.Combine(dir_o.FullName, "volume_display.svg")} {Path.Combine(dir_o.FullName, "volume_display.dot")}""") |> ignore

View File

@ -16,81 +16,51 @@
{故事 故事名称5 {故事 故事名称5
故事介绍段落 aldkfjl flwief 故事介绍段落 aldkfjl flwief
{情名称} {情名称}
} }
{故事 故事名称6 {故事 故事名称6
故事介绍段落 aldkfjl flwief 故事介绍段落 aldkfjl flwief
{情名称 情介绍} {情名称 情介绍}
} }
{故事 故事名称7 {故事 故事名称7
故事介绍段落 aldkfjl flwief 故事介绍段落 aldkfjl flwief
{剧情 剧情名称 {情节 情节名称
剧情介绍 情节介绍
{@情节 故事名称6&情节名称}
} }
} }
{故事 故事名称8 {故事 故事名称8
故事介绍段落 aldkfjl flwief 故事介绍段落 aldkfjl flwief
{情名称 {情名称
情介绍 介绍
{节名称} {@情故事名称6&情节名称 引用简介}
} }
} }
{故事 故事名称9 {故事 故事名称9
故事介绍段落 aldkfjl flwief 故事介绍段落 aldkfjl flwief
{剧情 剧情名称 {情节 情节名称
剧情介绍 情节介绍
{节点 节点名称 {@情节 故事名称6&情节名称
奥龙订饭;爱领克 非两爱看扥} 引用简介
}
} }
} }
{故事 故事名称10 {故事 故事名称10
故事介绍段落 aldkfjl flwief 故事介绍段落 aldkfjl flwief
{剧情 剧情名称 {情节 情节名称
剧情介绍 情节介绍
{节点 节点名称 {@情节 故事名称6&情节名称
奥龙订饭;爱领克 非两爱看扥 引用简介
} }
}
} {@情节 故事名称8&情节名称
引用简介
{故事 故事名称11 }
故事介绍段落 aldkfjl flwief
{剧情 剧情名称
剧情介绍
{节点 节点名称
奥龙订饭;爱领克 非两爱看扥
{@节点 故事名称10&剧情名称&节点名称}
}
}
}
{故事 故事名称4
故事介绍段落 aldkfjl flwief
{剧情 剧情名称
剧情介绍
{节点 节点名称
奥龙订饭;爱领克 非两爱看扥
{@节点 故事名称10&剧情名称&节点名称
asldkfj 来看房莱肯}
}
}
}
{故事 故事名称4
故事介绍段落 aldkfjl flwief
{剧情 剧情名称
剧情介绍
{节点 节点名称
奥龙订饭;爱领克 非两爱看扥
{@节点 故事名称10&剧情名称&节点名称
asldkfj 来看房莱肯
}
}
} }
} }
@ -116,14 +86,14 @@
{分卷 卷宗名称 {分卷 卷宗名称
拉开茯苓领赛季发啦肯 lakdjf;alfj 拉开茯苓领赛季发啦肯 lakdjf;alfj
{章节 章节名称 昂来看申领发 {章节 章节名称 昂来看申领发
{@节点 故事名称10&剧情名称&节点名称} {@情节 故事名称7&情节名称}
} }
} }
{分卷 卷宗名称 {分卷 卷宗名称
拉开茯苓领赛季发啦肯 lakdjf;alfj 拉开茯苓领赛季发啦肯 lakdjf;alfj
{章节 章节名称 昂来看申领发 {章节 章节名称 昂来看申领发
{@节点 故事名称10&剧情名称&节点名称 {@情节 故事名称7&情节名称
森铃但凡拉动垦局} 森铃但凡拉动垦局}
} }
} }

View File

@ -55,7 +55,7 @@ bool printer::AstGenerate::visit(std::shared_ptr<const ast_gen::ElementAccess> s
{ {
decltype(this->element_stack) temp_stack; decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(), std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep){ return ep.first < depth; }); std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack; this->element_stack = temp_stack;
auto current_ast = element_stack.last(); auto current_ast = element_stack.last();
@ -87,25 +87,6 @@ bool printer::AstGenerate::visit(std::shared_ptr<const ast_gen::ElementAccess> s
dom_slice.setAttribute("name", slice_node->name()); dom_slice.setAttribute("name", slice_node->name());
dom_slice.setAttribute("address", (qulonglong) slice_node.get()); dom_slice.setAttribute("address", (qulonglong) slice_node.get());
}break; }break;
case NovelNode::PointDefines:
{
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
auto current_slice = element_stack.last();
auto point_node = std::dynamic_pointer_cast<const example_novel::PointDefines>(syntax_element->element());
auto dom_point = doc.createElement("point");
current_slice.second.appendChild(dom_point);
element_stack.append(std::make_pair(depth, dom_point));
dom_point.setAttribute("name", point_node->name());
dom_point.setAttribute("address", (qulonglong) point_node.get());
dom_point.setAttribute("file-path", src_root.relativeFilePath(point_node->filePath()));
append_tokens(dom_point, point_node);
}break;
case NovelNode::TextSection: case NovelNode::TextSection:
{ {
decltype(this->element_stack) temp_stack; decltype(this->element_stack) temp_stack;
@ -123,7 +104,7 @@ bool printer::AstGenerate::visit(std::shared_ptr<const ast_gen::ElementAccess> s
append_tokens(dom_text, text_node); append_tokens(dom_text, text_node);
}break; }break;
case NovelNode::PointRefers: case NovelNode::FragmentRefers:
{ {
decltype(this->element_stack) temp_stack; decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(), std::copy_if(element_stack.begin(), element_stack.end(),
@ -131,14 +112,13 @@ bool printer::AstGenerate::visit(std::shared_ptr<const ast_gen::ElementAccess> s
this->element_stack = temp_stack; this->element_stack = temp_stack;
auto current_pnode = element_stack.last(); auto current_pnode = element_stack.last();
auto refer_node = std::dynamic_pointer_cast<const example_novel::PointRefers>(syntax_element->element()); auto refer_node = std::dynamic_pointer_cast<const example_novel::FragmentRefers>(syntax_element->element());
auto dom_refer = doc.createElement("refer"); auto dom_refer = doc.createElement("refer");
current_pnode.second.appendChild(dom_refer); current_pnode.second.appendChild(dom_refer);
element_stack.append(std::make_pair(depth, dom_refer)); element_stack.append(std::make_pair(depth, dom_refer));
dom_refer.setAttribute("story", refer_node->storyRefer()); dom_refer.setAttribute("story", refer_node->storyRefer());
dom_refer.setAttribute("slice", refer_node->sliceRefer()); dom_refer.setAttribute("slice", refer_node->sliceRefer());
dom_refer.setAttribute("point", refer_node->pointRefer());
dom_refer.setAttribute("file-path", src_root.relativeFilePath(refer_node->filePath())); dom_refer.setAttribute("file-path", src_root.relativeFilePath(refer_node->filePath()));
append_tokens(dom_refer, refer_node); append_tokens(dom_refer, refer_node);

View File

@ -51,7 +51,7 @@ int main(int argc, char* argv[]) {
auto source_dir = QDir(src_dir->value().toString()); auto source_dir = QDir(src_dir->value().toString());
if (!source_dir.exists()) { if (!source_dir.exists()) {
cout << "%编译指定的源代码目录不存在!" << endl; qDebug() << "%编译指定的源代码目录不存在!" << source_dir.absolutePath() << endl;
exit(0); exit(0);
} }
auto destination_dir = QDir::current(); auto destination_dir = QDir::current();
@ -60,7 +60,7 @@ int main(int argc, char* argv[]) {
destination_dir = QDir(target_output.toString()); destination_dir = QDir(target_output.toString());
} }
else { else {
cout << "%编译指定的生成目录不存在,重置为:" << destination_dir.absolutePath().toLocal8Bit().data() << endl; qDebug() << "%编译指定的生成目录不存在,重置为:" << destination_dir.absolutePath().toLocal8Bit().data() << endl;
} }
auto files = source_dir.entryInfoList(QStringList() << "*.story"); auto files = source_dir.entryInfoList(QStringList() << "*.story");

View File

@ -19,7 +19,7 @@ void ElementsCache::clearCache() {
std::shared_ptr<const SyntaxElement> ElementsCache::appendToCache(std::shared_ptr<const SyntaxElement> named_node) { std::shared_ptr<const SyntaxElement> ElementsCache::appendToCache(std::shared_ptr<const SyntaxElement> named_node) {
auto mixed_key = QString("%1<%2>").arg(named_node->signature()).arg(named_node->typeMark()); auto mixed_key = QString("%1<%2>").arg(named_node->signature()).arg(named_node->typeMark());
if (node_cache.contains(mixed_key)) if (node_cache.contains(mixed_key))
return node_cache[mixed_key]; throw new CheckException(QString("节点命名重复:%1").arg(mixed_key));
node_cache[mixed_key] = named_node; node_cache[mixed_key] = named_node;
return nullptr; return nullptr;
} }
@ -40,12 +40,12 @@ void example_novel::FragmentExistsCheck::nodes_regist(std::shared_ptr<ElementsCa
} }
void FragmentExistsCheck::exists_check(std::shared_ptr<ElementsCache> root, std::shared_ptr<const ElementAccess> target) const { void FragmentExistsCheck::exists_check(std::shared_ptr<ElementsCache> root, std::shared_ptr<const ElementAccess> target) const {
if (target->element()->typeMark() == (int) NovelNode::PointRefers) { if (target->element()->typeMark() == (int) NovelNode::FragmentRefers) {
auto refer = std::dynamic_pointer_cast<const PointRefers>(target->element()); auto refer = std::dynamic_pointer_cast<const FragmentRefers>(target->element());
auto signature = refer->storyRefer() + "&" + refer->sliceRefer() + "&" + refer->pointRefer(); auto signature = refer->storyRefer() + "&" + refer->sliceRefer();
if (!root->getNamedNodeBy((int) NovelNode::PointDefines, signature)) if (!root->getNamedNodeBy((int) NovelNode::FragmentSlice, signature))
throw new SyntaxException(QString("CheckError[0x0005]系统中不包含指定签名的节点:%1<type%2>{%3:(%4)}") throw new SyntaxException(QString("CheckError[0x0005]系统中不包含指定签名的节点:%1<type%2>{%3:(%4)}")
.arg(signature).arg((int) NovelNode::PointDefines).arg(refer->signature()).arg(refer->filePath())); .arg(signature).arg((int) NovelNode::FragmentRefers).arg(refer->signature()).arg(refer->filePath()));
} }
for (auto& xit : target->children()) { for (auto& xit : target->children()) {
@ -152,7 +152,7 @@ void PointGraphCheck::validCheck(std::shared_ptr<const ElementAccess> root) cons
auto story_children = story->children(); auto story_children = story->children();
for (auto ins : story_children) { for (auto ins : story_children) {
switch (ins->element()->typeMark()) { switch (ins->element()->typeMark()) {
case (int) NovelNode::PointDefines: case (int) NovelNode::FragmentSlice:
return_temp << ins; return_temp << ins;
break; break;
default: default:
@ -171,7 +171,7 @@ void PointGraphCheck::validCheck(std::shared_ptr<const ElementAccess> root) cons
auto x_children = defs->children(); auto x_children = defs->children();
for (auto ins : x_children) { for (auto ins : x_children) {
switch (ins->element()->typeMark()) { switch (ins->element()->typeMark()) {
case (int) NovelNode::PointRefers: case (int) NovelNode::FragmentRefers:
return_temp << ins; return_temp << ins;
break; break;
default: default:
@ -191,7 +191,7 @@ void PointGraphCheck::validCheck(std::shared_ptr<const ElementAccess> root) cons
// 构建情节节点列表 // 构建情节节点列表
for (auto point_primitive : point_items) { for (auto point_primitive : point_items) {
auto target_node = std::dynamic_pointer_cast<const PointDefines>(point_primitive->element()); auto target_node = std::dynamic_pointer_cast<const FragmentSlice>(point_primitive->element());
auto finst = std::make_shared<PointGraphHelper>(target_node); auto finst = std::make_shared<PointGraphHelper>(target_node);
self->setElement(finst); self->setElement(finst);
} }
@ -200,12 +200,12 @@ void PointGraphCheck::validCheck(std::shared_ptr<const ElementAccess> root) cons
// 获取绑定节点名称 // 获取绑定节点名称
auto get_name = [](std::shared_ptr<const ElementAccess> node)->QString { auto get_name = [](std::shared_ptr<const ElementAccess> node)->QString {
switch (node->element()->typeMark()) { switch (node->element()->typeMark()) {
case (int) NovelNode::PointDefines: { case (int) NovelNode::FragmentSlice: {
auto def_node = std::dynamic_pointer_cast<const PointDefines>(node->element()); auto def_node = std::dynamic_pointer_cast<const FragmentSlice>(node->element());
return def_node->signature(); return def_node->signature();
}break; }break;
case (int) NovelNode::PointRefers: { case (int) NovelNode::FragmentRefers: {
auto ref_node = std::dynamic_pointer_cast<const PointRefers>(node->element()); auto ref_node = std::dynamic_pointer_cast<const FragmentRefers>(node->element());
return ref_node->referSignature(); return ref_node->referSignature();
}break; }break;
} }
@ -275,9 +275,9 @@ QString PointGraphCheck::name() const {
return "情节网络有效性检查器"; return "情节网络有效性检查器";
} }
PointGraphHelper::PointGraphHelper(std::shared_ptr<const PointDefines> node) : node_peer(node) { } PointGraphHelper::PointGraphHelper(std::shared_ptr<const FragmentSlice> node) : node_peer(node) { }
std::shared_ptr<const PointDefines> PointGraphHelper::nodePeer() const { std::shared_ptr<const FragmentSlice> PointGraphHelper::nodePeer() const {
return this->node_peer; return this->node_peer;
} }

View File

@ -74,14 +74,14 @@ namespace example_novel {
class PointGraphHelper : public std::enable_shared_from_this<PointGraphHelper> { class PointGraphHelper : public std::enable_shared_from_this<PointGraphHelper> {
private: private:
std::shared_ptr<const example_novel::PointDefines> node_peer; std::shared_ptr<const example_novel::FragmentSlice> node_peer;
QList<std::shared_ptr<PointGraphHelper>> next_nodes; QList<std::shared_ptr<PointGraphHelper>> next_nodes;
uint indegree = 0; uint indegree = 0;
public: public:
PointGraphHelper(std::shared_ptr<const example_novel::PointDefines> node); PointGraphHelper(std::shared_ptr<const example_novel::FragmentSlice> node);
std::shared_ptr<const example_novel::PointDefines> nodePeer() const; std::shared_ptr<const example_novel::FragmentSlice> nodePeer() const;
void appendNext(std::shared_ptr<PointGraphHelper> node); void appendNext(std::shared_ptr<PointGraphHelper> node);
QList<std::shared_ptr<PointGraphHelper>> nextList() const; QList<std::shared_ptr<PointGraphHelper>> nextList() const;

View File

@ -22,59 +22,34 @@ QString TextSection::signature() const {
return parent().lock()->signature() + "&::section"; return parent().lock()->signature() + "&::section";
} }
PointRefers::PointRefers(std::shared_ptr<const ExprRule> rule_bind) FragmentRefers::FragmentRefers(std::shared_ptr<const ExprRule> rule_bind)
: AbstractImpl(rule_bind) { } : AbstractImpl(rule_bind) { }
QString PointRefers::storyRefer() const { QString FragmentRefers::storyRefer() const {
return story_refs; return story_refs;
} }
void PointRefers::setStoryRefer(const QString& refer) { void FragmentRefers::setStoryRefer(const QString& refer) {
this->story_refs = refer; this->story_refs = refer;
} }
QString PointRefers::sliceRefer() const { QString FragmentRefers::sliceRefer() const {
return slice_ref; return slice_ref;
} }
void PointRefers::setSliceRefer(const QString& refer) { void FragmentRefers::setSliceRefer(const QString& refer) {
slice_ref = refer; slice_ref = refer;
} }
QString PointRefers::pointRefer() const { QString FragmentRefers::referSignature() const {
return point_ref; return storyRefer() + "&" + sliceRefer();
} }
void PointRefers::setPointRefer(const QString& refer) { QString FragmentRefers::signature() const {
this->point_ref = refer;
}
QString PointRefers::referSignature() const {
return storyRefer() + "&" + sliceRefer() + "&" + pointRefer();
}
QString PointRefers::signature() const {
QString signature = "@" + referSignature(); QString signature = "@" + referSignature();
return parent().lock()->signature() + "&" + signature; return parent().lock()->signature() + "&" + signature;
} }
PointDefines::PointDefines(std::shared_ptr<const ExprRule> rule_bind)
: AbstractImpl(rule_bind) { }
QString PointDefines::name() const {
return name_store;
}
void PointDefines::setName(const QString& nm) {
this->name_store = nm;
}
QString PointDefines::signature() const {
return parent().lock()->signature() + "&" + name();
}
StoryDefine::StoryDefine(std::shared_ptr<const ExprRule> rule_bind) StoryDefine::StoryDefine(std::shared_ptr<const ExprRule> rule_bind)
: AbstractImpl(rule_bind), sort_index(0) { } : AbstractImpl(rule_bind), sort_index(0) { }

View File

@ -105,14 +105,13 @@ namespace example_novel {
enum class NovelNode { enum class NovelNode {
GlobalElement = 0, GlobalElement = 0,
TextSection = 1, TextSection = 1,
PointRefers = 2, FragmentRefers = 2,
PointDefines = 3, FragmentSlice = 3,
StoryDefine = 4, StoryDefine = 4,
Document = 5, Document = 5,
ArticleDefine = 6, ArticleDefine = 6,
VolumeDefine = 7, VolumeDefine = 7,
RankDeclaration = 8, RankDeclaration = 8,
FragmentSlice = 9,
}; };
/* /*
@ -123,15 +122,13 @@ namespace example_novel {
| |-TextSection | |-TextSection
| \-FragmentSlice | \-FragmentSlice
| |-TextSection | |-TextSection
| |-PointDefines | \-FragmentRefers
| | \-TextSection
| \-PointRefers
| \-TextSection | \-TextSection
\-VolumeDefine \-VolumeDefine
|-TextSection |-TextSection
\-ArticleDefine \-ArticleDefine
|-TextSection |-TextSection
\-PointRefers \-FragmentRefers
\-TextSection \-TextSection
*/ */
@ -189,7 +186,7 @@ namespace example_novel {
}; };
/** /**
* @brief * @brief
*/ */
class LIBSYNTAX_EXPORT FragmentSlice : public AbstractImpl<NovelNode::FragmentSlice, true> { class LIBSYNTAX_EXPORT FragmentSlice : public AbstractImpl<NovelNode::FragmentSlice, true> {
private: private:
@ -206,14 +203,14 @@ namespace example_novel {
}; };
/** /**
* @brief * @brief
*/ */
class LIBSYNTAX_EXPORT PointRefers : public AbstractImpl<NovelNode::PointRefers, false> { class LIBSYNTAX_EXPORT FragmentRefers : public AbstractImpl<NovelNode::FragmentRefers, false> {
private: private:
QString story_refs, slice_ref, point_ref; QString story_refs, slice_ref;
public: public:
PointRefers(std::shared_ptr<const lib_syntax::ExprRule> rule_bind); FragmentRefers(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString storyRefer() const; QString storyRefer() const;
void setStoryRefer(const QString& refer); void setStoryRefer(const QString& refer);
@ -221,31 +218,12 @@ namespace example_novel {
QString sliceRefer() const; QString sliceRefer() const;
void setSliceRefer(const QString& refer); void setSliceRefer(const QString& refer);
QString pointRefer() const;
void setPointRefer(const QString& refer);
QString referSignature() const; QString referSignature() const;
// 通过 AbstractImpl 继承 // 通过 AbstractImpl 继承
virtual QString signature() const override; virtual QString signature() const override;
}; };
/**
* @brief
*/
class LIBSYNTAX_EXPORT PointDefines : public AbstractImpl<NovelNode::PointDefines, true> {
private:
QString name_store;
public:
PointDefines(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
void setName(const QString& nm);
// 通过 AbstractImpl 继承
virtual QString signature() const override;
};
/** /**
* @brief * @brief

View File

@ -12,22 +12,14 @@ using namespace std;
#include "syntax_templets.h" #include "syntax_templets.h"
using namespace lib_composit; using namespace lib_composit;
void point_nm_set(std::shared_ptr<PointDefines> inst, std::shared_ptr<const lib_token::IToken> token) { void ref_story_set(std::shared_ptr<FragmentRefers> inst, std::shared_ptr<const lib_token::IToken> token) {
inst->addToken(token);
inst->setName(token->content());
}
void ref_story_set(std::shared_ptr<PointRefers> inst, std::shared_ptr<const lib_token::IToken> token) {
inst->addToken(token); inst->addToken(token);
inst->setStoryRefer(token->content()); inst->setStoryRefer(token->content());
} }
void ref_slice_set(std::shared_ptr<PointRefers> inst, std::shared_ptr<const lib_token::IToken> token) { void ref_slice_set(std::shared_ptr<FragmentRefers> inst, std::shared_ptr<const lib_token::IToken> token) {
inst->addToken(token); inst->addToken(token);
inst->setSliceRefer(token->content()); inst->setSliceRefer(token->content());
} }
void ref_point_set(std::shared_ptr<PointRefers> inst, std::shared_ptr<const lib_token::IToken> token) {
inst->addToken(token);
inst->setPointRefer(token->content());
}
void slice_nm_set(std::shared_ptr<FragmentSlice> inst, std::shared_ptr<const lib_token::IToken> token) { void slice_nm_set(std::shared_ptr<FragmentSlice> inst, std::shared_ptr<const lib_token::IToken> token) {
inst->addToken(token); inst->addToken(token);
inst->setName(token->content()); inst->setName(token->content());
@ -136,12 +128,12 @@ public:
}; };
using ReferSyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<ReferMk>, Match<PointWord>, Action<PointRefers, NameText, ref_story_set>, Match<SplitMk>, Action<PointRefers, NameText, ref_slice_set>, Match<SplitMk>, Action<PointRefers, NameText, ref_point_set>, using ReferSyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<ReferMk>, Match<SliceWord>, Action<FragmentRefers, NameText, ref_story_set>, Match<SplitMk>, Action<FragmentRefers, NameText, ref_slice_set>,
OptMulti<DeclSyntax>, OptMulti<DeclSyntax>,
Match<RBracket>>; Match<RBracket>>;
class ReferSyntax : public ElementRule<PointRefers, (int) NovelNode::PointRefers, ReferSyntaxDef> { class ReferSyntax : public ElementRule<FragmentRefers, (int) NovelNode::FragmentRefers, ReferSyntaxDef> {
public: public:
ReferSyntax() : ElementRule<PointRefers, (int) NovelNode::PointRefers, ReferSyntaxDef>("point_refer") { } ReferSyntax() : ElementRule<FragmentRefers, (int) NovelNode::FragmentRefers, ReferSyntaxDef>("fragment_refer") { }
// 通过 ElementRule 继承 // 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override { QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -150,27 +142,12 @@ public:
}; };
using PointSyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<PointWord>, Action<PointDefines, NameText, point_nm_set>,
OptMulti<Any<ReferSyntax, DeclSyntax>>,
Match<RBracket>>;
class PointSyntax : public ElementRule<PointDefines, (int) NovelNode::PointDefines, PointSyntaxDef> {
public:
PointSyntax() : ElementRule<PointDefines, (int) NovelNode::PointDefines, PointSyntaxDef>("point_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
return _children_store->parse(cursor);
}
};
using SliceSyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<SliceWord>, Action<FragmentSlice, NameText, slice_nm_set>, using SliceSyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<SliceWord>, Action<FragmentSlice, NameText, slice_nm_set>,
lib_composit::OptMulti<Any<PointSyntax, DeclSyntax>>, lib_composit::OptMulti<Any<ReferSyntax, DeclSyntax>>,
Match<RBracket>>; Match<RBracket>>;
class SliceSyntax : public ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice, SliceSyntaxDef> { class SliceSyntax : public ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice, SliceSyntaxDef> {
public: public:
SliceSyntax() : ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice, SliceSyntaxDef>("slice_define") { } SliceSyntax() : ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice, SliceSyntaxDef>("fragment_define") { }
// 通过 ElementRule 继承 // 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override { QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -179,7 +156,6 @@ public:
}; };
using StorySyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<StoryWord>, Action<StoryDefine, NameText, story_nm_set>, using StorySyntaxDef = lib_composit::Seqs<Match<LBracket>, Match<StoryWord>, Action<StoryDefine, NameText, story_nm_set>,
lib_composit::OptMulti<Any<SliceSyntax, DeclSyntax>>, lib_composit::OptMulti<Any<SliceSyntax, DeclSyntax>>,
Match<RBracket>>; Match<RBracket>>;

View File

@ -219,9 +219,7 @@ inline example_novel::RankWord::RankWord() : __keywords("排序", 0xAEu) { }
inline example_novel::StoryWord::StoryWord() : __keywords("故事", 0xAAu) { } inline example_novel::StoryWord::StoryWord() : __keywords("故事", 0xAAu) { }
inline example_novel::SliceWord::SliceWord() : __keywords("剧情", 0xAFu) { } inline example_novel::SliceWord::SliceWord() : __keywords("情节", 0xAFu) { }
inline example_novel::PointWord::PointWord() : __keywords("节点", 0xABu) { }
inline example_novel::VolumeWord::VolumeWord() : __keywords("分卷", 0xACu) { } inline example_novel::VolumeWord::VolumeWord() : __keywords("分卷", 0xACu) { }

View File

@ -66,10 +66,6 @@ namespace example_novel {
public: public:
SliceWord(); SliceWord();
}; };
class LIBSYNTAX_EXPORT PointWord : public __keywords {
public:
PointWord();
};
class LIBSYNTAX_EXPORT VolumeWord : public __keywords { class LIBSYNTAX_EXPORT VolumeWord : public __keywords {
public: public:
VolumeWord(); VolumeWord();