草庐IT

c++ - 从 boost::spirit 解析器中检索 AST

在我阅读tutorials之后在boost::spirit,我非常喜欢它,因为解析器组合器语法。制作解析器非常简单。不幸的是,教程在从解析器中获取复杂数据结构的问题上并没有那么准确。我正在尝试前往KaleidoscopeAST.无论如何,这是我的AST代码:#ifndef__AST_HPP__#define__AST_HPP__#include#include#include#include#include#includenamespaceast{structadd;structsub;structmul;structdiv;structfunc_call;templatestruct

c++ - 使用 boost spirit x3 编译时间

我正在尝试掌握新的SpiritX3(boost1.61.0)。我的机器是运行Linux的MacBookPro(i7-4750HQ)。使用Spirit的第2版后,我习惯了较长的编译时间,但这感觉不对。对于表达式解析器的以下第一步,编译需要20秒。我以为X3会更快,这合理吗?我的代码不是最理想的吗?编译器设置(clang3.8.0)clang++-c-pipe-std=c++14-ftemplate-depth=512-g-w-Wall-Wno-unused-parameter-fPIC代码://#defineBOOST_SPIRIT_X3_DEBUG#include#include#in

c++ - Boost Spirit可以用来解析字节流数据吗?

可以使用Spirit(BoostC++库的一部分)来解析来自流的二进制数据吗?例如,它能否用于将来自套接字的数据解析为结构、字节和单个位标志?谢谢! 最佳答案 BoostSpirit允许使用ExtendedBackus–NaurForm(EBNF)定义解析器templatemeta-programming的语法.它非常灵活,在可定制的解析过程的所有阶段都使用抽象类。为了处理二进制数据流,您需要实现自定义扫描器类,因为默认类型是为文本输入量身定制的。您可以在TheScannerandParsing中进一步阅读节SpiritUser's

c++ - boost::spirit::hold_any 是如何工作的?

Evidentlyhold_any的性能优于boost::any。它是如何做到这一点的?编辑:感谢Mat的评论,我找到了一个answerbyhkaiser关于hold_any在另一个问题,但它缺乏细节。欢迎提供更详细的答案。 最佳答案 我认为原因之一是因为boost::hold_any使用模板元编程方法,而boost::any使用继承方法。在内部,boost::spirit::hold_any使用void*存储“值”并使用另一个对象来跟踪数据类型信息:>>boost/spirit/home/support/detail/hold_a

c++ - 如何将 unicode 字符与 boost::spirit 匹配?

如何使用boost::spirit匹配utf8unicode字符?比如我要识别这个字符串中的所有字符:$echo"Наберегупустынныхволн"|./a.outНаберегупустынныхволн当我尝试这个简单的boost::spirit程序时,它无法正确匹配unicode字符:#include#include#includenamespaceqi=boost::spirit::qi;intmain(){std::cin.unsetf(std::ios::skipws);boost::spirit::istream_iteratorbegin(std::cin);

c++ - 使用 Boost Spirit 解析语法

我正在尝试解析像树表达式这样的C函数,如下所示(使用SpiritParserFramework):F(A(),B(GREAT(SOME,NOT)),C(YES))为此,我尝试在以下语法上使用三个规则:templatestructInputGrammar:qi::grammar{InputGrammar():InputGrammar::base_type(){tag=(qi::char_("a-zA-Z_")>>*qi::char_("a-zA-Z_0-9"))[push_back(at_c(qi::_val),qi::_1)];command=tag[at_c(qi::_val)=at

c++ - 我如何使用 boost::spirit::qi 解析行尾?

不应该是一个简单的eol成功了吗?#include#include#include#includeusingboost::spirit::ascii::space;usingboost::spirit::lit;usingboost::spirit::qi::eol;usingboost::spirit::qi::phrase_parse;structfix:std::unary_function{fix(std::string&result):result(result){}voidoperator()(charc){if(c=='\n')result+="\\n";elseif(c

c++ - boost spirit : Lex + Qi error reporting

我正在为使用缩进等的相当复杂的配置文件编写解析器。我决定使用Lex将输入分解为标记,因为它似乎让生活更轻松。问题是我找不到任何将Qi错误报告工具(on_error)与对标记流而不是字符流进行操作的解析器一起使用的示例。要在on_error中使用的错误处理程序需要一些才能准确指示错误在输入流中的位置。所有例子都只是构造std::string从一对迭代器中打印出来。但是如果使用Lex,那么迭代器就是标记序列的迭代器,而不是字符。在我的程序中,这导致挂起std::string在我注意到无效的迭代器类型之前构造函数。据我所知,token可以将一对迭代器保存到输入流中作为它的值。这是默认属性类型

c++ - 复制或引用 boost::spirit's rule<> 的语义?

我正在尝试在Boost.Spirit中编写一个shell语言解析器。但是,我不清楚有关rules语义的一些基本问题。看文档,有rule的成员r.alias()和r.copy()。IIUC,这些成员应分别返回对规则的引用和规则内容的拷贝。但是,没有明确说明当我只是在另一个规则的定义中使用该规则时会发生什么。从我的实验中,我发现相互递归规则可以定义为:ruler1,r2;r1=...>>r2>>...;r2=...>>r1>>...;这表明规则是通过在解析器表达式中引用来获取的。问题是,当变量超出范围时它会做什么,例如:ruler1;{ruler2;r1=...>>r2>>...;r2=.

c++ - 用 boost spirit 解析一对整数

我有以下代码:std::stringtest("1.1");std::paird;boolr=qi::phrase_parse(test.begin(),test.end(),qi::int_>>'.'>>qi::int_,space,d);所以我试图解析字符串test并将结果放在std::paird中。但是它不起作用,我怀疑它与CompoundAttributeRules有关.关于如何让它工作的任何提示?编译错误如下:error:nomatchingfunctionforcallto'std::pair::pair(constint&)' 最佳答案