问题标签 [boost-spirit-x3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Spirit X3 编译错误“模板声明不能出现在块范围内”
我正在尝试一个小例子来开始使用 Spirit X3。
我得到以下编译器错误:
问题是我认为BOOST_SPIRIT_DEFINE但我不知道如何解决它。
c++ - x3::symbols 移动结果,因此将其从 symbol_parser 本身中删除
因此,我在 boost::spirit::x3 中遇到了 boost::spirit::x3 的奇怪行为,如 boost 1.59 中提供的:
我通过以下方式定义了一个“动态”符号表:
OpCode
定义为
现在,在解析输入字符串时,将符号表嵌入到必要的规则中,例如
结果 ast 仅包含第一个mov
及其操作数。缺少第二个 mov 但操作数已正确解析。在打印生成的 AST 时,这可能如下所示:
使用调试器,我在 symbols.hpp 中找到了错误的来源symbol_parser::parse()
:
与move_to
蜜蜂:
如您所见,src
我在 symbol_parser 中添加的 OpCode 实例已被移动。这意味着在第一次调用它之后再次为空,这就是为什么只出现第一条指令。简单地说,它已从符号表中移出。
现在最后我的问题是: 这是一个错误还是我犯了一个错误?
c++ - Spirit X3 with boost::string_ref construction from semantic action
im confused with boost Spirit X3 and string_ref class. How to construct a string_ref object. The console prints somethink like this :
I dont know how to translate it to "normal type name" but it seems to me that i need to create the string_ref from a boost iterator range ?
And the rule is :
c++ - Spirit X3 没有调用“move_to”的匹配函数
为什么这不编译?(评论r3
会编译,但我想在规则中使用分号)
c++ - 如何用 boost Spirit x3 用位置信息注释 AST?
所以,我已经编写了我的语法,并想提供一些调试信息,比如行号,以便能够使用我自己的调试器单步执行生成的可执行代码。
经过一番谷歌搜索后,我发现可以完全定义规则中使用的标记类,如下所示:
在这个完全定义的标记类中,可以实现一个 on_success 方法,当规则可以成功匹配时调用该方法。所以我为匹配一行代码的规则实现了标记类。但是由于我找不到从 Spirit 中获取当前行号的方法,所以我求助于一个静态变量来跟踪当前行。问题是要知道何时重置线路计数器,正如您在我相当愚蠢的尝试中看到的那样。
这似乎是一种非常复杂的方法来跟踪行号,因此必须有更好的方法。
现在的问题是,获取当前行号的最佳或正确方法是什么?
谢谢阅读!
c++ - 如何在 Boost Spirit X3 中进行“流”解析?
我试图找出从istream
使用 x3 解析的正确方法。较旧的文档引用了multi_pass
一些东西,我还可以使用它吗?或者是否有其他方法可以为 X3 缓冲流以便它可以回溯?
c++ - Boost.Spirit.x3 避免将相同类型的两个连续属性折叠成一个向量
我正在尝试学习 Boost.Spirit,但我发现了一个困难。
我正在尝试将字符串解析为以下结构:
并且似乎当具有相同类型的两个属性背靠背时,它们(逻辑上)折叠std::vector
为该类型的 a。由于该规则,以下解析器
将具有 的属性std::vector<std::string>
。
但是我试图将 this 解析为 that struct
,这意味着对我来说理想的属性是 a boost::fusion::tuple<std::string, std::string>
,所以我可以调整我的结构来适应它。
不工作代码的完整版本(上面引用):
此代码触发static_assert
告诉我我的属性不正确:
随着指挥
(它在 GCC 下也失败了)。
我试过的
我找到了解决这个问题的方法,但它很混乱,我不敢相信这是最干净的方法:
我真的不喜欢那个解决方案:它有点破坏了精神的惊人表现力并使它变得超级丑陋,而且如果我想在employee
结构中添加新字段,那么我必须添加一个额外的 lambda,而不仅仅是更新我的BOOST_FUSION_ADAPT_STRUCT
,这要容易得多。
所以问题是:有没有办法(希望)干净地将两个相同类型的连续属性从std::vector
and 拆分为 a boost::fusion::vector
?
提前感谢您走到这一步;)。
c++ - 使用 boost spirit X3 高效解析琐碎文件
我是 C++ 和 Boost Spirit X3 的新手。对于我的项目,我将具有以下结构的两个文件中的地理社交图与 boost spirit X3 解析为一个 boost 图。
我有一个有效的实现。由于我之前对这些库没有任何经验,我想知道您对这种方法的看法以及您是否建议采用不同的方法。
在图形文件中,每条边都有一条线。在解析边缘时,我必须创建图形的节点,以防之前没有看到节点。我使用语义操作来检查每次遇到节点 ID,如果该节点已经在图中。读完一整行后,我使用了一个语义动作,然后添加了边缘。
在位置文件中,在给定时间节点的每个已知位置都有一行。我存储图中节点的第一个已知位置(使用自定义提升图属性)。
我必须提出具体问题,但很乐意收到任何想法和建议:
- 可以像对图形文件那样使用嵌套语义操作吗?这会影响性能吗?
- 是否建议使用 Spirit X3 一次解析整个文件,还是应该使用 Spirit X3 单独解析每一行?
图(表示图中的边)
地点
Spirit X3解析代码
X3 调用的语义动作
升压图
c++ - boost::spirit::x3 属性兼容性规则,直觉还是代码?
是否有文档描述了各种 spirit::x3 规则定义操作如何影响属性兼容性?
我很惊讶:
无法移动到融合适应的结构中:
暂时我去掉了第一个强制的字母字符,但我还是想表达一个规则,定义名称字符串必须以字母开头。这是我需要尝试添加eps
直到它起作用的情况之一,还是有说明上述方法不起作用的原因?
我很抱歉,如果这已经被写在某个地方,我找不到它。
c++ - 用升压精神 x3 编译时间
我正在尝试使用新的 Spirit X3(提升 1.61.0)。
我的机器是运行 Linux 的 MacBook Pro (i7-4750HQ)。
使用过 Spirit 的第 2 版后,我习惯了大的编译时间,但这感觉不对。对于表达式解析器的以下第一步,编译需要 20 秒。
我以为X3会更快,所以这合理吗?我的代码不是最优的吗?
编译器设置(clang 3.8.0)
代码: