YSTest: NPLA1.h 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

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

- 文件列表
- 文件成员

NPLA1.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_NPLA1_h_
29 #define NPL_INC_NPLA1_h_ 1
30
31 #include "YModules.h"
32 #include YFM_NPL_NPLA // for NPLATag, ValueNode, TermNode, LoggedEvent;
33
34 namespace NPL
35 {
36
38 namespace A1
39 {
40
46 struct YF_API NPLA1Tag : NPLATag
47 {};
48
49
51 enum class ValueToken
52 {
53 Null,
54 GroupingAnchor,
55 OrderedAnchor
56 };
57
58
60
61
63
69 YF_API void
70 InsertChild(TermNode&&, TermNode::Container&);
71
77 YF_API void
78 InsertSequenceChild(TermNode&&, NodeSequence&);
80
99 YF_API ValueNode
100 TransformNode(const TermNode&, NodeMapper = {}, NodeMapper = MapNPLALeafNode,
101 NodeToString = ParseNPLANodeString, NodeInserter = InsertChild);
102
112 YF_API ValueNode
113 TransformNodeSequence(const TermNode&, NodeMapper = {},
114 NodeMapper = MapNPLALeafNode, NodeToString = ParseNPLANodeString,
115 NodeSequenceInserter = InsertSequenceChild);
117
118
124 template<typename _type, typename... _tParams>
125 ValueNode
126 LoadNode(_type&& tree, _tParams&&... args)
127 {
128 TryRet(A1::TransformNode(std::forward<TermNode&&>(tree),
129 yforward(args)...))
130 CatchThrow(ystdex::bad_any_cast& e, LoggedEvent(YSLib::sfmt(
131 "Bad NPLA1 tree found: cast failed from [%s] to [%s] .", e.from(),
132 e.to()), YSLib::Warning))
133 }
134
135 template<typename _type, typename... _tParams>
136 ValueNode
137 LoadNodeSequence(_type&& tree, _tParams&&... args)
138 {
139 TryRet(A1::TransformNodeSequence(std::forward<TermNode&&>(tree),
140 yforward(args)...))
141 CatchThrow(ystdex::bad_any_cast& e, LoggedEvent(YSLib::sfmt(
142 "Bad NPLA1 tree found: cast failed from [%s] to [%s] .", e.from(),
143 e.to()), YSLib::Warning))
144 }
146
147
149
150 YF_API GuardPasses&
152 AccessGuardPassesRef(ContextNode&);
153
155 YF_API EvaluationPasses&
156 AccessLeafPassesRef(ContextNode&);
157
159 YF_API EvaluationPasses&
160 AccessListPassesRef(ContextNode&);
161
163 YF_API Guard
164 EvaluateGuard(TermNode& term, ContextNode&);
165
167 YF_API bool
168 EvaluateLeafPasses(TermNode& term, ContextNode&);
169
171 YF_API bool
172 EvaluateListPasses(TermNode& term, ContextNode&);
173
174
196 YF_API bool
197 Reduce(TermNode&, ContextNode&);
199
212 YF_API void
213 ReduceChildren(TermNode::iterator, TermNode::iterator, ContextNode&);
214 inline PDefH(void, ReduceChildren, TermNode::Container& con, ContextNode& ctx)
215 ImplExpr(ReduceChildren(con.begin(), con.end(), ctx))
216 inline PDefH(void, ReduceChildren, TermNode& term, ContextNode& ctx)
217 ImplExpr(ReduceChildren(term.GetContainerRef(), ctx))
219
225 YF_API void
226 ReduceArguments(TermNode::Container&, ContextNode&);
228
237 inline PDefH(bool, ReduceFirst, TermNode& term, ContextNode& ctx)
238 ImplRet(!term.empty() ? Reduce(Deref(term.begin()), ctx) : false)
239
240
247 YF_API void
248 SetupTraceDepth(ContextNode& ctx, const string& name = yimpl("$__depth"));
249
250
262 YF_API TermNode
264 TransformForSeparator(const TermNode&, const ValueObject&, const ValueObject&,
265 const string& = {});
266
268 YF_API TermNode
269 TransformForSeparatorRecursive(const TermNode&, const ValueObject&,
270 const ValueObject&, const string& = {});
272
279 YF_API bool
280 ReplaceSeparatedChildren(TermNode&, const ValueObject&, const ValueObject&);
282
283
288 class YF_API FormContextHandler
289 {
290 public:
291 ContextHandler Handler;
292
294 template<typename _func,
295 yimpl(typename = ystdex::exclude_self_t<FormContextHandler, _func>)>
296 FormContextHandler(_func&& f)
297 : Handler(yforward(f))
298 {}
299
311 void
312 operator()(TermNode&, ContextNode&) const;
313 };
314
315
320 struct YF_API FunctionContextHandler
321 {
322 public:
323 FormContextHandler Handler;
324
326 template<typename _func,
327 yimpl(typename = ystdex::exclude_self_t<FunctionContextHandler, _func>)>
328 FunctionContextHandler(_func&& f)
329 : Handler(yforward(f))
330 {}
331
339 void
340 operator()(TermNode&, ContextNode&) const;
341 };
342
343
345
346 template<typename _func>
348 ContextHandler
349 ToContextHandler(_func&& f)
350 {
351 return FunctionContextHandler(yforward(f));
352 }
353
358 template<typename _func>
359 void
360 RegisterFunction(ContextNode& node, const string& name, _func&& f)
361 {
362 NPL::RegisterContextHandler(node, name, ToContextHandler(yforward(f)));
363 }
365
366
375 YF_API bool
376 EvaluateContextFirst(TermNode&, ContextNode&);
377
378 } // namesapce A1;
379
380 } // namespace NPL;
381
382 #endif
383
ystdex::mapped_set::begin
iterator begin()
Definition: set.hpp:284
NPL::A1::PDefH
PDefH(void, ReduceChildren, TermNode::Container &con, ContextNode &ctx) ImplExpr(ReduceChildren(con.begin()
NPL::term
const TermNode &term ValueNode &node const ValueNode &node const TermNode & term
Definition: SContext.h:72
NPL::A1::ValueToken::GroupingAnchor
NPL::A1::EvaluateLeafPasses
YF_API bool EvaluateLeafPasses(TermNode &term, ContextNode &)
求值叶节点遍。
Definition: NPLA1.cpp:164
ystdex::sfmt
auto sfmt(const _tChar *fmt,...) -> decltype(vsfmt(fmt, std::declval< std::va_list >()))
以 C 标准输出格式的输出 std::basic_string 实例的对象。
Definition: string.hpp:1140
platform::Descriptions::Warning
Definition: YCommon.h:157
NPL::A1::FormContextHandler
形式上下文处理器。
Definition: NPLA1.h:288
YSLib::GEvent
事件模板。
Definition: YEvent.hpp:312
NPL::A1::ValueToken::OrderedAnchor
NPL::A1::ValueToken
ValueToken
值记号：节点中的值的占位符。
Definition: NPLA1.h:51
NPL::ImplRet
const TermNode &term ImplRet(term) inline PDefH(ValueNode &
NPL::A1::TransformForSeparator
YF_API TermNode TransformForSeparator(const TermNode &, const ValueObject &, const ValueObject &, const string &={})
变换分隔符中缀表达式为前缀表达式。
Definition: NPLA1.cpp:253
YSLib::ValueNode::begin
begin
Definition: ValueNode.h:398
NPL::A1::name
ctx const string & name
Definition: NPLA1.h:248
NPL::A1::FunctionContextHandler
函数上下文处理器。
Definition: NPLA1.h:320
NPL::A1::AccessLeafPassesRef
YF_API EvaluationPasses & AccessLeafPassesRef(ContextNode &)
访问叶节点遍。
Definition: NPLA1.cpp:146
CHRLib::e
const char const char * e
Definition: CharacterProcessing.h:109
NPL::A1::TransformForSeparatorRecursive
YF_API TermNode TransformForSeparatorRecursive(const TermNode &, const ValueObject &, const ValueObject &, const string &={})
递归变换分隔符中缀表达式为前缀表达式。
Definition: NPLA1.cpp:277
NPL::A1::Reduce
YF_API bool Reduce(TermNode &, ContextNode &)
NPLA1 节点规约。
Definition: NPLA1.cpp:177
NPL::TermNode
ValueNode TermNode
项节点：存储语法分析结果的值类型节点。
Definition: SContext.h:51
NPL::NodeInserter
GNodeInserter< TermNode::Container & > NodeInserter
Definition: NPLA.h:101
YSLib::LoggedEvent
记录日志的异常事件类。
Definition: YException.h:49
NPL::MapNPLALeafNode
YF_API ValueNode MapNPLALeafNode(const TermNode &)
映射 NPLA 叶节点。
Definition: NPLA.cpp:38
NPL::NodeSequenceInserter
GNodeInserter< NodeSequence > NodeSequenceInserter
Definition: NPLA.h:103
ystdex::exclude_self_t
enable_if_t<!is_same< _tClass &, decay_t< _tParam > & >::value, _type > exclude_self_t
移除选择类类型的特定重载避免构造模板和复制/转移特殊成员函数冲突。
Definition: type_traits.hpp:708
NPL::A1::FormContextHandler::FormContextHandler
FormContextHandler(_func &&f)
Definition: NPLA1.h:296
ystdex::mapped_set
允许指定不同于值类型的键的集合。
Definition: set.hpp:160
NPL::A1::InsertSequenceChild
YF_API void InsertSequenceChild(TermNode &&, NodeSequence &)
Definition: NPLA1.cpp:50
yimpl
#define yimpl(...)
实现标签。
Definition: ydef.h:256
ystdex::bad_any_cast::to
const char * to() const
Definition: any.cpp:64
NPL::A1::LoadNodeSequence
ValueNode LoadNodeSequence(_type &&tree, _tParams &&...args)
Definition: NPLA1.h:137
NPL::A1::TransformNode
YF_API ValueNode TransformNode(const TermNode &, NodeMapper={}, NodeMapper=MapNPLALeafNode, NodeToString=ParseNPLANodeString, NodeInserter=InsertChild)
变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 语义结构。 第三至五参数为空。
Definition: NPLA1.cpp:56
ystdex::bad_any_cast
动态泛型转换失败异常。
Definition: any.h:636
ystdex::any
基于类型擦除的动态泛型对象。
Definition: any.h:823
NPL::A1::ValueToken::Null
NPL::A1::SetupTraceDepth
void SetupTraceDepth(ContextNode &root, const string &name)
Definition: NPLA1.cpp:233
platform::Deref
yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:440
NPL::A1::FunctionContextHandler::FunctionContextHandler
FunctionContextHandler(_func &&f)
Definition: NPLA1.h:328
NPL::A1::EvaluateGuard
YF_API Guard EvaluateGuard(TermNode &term, ContextNode &)
求值守护。
Definition: NPLA1.cpp:158
YModules.h
NPL::A1::ReplaceSeparatedChildren
YF_API bool ReplaceSeparatedChildren(TermNode &, const ValueObject &, const ValueObject &)
查找项中的指定分隔符，若找到则替换项为去除分隔符并添加替换前缀的形式。
Definition: NPLA1.cpp:296
NPL::A1::RegisterFunction
void RegisterFunction(ContextNode &node, const string &name, _func &&f)
注册函数上下文处理器。
Definition: NPLA1.h:360
NPL::A1::EvaluateContextFirst
YF_API bool EvaluateContextFirst(TermNode &, ContextNode &)
检查非空项的首项并尝试按上下文列表求值。
Definition: NPLA1.cpp:366
NPL::A1::FunctionContextHandler::Handler
FormContextHandler Handler
Definition: NPLA1.h:323
NPL::ContextHandler
YSLib::GHEvent< void(TermNode &, ContextNode &)> ContextHandler
上下文处理器类型。
Definition: NPLA.h:482
NPL
Definition: NPL/Configuration.h:34
YSLib::ValueNode::empty
const container container empty
Definition: ValueNode.h:410
NPL::A1::AccessListPassesRef
YF_API EvaluationPasses & AccessListPassesRef(ContextNode &)
访问列表节点遍。
Definition: NPLA1.cpp:152
NPL::ParseNPLANodeString
YF_API string ParseNPLANodeString(const ValueNode &)
解析 NPLA 节点字符串。
Definition: NPLA.cpp:80
TryRet
#define TryRet(...)
指定表达式在 try 块中求值并返回。
Definition: YBaseMacro.h:124
NPL::A1::LoadNode
ValueNode LoadNode(_type &&tree, _tParams &&...args)
加载 NPLA1 翻译单元。
Definition: NPLA1.h:126
ystdex::mapped_set::end
iterator end()
Definition: set.hpp:295
NPL::NodeToString
std::function< string(const ValueNode &)> NodeToString
Definition: NPLA.h:96
NPL::A1::ToContextHandler
ContextHandler ToContextHandler(_func &&f)
转换上下文处理器。
Definition: NPLA1.h:349
NPL::NPLATag
NPLA 元标签。
Definition: NPLA.h:59
NPL::A1::AccessGuardPassesRef
YF_API GuardPasses & AccessGuardPassesRef(ContextNode &)
访问守护遍。
Definition: NPLA1.cpp:140
YSLib::NodeSequence
yimpl(YSLib::vector)< ValueNode > NodeSequence
节点序列容器。
Definition: ValueNode.h:888
YSLib::ValueNode
值类型节点。
Definition: ValueNode.h:57
yforward
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
Definition: ydef.h:969
YF_API
#define YF_API
Definition: Platform.h:56
NPL::A1::FormContextHandler::Handler
ContextHandler Handler
Definition: NPLA1.h:291
NPL::A1::InsertChild
YF_API void InsertChild(TermNode &&, TermNode::Container &)
插入 NPLA1 子节点。
Definition: NPLA1.cpp:43
YSLib::IO::f
const string &path const String &path _func f
Definition: YSLib/Service/FileSystem.h:430
NPL::A1::EvaluateListPasses
YF_API bool EvaluateListPasses(TermNode &term, ContextNode &)
求值列表节点遍。
Definition: NPLA1.cpp:170
NPL::A1::ReduceChildren
YF_API void ReduceChildren(TermNode::iterator, TermNode::iterator, ContextNode &)
规约子项。
Definition: NPLA1.cpp:211
CHRLib::args
_tParams && args
Definition: CharacterProcessing.h:538
YSLib::ValueObject
值类型对象类。
Definition: YObject.h:272
NPL::A1::TransformNodeSequence
YF_API ValueNode TransformNodeSequence(const TermNode &, NodeMapper={}, NodeMapper=MapNPLALeafNode, NodeToString=ParseNPLANodeString, NodeSequenceInserter=InsertSequenceChild)
变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 序列语义结构。 第三至五参数为空。
Definition: NPLA1.cpp:93
NPL::A1::NPLA1Tag
NPLA1 元标签。
Definition: NPLA1.h:46
ystdex::bad_any_cast::from
const char * from() const
Definition: any.cpp:57
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
安装硬链接：创建硬链接，失败则安装文件。
CatchThrow
#define CatchThrow(_ex,...)
指定抛出指定异常作为异常处理器。
Definition: YBaseMacro.h:141
NPL::NodeMapper
std::function< ValueNode(const TermNode &)> NodeMapper
节点映射操作类型：变换节点为另一个节点。
Definition: NPLA.h:92
ystdex::transformed_iterator
变换迭代器。
Definition: iterator.hpp:216
NPL::A1::ReduceArguments
con ctx ctx YF_API void ReduceArguments(TermNode::Container &, ContextNode &)
对容器中的第二项开始逐项规约。
Definition: NPLA1.cpp:221