Boost Spirit: “语义动作是邪恶的”?

24
阅读并观看此演示文稿:http://boost-spirit.com/home/2011/06/12/ast-construction-with-the-universal-tree/
我发现了这个声明--基本上我们建议不使用语义操作。
我必须承认,我已经有过这样的感受:带有语义动作的语法实际上看起来有点丑陋。而且,当我需要扩展/更改它们时,恰好是与语义动作进行大量“微管理”。在演示中展示的属性文法方法看起来更加优雅和有前途。
所以我想问:这是一个“官方”的观点吗?我应该学习如何更详细地使用属性文法并避免使用语义操作吗?如果是这样 - 我想要一些基本(甚至是琐碎的)例子,展示这种方法- LISP解释器对我来说太复杂了...

最好在Spirit-General列表上提问... - sehe
“LISP解释器”是什么?是否有在Spirit中编写的LISP解释器? - alfC
啊,我明白了,在这个链接的幻灯片里:https://github.com/boostcon/2011_presentations/raw/master/fri/utree_talk.pdf - alfC
1个回答

29

我相信Hartmut马上就会回答。在那之前,这是我的看法:

,那不是官方观点。

语义动作有一些缺点。

  • 语义动作最简单的缺点是风格上关注点分离的概念。你想在一个地方表达语法,在另一个地方表达语义。这有助于可维护性(特别是考虑到编译Spirit语法的漫长时间)。

  • 如果它们具有副作用(这经常是情况),则更复杂的意义意味着更多的涉及副作用。想象一下从解析节点回溯时语义动作具有副作用:解析器状态将被还原,但外部效果则不会。

    在某种程度上,仅使用属性就像在函数式程序中使用确定性纯函数一样,当由纯函数组成时,容易推断出程序(或者在本例中为语法状态机)的正确性。

  • 语义动作有倾向(但不一定如此)引入更多值的复制;这与频繁回溯结合使用时,可能会降低性能。当然,如果语义动作是“重”(本身就要影响解析效率),那么这本身就会阻碍解析的性能。


语义动作对于各种目的都有好处。实际上,如果您需要解析具有上下文敏感性的非平凡语法,则无法避免使用它们。

  1. 考虑使用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
    ;
    

    或者使用qi::locals

    rule<char const*, locals<char> > rl;
    rl = alpha[_a = _1] >> char_(_a); // get two identical characters
    test_parser("aa", rl); // pass
    test_parser("ax", rl); // fail
    

    在我看来,通常这些语义操作不会引起太大问题,因为当它们被回溯时,下一次执行经过同一个语义操作时,局部变量将会被新的、正确的值覆盖。

  2. 此外,有些工作确实很'快而粗糙',不需要使用utree或手动编写AST类型:

  3.  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
     );
    

    在这里,语义动作是解析器功能的核心。它能够工作,因为在具有语义动作的节点层级上没有涉及回溯。

  4. 语义动作是Spirit Karma中语义动作的镜像,它们通常比Qi中的语义动作问题少得多;因此,即使出于接口/API一致性考虑,语义动作也是“好事”,可以提高Boost Spirit整体的可用性。


关于库(X3)的语义动作,您有什么看法?它们会在最新版本中出现吗? - Tomilov Anatoliy
@Dukales 当然会的。语义动作可能有缺点,但没有它们会更加致命。不过我对X3的实际操作经验不多。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接