YSTest: NPLA.h 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

NPLA.h
浏览该文件的文档.
1 /*
2 © 2014-2016 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #ifndef NPL_INC_NPLA_h_
29 #define NPL_INC_NPLA_h_ 1
30
31 #include "YModules.h"
32 #include YFM_NPL_SContext // for string, NPLTag, ValueNode, TermNode,
33 // LoggedEvent;
34 #include YFM_YSLib_Core_YEvent // for YSLib::GHEvent, ystdex::fast_any_of,
35 // ystdex::indirect, YSLib::GEvent, YSLib::GCombinerInvoker,
36 // YSLib::GDefaultLastValueInvoker;
37 #include <ystdex/any.h> // for ystdex::any, ystdex::exclude_self_t;
38
39 namespace NPL
40 {
41
43 using YSLib::pair;
45 using YSLib::to_string;
47 using YSLib::MakeIndex;
49 using YSLib::NodeSequence;
51 using YSLib::NodeLiteral;
52
53
59 struct YF_API NPLATag : NPLTag
60 {};
61
62
70 template<class _tNodeOrCon, typename... _tParams>
71 ValueNode::iterator
72 InsertSyntaxNode(_tNodeOrCon&& node_or_con,
73 std::initializer_list<ValueNode> il, _tParams&&... args)
74 {
75 return node_or_con.emplace_hint(node_or_con.end(), ValueNode::Container(il),
76 MakeIndex(node_or_con), yforward(args)...);
77 }
78 template<class _tNodeOrCon, typename _type, typename... _tParams>
79 ValueNode::iterator
80 InsertSyntaxNode(_tNodeOrCon&& node_or_con, _type&& arg, _tParams&&... args)
81 {
82 return node_or_con.emplace_hint(node_or_con.end(), yforward(arg),
83 MakeIndex(node_or_con), yforward(args)...);
84 }
86
87
92 using NodeMapper = std::function<ValueNode(const TermNode&)>;
93
95
96 using NodeToString = std::function<string(const ValueNode&)>;
97
98 template<class _tCon>
99 using GNodeInserter = std::function<void(TermNode&&, _tCon&)>;
100
101 using NodeInserter = GNodeInserter<TermNode::Container&>;
102
103 using NodeSequenceInserter = GNodeInserter<NodeSequence>;
105
106
108
109
116 YF_API ValueNode
117 MapNPLALeafNode(const TermNode&);
118
124 YF_API ValueNode
125 TransformToSyntaxNode(const ValueNode&, const string& = {});
127
134 YF_API string
135 EscapeNodeLiteral(const ValueNode&);
136
144 YF_API string
145 LiteralizeEscapeNodeLiteral(const ValueNode&);
146
153 YF_API string
154 ParseNPLANodeString(const ValueNode&);
155
156
164 template<class _tNodeOrCon>
166 ValueNode::iterator
167 InsertChildSyntaxNode(_tNodeOrCon&& node_or_con, ValueNode& child)
168 {
169 return InsertSyntaxNode(yforward(node_or_con), child.GetContainerRef());
170 }
171 template<class _tNodeOrCon>
172 ValueNode::iterator
173 InsertChildSyntaxNode(_tNodeOrCon&& node_or_con, ValueNode&& child)
174 {
175 return InsertSyntaxNode(yforward(node_or_con),
176 std::move(child.GetContainerRef()));
177 }
178 template<class _tNodeOrCon>
179 ValueNode::iterator
180 InsertChildSyntaxNode(_tNodeOrCon&& node_or_con, const NodeLiteral& nl)
181 {
182 return
183 InsertChildSyntaxNode(yforward(node_or_con), TransformToSyntaxNode(nl));
184 }
186
187
189 using IndentGenerator = std::function<string(size_t)>;
190
192 YF_API string
193 DefaultGenerateIndent(size_t);
194
199 YF_API void
200 PrintIndent(std::ostream&, IndentGenerator = DefaultGenerateIndent, size_t = 1);
201
214 YF_API void
215 PrintNode(std::ostream&, const ValueNode&, NodeToString = EscapeNodeLiteral,
216 IndentGenerator = DefaultGenerateIndent, size_t = 0);
217
228 YF_API void
229 PrintNodeChild(std::ostream&, const ValueNode&, NodeToString
230 = EscapeNodeLiteral, IndentGenerator = DefaultGenerateIndent, size_t = 0);
231
241 YF_API bool
242 PrintNodeString(std::ostream&, const ValueNode&,
243 NodeToString = EscapeNodeLiteral);
244
245
246 namespace SXML
247 {
248
250
251
256 YF_API string
257 ConvertAttributeNodeString(const TermNode&);
258
271 YF_API string
272 ConvertDocumentNode(const TermNode&, IndentGenerator = DefaultGenerateIndent,
273 size_t = 0, ParseOption = ParseOption::Normal);
274
279 YF_API string
280 ConvertStringNode(const TermNode&);
281
290 YF_API void
291 PrintSyntaxNode(std::ostream& os, const TermNode&,
292 IndentGenerator = DefaultGenerateIndent, size_t = 0);
294
295
297
298
300 template<typename... _tParams>
301 ValueNode
302 MakeTop(const string& name, _tParams&&... args)
303 {
304 return YSLib::AsNodeLiteral(name,
305 {{MakeIndex(0), "*TOP*"}, NodeLiteral(yforward(args))...});
306 }
307 inline PDefH(ValueNode, MakeTop, )
308 ImplRet(MakeTop({}))
310
317 YF_API ValueNode
318 MakeXMLDecl(const string& = {}, const string& = "1.0",
319 const string& = "UTF-8", const string& = {});
320
326 YF_API ValueNode
327 MakeXMLDoc(const string& = {}, const string& = "1.0",
328 const string& = "UTF-8", const string& = {});
329
331
332 inline PDefH(NodeLiteral, MakeAttributeTagLiteral,
333 std::initializer_list<NodeLiteral> il)
334 ImplRet({"@", il})
335 template<typename... _tParams>
336 NodeLiteral
337 MakeAttributeTagLiteral(_tParams&&... args)
338 {
339 return SXML::MakeAttributeTagLiteral({NodeLiteral(yforward(args)...)});
340 }
342
344
345 inline PDefH(NodeLiteral, MakeAttributeLiteral, const string& name,
346 std::initializer_list<NodeLiteral> il)
347 ImplRet({name, {MakeAttributeTagLiteral(il)}})
348 template<typename... _tParams>
349 NodeLiteral
350 MakeAttributeLiteral(const string& name, _tParams&&... args)
351 {
352 return {name, {SXML::MakeAttributeTagLiteral(yforward(args)...)}};
353 }
355
357
358 template<class _tNodeOrCon>
359 inline void
360 InsertAttributeNode(_tNodeOrCon&& node_or_con, const string& name,
361 std::initializer_list<NodeLiteral> il)
362 {
363 InsertChildSyntaxNode(node_or_con, MakeAttributeLiteral(name, il));
364 }
365 template<class _tNodeOrCon, typename... _tParams>
366 inline void
367 InsertAttributeNode(_tNodeOrCon&& node_or_con, const string& name,
368 _tParams&&... args)
369 {
370 InsertChildSyntaxNode(node_or_con,
371 SXML::MakeAttributeLiteral(name, yforward(args)...));
372 }
374
375
376 } // namespace SXML;
378
379
381
382
384 class YF_API NPLException : public LoggedEvent
386 {
387 public:
388 YB_NONNULL(2)
389 NPLException(const char* str = "", YSLib::RecordLevel lv = YSLib::Err)
390 : LoggedEvent(str, lv)
391 {}
392 NPLException(const YSLib::string_view sv,
393 YSLib::RecordLevel lv = YSLib::Err)
394 : LoggedEvent(sv, lv)
395 {}
396 DefDeCtor(NPLException)
397
398
399 ~NPLException() override;
400 };
401
402
408 class YF_API ListReductionFailure : public NPLException
409 {
410 public:
412 using NPLException::NPLException;
413 DefDeCtor(ListReductionFailure)
414
415
416 ~ListReductionFailure() override;
417 };
418
419
421 class YF_API InvalidSyntax : public NPLException
422 {
423 public:
424 using NPLException::NPLException;
425 DefDeCtor(InvalidSyntax)
426
427
428 ~InvalidSyntax() override;
429 };
430
431
433 class YF_API UndeclaredIdentifier : public NPLException
434 {
435 public:
436 using NPLException::NPLException;
437 DefDeCtor(UndeclaredIdentifier)
438
439
440 ~UndeclaredIdentifier() override;
441 };
442
443
445 class YF_API ArityMismatch : public NPLException
446 {
447 private:
448 size_t expected;
449 size_t received;
450
451 public:
453 ArityMismatch(size_t, size_t);
454 DefDeCtor(ArityMismatch)
455
456
457 ~ArityMismatch() override;
458
459 DefGetter(const ynothrow, size_t, Expected, expected)
460 DefGetter(const ynothrow, size_t, Received, received)
461 };
463
468 YB_NORETURN YF_API void
469 ThrowArityMismatch(size_t, size_t);
471
472
474
475 using ContextNode = ValueNode;
477
479 using YSLib::AccessChildPtr;
480
482 using ContextHandler = YSLib::GHEvent<void(TermNode&, ContextNode&)>;
484 using LiteralHandler = YSLib::GHEvent<bool(const ContextNode&)>;
485
487 inline PDefH(void, RegisterContextHandler, ContextNode& node,
488 const string& name, ContextHandler f)
489 ImplExpr(node[name].Value = std::move(f))
490
492 inline PDefH(void, RegisterLiteralHandler, ContextNode& node,
493 const string& name, LiteralHandler f)
494 ImplExpr(node[name].Value = std::move(f))
496
497
499
500 YF_API ValueObject
502 FetchValue(const ContextNode&, const string&);
503
505 YF_API observer_ptr<const ValueNode>
506 LookupName(const ContextNode&, const string&) ynothrow;
508
509
511
512
516 YF_API bool
517 DetectReducible(TermNode&, bool);
518
519
524 struct PassesCombiner
525 {
526 template<typename _tIn>
527 bool
528 operator()(_tIn first, _tIn last) const
529 {
530 return ystdex::fast_any_of(first, last, ystdex::id<>());
531 }
532 };
533
534
536 template<typename... _tParams>
537 using GPasses = YSLib::GEvent<bool(_tParams...),
538 YSLib::GCombinerInvoker<bool, PassesCombiner>>;
540 using TermPasses = GPasses<TermNode&>;
542 using EvaluationPasses = GPasses<TermNode&, ContextNode&>;
543
544
546 using Guard = ystdex::any;
551 using GuardPasses = YSLib::GEvent<Guard(TermNode&, ContextNode&),
552 YSLib::GDefaultLastValueInvoker<Guard>>;
553
554
556 inline PDefH(void, LiftTerm, TermNode& term, TermNode& tm)
557 ImplExpr(TermNode(std::move(tm)).SwapContent(term))
559
561
562
566 inline PDefH(void, LiftFirst, TermNode& term)
567 ImplExpr(LiftTerm(term, Deref(term.begin())))
568
573 inline PDefH(void, LiftLast, TermNode& term)
574 ImplExpr(LiftTerm(term, Deref(term.rbegin())))
576
577
582 template<class _tPasses>
583 typename _tPasses::result_type
584 InvokePasses(TermNode& term, ContextNode& ctx, const string& name)
585 {
586 return ystdex::call_value_or<typename _tPasses::result_type>(
587 [&](_tPasses& passes){
588 return passes(term, ctx);
589 }, AccessChildPtr<_tPasses>(ctx, name));
590 }
591
592 } // namespace NPL;
593
594 #endif
595
NPL::term
const TermNode &term ValueNode &node const ValueNode &node const TermNode & term
Definition: SContext.h:72
NPL::PrintIndent
YF_API void PrintIndent(std::ostream &, IndentGenerator=DefaultGenerateIndent, size_t=1)
打印缩进。
Definition: NPLA.cpp:93
YB_NORETURN
#define YB_NORETURN
指定无返回值函数。
Definition: ydef.h:478
YSLib::lv
RecordLevel lv
Definition: YException.cpp:58
ystdex::to_string
std::string to_string(const std::thread::id &)
转换 thread::id 为字符串表示。
NPL::DetectReducible
YF_API bool DetectReducible(TermNode &, bool)
移除节点的空子节点，然后判断是否可继续规约。
Definition: NPLA.cpp:364
ystdex::string_view
basic_string_view< char > string_view
Definition: string_view.hpp:415
ynothrow
#define ynothrow
YSLib 无异常抛出保证：若支持 noexcept 关键字， 指定特定的 noexcept 异常规范。
Definition: ydef.h:740
NPL::ArityMismatch
元数不匹配错误。
Definition: NPLA.h:445
YSLib::GEvent
事件模板。
Definition: YEvent.hpp:312
NPL::ImplRet
const TermNode &term ImplRet(term) inline PDefH(ValueNode &
YSLib::ValueNode::iterator
Container::iterator iterator
Definition: ValueNode.h:65
ystdex::fast_any_of
bool fast_any_of(_tIn first, _tIn last, _fPred pred)
Definition: algorithm.hpp:75
NPL::LiteralHandler
YSLib::GHEvent< bool(const ContextNode &)> LiteralHandler
字面量处理器类型。
Definition: NPLA.h:484
YSLib::MakeIndex
MakeIndex
Definition: ValueNode.h:865
NPL::A1::name
ctx const string & name
Definition: NPLA1.h:248
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
NPL::GNodeInserter
std::function< void(TermNode &&, _tCon &)> GNodeInserter
Definition: NPLA.h:99
NPL::PassesCombiner
遍合并器：逐次调用直至返回 true 。
Definition: NPLA.h:524
NPL::SXML::ParseOption
ParseOption
限定解析选项。
Definition: NPL.h:60
NPL::TermNode
ValueNode TermNode
项节点：存储语法分析结果的值类型节点。
Definition: SContext.h:51
NPL::InvalidSyntax
语法错误。
Definition: NPLA.h:421
NPL::NodeInserter
GNodeInserter< TermNode::Container & > NodeInserter
Definition: NPLA.h:101
YSLib::LoggedEvent
记录日志的异常事件类。
Definition: YException.h:49
NPL::SXML::PDefH
PDefH(ValueNode, MakeTop,) ImplRet(MakeTop(
Definition: NPLA.h:307
NPL::MapNPLALeafNode
YF_API ValueNode MapNPLALeafNode(const TermNode &)
映射 NPLA 叶节点。
Definition: NPLA.cpp:38
NPL::SXML::InsertAttributeNode
void InsertAttributeNode(_tNodeOrCon &&node_or_con, const string &name, std::initializer_list< NodeLiteral > il)
插入只有 XML 属性节点到语法节点。
Definition: NPLA.h:360
NPL::NodeSequenceInserter
GNodeInserter< NodeSequence > NodeSequenceInserter
Definition: NPLA.h:103
NPL::SXML::PrintSyntaxNode
YF_API void PrintSyntaxNode(std::ostream &os, const TermNode &, IndentGenerator=DefaultGenerateIndent, size_t=0)
打印 SContext::Analyze 分析取得的 SXML 语法树节点并刷新流。
Definition: NPLA.cpp:286
DefDeCtor
#define DefDeCtor(_t)
简单通用成员函数定义。
Definition: YBaseMacro.h:156
DefGetter
#define DefGetter(_q, _t, _n,...)
Definition: YBaseMacro.h:240
NPL::ArityMismatch::expected
size_t expected
Definition: NPLA.h:448
NPL::SXML::ConvertStringNode
YF_API string ConvertStringNode(const TermNode &)
转换 SXML 节点为被转义的 XML 字符串。
Definition: NPLA.cpp:280
YSLib::NodeLiteral
包装节点的组合字面量。
Definition: ValueNode.h:895
NPL::NPLTag
NPL 元标签。
Definition: NPL.h:43
ystdex::any
基于类型擦除的动态泛型对象。
Definition: any.h:823
YSLib::ValueNode::Container
ystdex::mapped_set< ValueNode, ystdex::less<>> Container
Definition: ValueNode.h:61
NPL::PrintNode
YF_API void PrintNode(std::ostream &, const ValueNode &, NodeToString=EscapeNodeLiteral, IndentGenerator=DefaultGenerateIndent, size_t=0)
打印 NPLA 节点。
Definition: NPLA.cpp:100
std
Definition: memory.hpp:1100
platform::Deref
yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:440
YSLib::GCombinerInvoker
结果组合调用器。
Definition: YEvent.hpp:255
NPL::ArityMismatch::received
size_t received
Definition: NPLA.h:449
YModules.h
NPL::LiteralizeEscapeNodeLiteral
YF_API string LiteralizeEscapeNodeLiteral(const ValueNode &)
转义 NPLA 节点字面量。
Definition: NPLA.cpp:74
NPL::SXML::MakeAttributeLiteral
NodeLiteral MakeAttributeLiteral(const string &name, _tParams &&...args)
Definition: NPLA.h:350
ystdex::id
恒等仿函数。
Definition: functor.hpp:102
NPL::PassesCombiner::operator()
bool operator()(_tIn first, _tIn last) const
Definition: NPLA.h:528
NPL::Guard
ystdex::any Guard
作用域守护类型。
Definition: NPLA.h:546
YSLib::Text::str
const char const char * str
Definition: TextFile.h:77
NPL::SXML::MakeTop
ValueNode MakeTop(const string &name, _tParams &&...args)
构造 SXML 文档顶级节点。
Definition: NPLA.h:302
NPL::ContextHandler
YSLib::GHEvent< void(TermNode &, ContextNode &)> ContextHandler
上下文处理器类型。
Definition: NPLA.h:482
NPL
Definition: NPL/Configuration.h:34
NPL::SXML::MakeAttributeTagLiteral
NodeLiteral MakeAttributeTagLiteral(_tParams &&...args)
Definition: NPLA.h:337
NPL::ParseNPLANodeString
YF_API string ParseNPLANodeString(const ValueNode &)
解析 NPLA 节点字符串。
Definition: NPLA.cpp:80
NPL::YB_NONNULL
YF_API YB_NONNULL(1, 2) void InstallFile(const char *
安装文件：复制单个文件。
NPL::SXML::ConvertDocumentNode
YF_API string ConvertDocumentNode(const TermNode &, IndentGenerator=DefaultGenerateIndent, size_t=0, ParseOption=ParseOption::Normal)
转换 SXML 文档节点为 XML 字符串。
Definition: NPLA.cpp:176
NPL::TransformToSyntaxNode
YF_API ValueNode TransformToSyntaxNode(const ValueNode &, const string &={})
变换节点为语法分析树叶节点。
Definition: NPLA.cpp:45
NPL::SXML::ConvertAttributeNodeString
YF_API string ConvertAttributeNodeString(const TermNode &)
转换 SXML 节点为 XML 属性字符串。
Definition: NPLA.cpp:154
NPL::NodeToString
std::function< string(const ValueNode &)> NodeToString
Definition: NPLA.h:96
NPL::LookupName
YF_API observer_ptr< const ValueNode > LookupName(const ContextNode &, const string &) ynothrow
从指定上下文查找名称对应的节点。
Definition: NPLA.cpp:357
NPL::PrintNodeString
YF_API bool PrintNodeString(std::ostream &, const ValueNode &, NodeToString=EscapeNodeLiteral)
打印节点字符串。
Definition: NPLA.cpp:141
NPL::NPLATag
NPLA 元标签。
Definition: NPLA.h:59
YSLib::NodeSequence
yimpl(YSLib::vector)< ValueNode > NodeSequence
节点序列容器。
Definition: ValueNode.h:888
YSLib::ValueNode
值类型节点。
Definition: ValueNode.h:57
NPL::SXML::ParseOption::Normal
NPL::InsertSyntaxNode
ValueNode::iterator InsertSyntaxNode(_tNodeOrCon &&node_or_con, std::initializer_list< ValueNode > il, _tParams &&...args)
插入语法节点。
Definition: NPLA.h:72
yforward
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
Definition: ydef.h:969
NPL::FetchValue
ValueObject FetchValue(const ContextNode &ctx, const string &name)
Definition: NPLA.cpp:350
platform::Descriptions::RecordLevel
RecordLevel
记录等级。
Definition: YCommon.h:151
NPL::SXML::MakeXMLDecl
YF_API ValueNode MakeXMLDecl(const string &={}, const string &="1.0", const string &="UTF-8", const string &={})
构造 SXML 文档 XML 声明节点。
Definition: NPLA.cpp:297
NPL::ListReductionFailure
列表规约失败。
Definition: NPLA.h:408
YF_API
#define YF_API
Definition: Platform.h:56
NPL::EscapeNodeLiteral
YF_API string EscapeNodeLiteral(const ValueNode &)
转义 NPLA 节点字面量。
Definition: NPLA.cpp:68
ystdex::cpp2011::begin
_type * begin(_type(&&array)[_vN])
Definition: range.hpp:46
NPL::NPLException
NPL 异常基类。
Definition: NPLA.h:385
platform::Descriptions::Err
Definition: YCommon.h:156
YSLib::IO::f
const string &path const String &path _func f
Definition: YSLib/Service/FileSystem.h:430
ystdex::cpp2014::rbegin
auto rbegin(_tRange &c) -> decltype(c.rbegin())
Definition: range.hpp:94
CHRLib::args
_tParams && args
Definition: CharacterProcessing.h:538
NPL::PDefH
YF_API const char * PDefH(void, InstallFile, const string &dst, const string &src) ImplExpr(InstallFile(dst.c_str()
NPL::PrintNodeChild
YF_API void PrintNodeChild(std::ostream &, const ValueNode &, NodeToString=EscapeNodeLiteral, IndentGenerator=DefaultGenerateIndent, size_t=0)
打印作为子节点的 NPLA 节点。
Definition: NPLA.cpp:124
NPL::SXML::MakeXMLDoc
YF_API ValueNode MakeXMLDoc(const string &={}, const string &="1.0", const string &="UTF-8", const string &={})
构造包含 XML 声明的 SXML 文档节点。
Definition: NPLA.cpp:311
any.h
动态泛型类型。
YSLib::ValueObject
值类型对象类。
Definition: YObject.h:272
NPL::IndentGenerator
std::function< string(size_t)> IndentGenerator
生成前缀缩进的函数类型。
Definition: NPLA.h:189
platform::bool
std::FILE *fp bool
Definition: FileIO.h:1187
NPL::DefaultGenerateIndent
YF_API string DefaultGenerateIndent(size_t)
生成水平制表符为单位的缩进。
Definition: NPLA.cpp:87
NPL::GPasses
YSLib::GEvent< bool(_tParams...), YSLib::GCombinerInvoker< bool, PassesCombiner >> GPasses
一般合并遍。
Definition: NPLA.h:538
NPL::ImplExpr
YF_API const char src const string const char const char *src ImplExpr(InstallDirectory(string(dst), string(src))) YF_API YB_NONNULL(1
安装硬链接：创建硬链接，失败则安装文件。
NPL::InsertChildSyntaxNode
ValueNode::iterator InsertChildSyntaxNode(_tNodeOrCon &&node_or_con, ValueNode &child)
插入语法子节点。
Definition: NPLA.h:167
NPL::NodeMapper
std::function< ValueNode(const TermNode &)> NodeMapper
节点映射操作类型：变换节点为另一个节点。
Definition: NPLA.h:92
ystdex::transformed_iterator
变换迭代器。
Definition: iterator.hpp:216
NPL::UndeclaredIdentifier
未声明标识符错误。
Definition: NPLA.h:433