我正在尝试使用boost::spirit库编写一个python解析器。这是代码:templateclassParser:publicqi::grammar{public:Parser():Parser::base_type(small_stmt){NEWLINE=lit("");INDENT=lit("");DEDENT=lit("");ENDMARKER=lit("");NAME=identifier.alias();NUMBER=integer|longinteger|floatnumber|imagnumber;STRING=stringliteral.alias();ident
我已经弄清楚了如何使用精神——也就是说,我写了一个中等复杂的语法。我总是采用扩展程序的方法——一次一个子系统。我已经为一个复杂模型编写了数据结构,它在最高级别有4种类型。我想使用grammarcomposedfromrulesapproach一次解析一种类型的顶级类型——即,我想用一种顶级语法编写4个语法。如果这是可能的(我开始怀疑),有人可以发布一个片段或对执行此操作的项目的引用。具有50多个(可能更多)规则(用于正确错误处理)的顶级语法听起来并不有趣(TMP代码易变/编译缓慢,并提供无用的错误消息)。 最佳答案 从一个实际的
按照几个教程(例如http://boost-spirit.com/home/articles/qi-example/nabialek-trick/),我想使用Nabialek技巧来拥有一个动态解析器。解析已经可以正常工作,但我没有得到传输的属性。解释如https://stackoverflow.com/a/9109972/2524462建议,属性应该是可能的,但不是参数。这只是一个将字符串和数字解析为结构的小示例。这只是为了展示我的问题;这种方法应该在以后真正需要动态解析器的更大系统中使用。问题:如何使用Nabialek技巧传输属性?我不是精神专家,所以请多多包涵。我正在使用g
一般情况:我无法弄清楚为什么我的Spirit语法/语义操作无法编译。有时,编译器会提示赋值或类型不兼容,我不知道出了什么问题。问题主要出现在两个方面:预测规则/表达式的综合属性类型因此,预测哪些类型的属性可以合法地定义为规则的公开属性(依赖于构建转换、融合适配器或Spirit自定义点)匹配我的语义操作的参数类型,以便编译器将能够编译函数调用调用不会在进程中调用不必要的隐式转换编译器错误并不完全易于处理,要么是文档错误,要么是我误解了它。有没有办法确切地找出Spirit传递给我的语义Action的内容?示例代码:structmybase{inta,b;};structmyderived:
理论上可以胜任吗?是否可以实际完成?生成的解析器是否能以足够的性能和输出(例如,LLVMIR或GCC的gimple)集成到竞争编译器中? 最佳答案 对不起。我和它的作者谈过,他说他不会让它完全解析C++,但承认他接受它来解析某些结构是模棱两可的。所以这不再是答案了!!我建议你看看scalpel.从它的主页Scalpelstandsforsourcecodeanalysis,libreandportablelibrary.ThisisaC++librarywhichaimstoperformfullsyntaxand
这可能很明显,但是为什么boost中基于流的解析会重复最后一个字母呢?我一定是做错了什么:#include#include#includenamespaceqi=boost::spirit::qi;intmain(){std::stringinput="hello";std::stringstreamss(input);std::stringr1,r2;boost::spirit::istream_iteratorfirst(ss),last;qi::phrase_parse(input.begin(),input.end(),qi::lexeme[qi::alpha>>*qi::al
已结束。此问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。关闭6年前。Improvethisquestion我最近一直在查看Boost.Spirit(Boost1.39中包含的版本),但是我对文档本身感到很困惑。我正在寻找的是一个用Boost.Spirit实现的玩具语言的示例——类似于小型Javascript或Lua左右的东西,您基本上可以在其中创建一个AST和进程。如果它只支持函数/变量定义和基本运算符,我会很高兴,我只是想看看你如何使用Boost.Spiri
在几个问题中,我看到了对Spirit的建议。解析器生成器框架来自boost.org,但是在评论中,使用Spirit的人不开心的提示。请那些人站出来向我们解释一下使用Spirit的缺点或缺点是什么? 最佳答案 这是一个很酷的想法,我喜欢它;真正学习如何使用C++模板特别有用。但他们的文档建议将spirit用于中小型解析器。完整语言的解析器需要很长时间才能编译。我将列出三个原因。无扫描仪解析。虽然它相当简单,但当需要回溯时,它可能会减慢解析器的速度。虽然它是可选的-可能会集成词法分析器,请参阅使用Spirit构建的C预处理器。大约300
问题在底部以粗体显示,问题也通过蒸馏代码片段向末尾进行了总结。我正在尝试将我的类型系统(类型系统在类型和字符串之间往返)统一到一个组件中(由Lakos定义)。我正在使用boost::array,boost::variant,和boost::mpl,为了达到这个目的。我希望将我的类型的解析器和生成器规则统一在一个变体中。有一个未定义的类型,一个int4(见下文)类型和一个int8类型。变体读作variant.int4特征:structrbl_int4_parser_rule_definition{typedefboost::spirit::qi::rulerule_type;boost:
有什么减少boost::spirit编译时间的想法吗?我刚刚将一个弹性解析器移植到boost::spirit。EBNF有大约25条规则。结果运行良好,运行时性能良好。问题是编译需要永远!这大约需要十分钟,并且需要近千兆字节的内存。最初的flex解析器在几秒钟内编译完成。我正在使用boost版本1.44.0和VisualStudio2008。在JoeldeGuzman的文章中'BestPractices'它说Ruleswithcomplexdefinitionshurtthecompilerbadly.We’veseenrulesthataremorethanahundredlinesl