草庐IT

c++ - 如何对 Boost Spirit Parser 进行基准测试?

我正在开发一个编译器,我想提高它的性能。我发现大约50%的时间用于解析源文件。由于源文件很小,之后我做了很多转换,在我看来它是完美的。我的解析器是一个带有词法分析器(带有lexer::pos_iterator)的BoostSpirit解析器,我有一个中等大小的语法。我正在将源解析为AST。我的问题是我不知道在解析过程中花费最多时间的是什么:AST节点、词法分析器、解析器规则或内存的拷贝。我认为这不是I/O问题,因为我正在使用SSD,并且我在开始时完全读取文件,然后仅使用内存版本。我尝试使用分析器,但需要时间的方法是来自Boost的一些方法,它们的名称有数百个字符长,我不知道它们具体是做

c++ - 带有 Boost::Spirit 的自定义跳过解析器

标准的ascii::space_type跳过程序当然不会跳过我的评论。文档中提到您可以制作自己的跳过解析器,但没有实际操作的示例。我只需要一个示例代码或任何东西,我已经在谷歌上搜索了2个小时。请不要将我指向examples,几个有效的链接已经过时了,与Spirit1.6打交道。 最佳答案 经过一些实验,我找到了一种指定自定义船长的方法,并将在此处概述:templatestructpl0_skipper:publicqi::grammar{pl0_skipper():pl0_skipper::base_type(skip,"PL/0"

c++ - 带有 Boost::Spirit 的自定义跳过解析器

标准的ascii::space_type跳过程序当然不会跳过我的评论。文档中提到您可以制作自己的跳过解析器,但没有实际操作的示例。我只需要一个示例代码或任何东西,我已经在谷歌上搜索了2个小时。请不要将我指向examples,几个有效的链接已经过时了,与Spirit1.6打交道。 最佳答案 经过一些实验,我找到了一种指定自定义船长的方法,并将在此处概述:templatestructpl0_skipper:publicqi::grammar{pl0_skipper():pl0_skipper::base_type(skip,"PL/0"

c++ - 是否可以在另一个语法定义中重用 boost::spirit::qi 语法?

是否可以在另一个语法中重用boost::spirit:qi语法(例如规则)?例如,如果我定义一个语法来将文本行解析为包含街道地址的结构。templatestructaddress_grammar:qi::grammar{...qi::rulestreet_name;qi::rulestreet_number;qi::ruleaddress_;}我可能想在其他两种语法中重用该语法,例如,一种可能用于解析存储在文件中的地址vector。另一种重用可能是更复杂的结构,其中一个字段是这个街道地址结构。templatestructcompany_grammar:qi::grammar{...qi

c++ - 是否可以在另一个语法定义中重用 boost::spirit::qi 语法?

是否可以在另一个语法中重用boost::spirit:qi语法(例如规则)?例如,如果我定义一个语法来将文本行解析为包含街道地址的结构。templatestructaddress_grammar:qi::grammar{...qi::rulestreet_name;qi::rulestreet_number;qi::ruleaddress_;}我可能想在其他两种语法中重用该语法,例如,一种可能用于解析存储在文件中的地址vector。另一种重用可能是更复杂的结构,其中一个字段是这个街道地址结构。templatestructcompany_grammar:qi::grammar{...qi

c++ - 在 boost::spirit 中使用指向解析器的指针

基本上我在做一个表达式解析器。由于我需要尽可能好的性能,并且根据语法的文档构造可能相当慢,我想重用语法并在解析之前绑定(bind)符号表。由于语法的客户端可能有一个在解析之前构建和维护的符号表,我希望避免复制实际的表,这会导致我使用以下代码(简化)来翻译术语:qi::symbols*m_Symbols;qi::rulem_Val;m_Val=qi::int_[_val=boost::phoenix::static_cast_(boost::spirit::_1)]|qi::double_|m_Symbols;这里的问题是m_Symbols。我想要的是让m_Val通过引用保存m_Symb

c++ - 从排列的解析器表达式列表中动态(在运行时)生成 Spirit 解析器表达式

我的目标是“动态”构建由简单置换表达式组成的表达式,但我无法使其完全发挥作用。即这两个序列表明它没有按预期工作:-bbtoken-cctoken-ddtoken-aatoken-cctoken-ddtoken-aatoken-bbtoken最终目标是能够动态构建可以解析不同类型的表达式:int、float、double...感谢您的建议:-)#defineBOOST_SPIRIT_DEBUG#defineBOOST_SPIRIT_USE_PHOENIX_V3#include#include#include#includenamespaceqi=boost::spirit::qi;nam

C++ Boost read_json 崩溃,我有#define BOOST_SPIRIT_THREADSAFE

最近其他人升级了我们的boost库,现在我在大量调用read_json函数时看到这个coredump。以前从未见过这个。而且我在代码中有#defineBOOST_SPIRIT_THREADSAFE,这就是为什么以前没有发生过这种情况。真的需要帮助!谢谢!程序终止,信号11,段错误。#00x00007f062ce0d094instd::mem_fun1_t>>,boost::spirit::classic::parser_context>>,boost::spirit::classic::grammar>>,boost::spirit::classic::parser_context>*

c++ - 在 Boost Spirit 中解析嵌套键值对

我在编写我认为应该使用Boost::Spirit的简单解析器时遇到了问题。(我正在使用Spirit而不是仅仅使用字符串函数,因为这在一定程度上是我的学习练习)。数据要解析的数据采用键值对的形式,其中值本身可以是键值对。键是字母数字(带下划线且没有数字作为第一个字符);值是字母数字加上.-_-值可以是格式为DD-MMM-YYYY的日期,例如01-Jan-2015和float,如3.1415除了普通的旧字母数字字符串。键和值用=分隔;对用;;分隔结构化值用{...}分隔。目前,在将用户输入传递给Spirit之前,我正在清除用户输入中的所有空格。示例输入:Key1=Value1;Key2={

c++ - boost::spirit::qi 关键字和标识符

我看过一些与qi语法中关键字/标识符使用的细微差别相关的帖子,但我不太明白boost示例中演示的方法应该如何工作......关键字声明:qi::symbolskeywords;示例关键字集:keywords.add("foo")("bar");标识符规则声明:qi::ruleidentifier;以下是qicalc和编译器示例中标识符规则的定义方式:identifier=!keywords>>qi::raw[qi::lexeme[(qi::alpha|'_')>>*(qi::alnum|'_')]];也许我读错了qi语法,但在我看来,这不会接受任何匹配或以关键字开头的文字。拒绝完全关键