1 回答
TA贡献1772条经验 获得超6个赞
不
最简单的 劣势的语体概念 分离关注点..你想表达 句法在一个地方 语义学在另一个。这有助于维护性(特别是用于编译精神语法的冗长编译时间) 如果它们有副作用的话,会产生更复杂的影响(这通常是这样的)。想象一下,当语义操作有一个 副作用解析器状态将被恢复,但外部效果不会恢复。 在某种程度上,使用属性 只就像在函数程序中使用确定性的纯函数一样,更容易对程序的正确性进行推理(或者,在本例中是 语法(状态机) 编成纯函数。 语义操作有一种倾向(但不一定是这样),即按值引入更多的复制;这再加上大量的回溯,可以 降低性能..当然,如果语义动作“很重”,这本身就会妨碍解析的性能。
考虑使用 qi::locals<>
和 继承属性(代码来自 Mini XML - ASTs!
样本 )-它们涉及语义行为: xml = start_tag [at_c<0>(_val) = _1] >> *node >> end_tag(at_c<0>(_val)) // passing the name from the // ... start_tag as inherited attribute;
rule<char const*, locals<char> > rl;rl = alpha[_a = _1] >> char_(_a); // get two identical characterstest_parser("aa", rl); // passtest_parser("ax", rl); // fail
国际海事组织,这些语义动作通常不构成问题,因为当它们被回溯时,下一次执行传递(相同的)语义动作时, 本土化只会被新的,正确的,价值所覆盖。 此外,有些工作是“快速和肮脏的”,不值得使用 乌特里或者手卷AST类型: qi::phrase_parse(first, last, // imagine qi::istream_iterator... intesting_string_pattern // we want to match certain patterns on the fly [ log_interesting_strings ], // and pass them to our logger noise_skipper // but we skip all noise );
在这里,语义动作是 岩心解析器的函数。它可以工作,因为在具有语义操作的节点级别上不涉及回溯。 语义行为是精神因果报应中语义行为的镜像,在那里,语义行为所带来的问题通常比气中的问题少,因此,即使只是为了界面/API的一致性,语义行为也是一件“好事”,提高了Boost精灵作为一个整体的可用性。
- 1 回答
- 0 关注
- 481 浏览
添加回答
举报