boost-spirit相关内容
我的问题实际上很简单.我目前正在开发一种语言解析器,可以解析具有嵌入式DSL的元语言.这对我来说很有趣,因为它可以解析具有HTML和嵌入式JavaScript/CSS的网站.我想针对特定用例设计具有最少DSL的类似系统. boost :: spirit是否有能力做类似的事情?我只是不知道boost :: spirit是如何处理词法分析器生成的,或者甚至是无扫描器的解析器. 提前谢谢!
..
我对《 Spirit Qi》中的序列运算符和语义动作有疑问. 我正在尝试为一个浮点数定义一个语法规则,该浮点数接受度量前缀(u,m,k,M等)以及正常的指数形式. rule sign = char_("+-") [ _val = _1 ]; rule exp = char_("e
..
对于我的快速解析器项目,我想像转义一样使用CSV:""转义" 示例: "\"hello\"", " \" hello \" ", " \" hello \"\"stranger\"\" \" ", 在线编译和尝试: https://wandbox.org/permlink/5uchQM8guIN1k7aR > 我当前的解析规则仅解析前两个测试 qi::
..
我想使用Boost Spirit将文件解析为AST. 我的AST的根是只有一个属性的类: typedef boost::variant FirstLevelBlock; struct Program { std::vector blocks; };
..
我一直在阅读语义动作,并且有一条规则如下: property_rule %= identifier_rule % ',' >> lit(L":") >> type_specification_rule >> -(lit(L":=") >> +(alnum - ';')) >> lit(L";"); property_rule定义为 qi:
..
当期望解析器失败时,如何避免引发异常? 我有一条规则"function" > (!x3::lexeme[keyword >> !(x3::alnum | '_')] >> symbol) > ('(' > -lvalue_list > ')') > statements > "end"来解析如下代码: function a() return one end keyword s是(z
..
如果我有递归规则来解析括号,请使用boost :: spirit rule term; term %= string("(") >> *term >> string(")"); 如何限制最大递归量?例如,如果我尝试解析一百万个嵌套括号,则会出现段错误,因为已超出堆栈大小.具体来说,这是一个完整的示例. #i
..
我想解析CSS颜色函数(为简单起见,所有参数都是0到255之间的数字) rgb(r,g,b) rgba(r,g,b,a) hsl(h,s,l) hsla(h,s,l,a) 进入 struct color { color(std::uint8_t r, std::uint8_t g, std::uint8_t b, std::uint8_t a) : red{r}, gree
..
我想将幂运算符添加到 Boost精神示例中提供的表达语法. BNF语法如下:(例如,请参见以下答案:“求幂运算的明确语法" ) E -> E + T | E - T | T T -> T * F | T / F | X X -> X ^ Y | Y Y -> i | (E) 我这样翻译成Boost精神: template str
..
在我的语义动作中,我不仅试图打印出已解析的内容.但是,语义动作函数应该创建一个新对象,而该对象又应该是解析器创建的值. 让我们承担以下任务: 解析器应该将地址/引用传递给对象 typedef std::pair, std::map > mappin
..
此代码无法编译(gcc 5.3.1 + boost 1.60): #include namespace x3 = boost::spirit::x3; template void parse(T begin, T end) { auto dest = x3::lit('[') >> x3::int_
..
下面是booster spirit文档中的employee.cpp源文件.它是“结构雇员",后跟一个宏,该宏告诉有关“结构雇员"的融合,然后是雇员解析器. 我正在尝试为此目的进行调整,但我不想使用“结构型员工",而是希望使用许多类来代替“结构型员工". 我正在尝试尝试将"struct employee"替换为类,但是我没有看到宏在融合中做到这一点吗?我不想将其放入struct的原因是因
..
(1)说我们要解析一个由{}包围的简单递归块. { Some text. { { Some more text. } Some Text again. {} } } 此递归解析器非常简单. x3::rule const ruleBlock
..
我正在尝试创建一个规则,该规则返回通过引用Phoenix表达式构造的function.例如, start = int_[_val = xxx]; rule start; xxx应该是什么,以便解析字符串"5"应该给我一个函数,该函数给我输入的第五个字符?我已经尝试过像la
..
我刚刚开始研究Boost :: Spirit,目前是最新版本-V2.4. 我的问题的实质是: 我想解析"1a2" 或"3b4"之类的字符串. 因此,我使用的规则是: (double_ >> lit('b') >> double_) | (double_ >> lit('a') >> double_); 规则的属性必须为"vector".我正在将其读取到容器中.
..
我在指定和解析一个相当简单的语法时遇到了一些问题. vertex = char+ edge = vertex " -> " vertex start = ((vertex | edge) eol)* input = "a\nb\na -> b\n" Spirit正在执行以下操作: "a" -> vertex "\n" -> eol -> start "b" -> vertex
..
假设我有一个语法定义如下: some_rule := a b [c [d]] 其中,c和d是可选的,如果未指定,则默认为特定值(假设为14).如果未提供该值,我可以将其默认设置为14吗?我希望生成的std::vector总是大小为4. 我来的最接近的东西是这样的: qi::rule(), ascii::space_type
..
我正在尝试从boost :: spirit规则定义的操作中引用一个(尚未)未知实例的成员,所以在伪代码中, 而不是 double_ [ref(rN)= _1] 我正在寻找类似的东西 X ** ppx; double_ [ref(& X :: rN,ppx)= _1] 一种解决方法可能是一个简单的“语义动作",其中包含一个知道实例并能够写入实例的参数,例如 qi::rule
..
我需要将double值格式化为具有非常特定格式的坐标字符串,"DDMMSS.SSX"其中: "DD"是全学位 "MM"是完整的分钟数 "SS.SS"是带分数的秒数 "X"取决于半球是"N"还是"S" 字段必须用零填充.不能接受空格.格式示例如下: 47.2535 ==> "471512.45N" -0.123345 ==> "000724.04S" 我设法创建了完成该任
..
我正在将手写的解析器迁移到Boost.Spirit(2.5.4).第一印象是积极的,但是由于我使用的是C ++ 17,因此X3似乎是一个非常有吸引力的选择. 幸运的是,有关X3的资源很多: 许多有关Stackoverflow上X3的问题 关于在YouTube上有关X3的视频 一个在线文档 但是: Boost.Org上没有任何内容,给人的印象是,尽管Spirit X3是Bo
..