促进精神:“语义行为是邪恶的”?

促进精神:“语义行为是邪恶的”?

阅读和观看本演讲:http:/Boost-spir.com/home/2011/06/12/ast-BuildingwiththeUniversal-tree/
我发现了这个说法-基本上我们被建议不要使用语义动作。

我必须承认,我已经有过这样的感觉:带有语义动作的语法实际上看起来有点丑。而且,当我需要对它们进行扩展/更改时,需要大量的“微观管理”才能实现语义操作。在演示文稿中演示的带有属性语法的方法似乎更优雅、更有希望。

所以我想问:这是“官方”观点吗?我是否应该学习如何使用属性语法并更详细地避免语义操作?如果是这样的话-我想要一些基本的(甚至是微不足道的)例子,演示这种方法-LISP解释器太复杂了,我无法咀嚼.


红糖糍粑
浏览 482回答 1
1回答

梦里花落0921

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