问题标签 [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.

0 投票
1 回答
2402 浏览

c++ - Spirit X3 编译错误“模板声明不能出现在块范围内”

我正在尝试一个小例子来开始使用 Spirit X3。

我得到以下编译器错误:

问题是我认为BOOST_SPIRIT_DEFINE但我不知道如何解决它。

0 投票
1 回答
171 浏览

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 实例已被移动。这意味着在第一次调用它之后再次为空,这就是为什么只出现第一条指令。简单地说,它已从符号表中移出。

现在最后我的问题是: 这是一个错误还是我犯了一个错误?

0 投票
1 回答
267 浏览

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 :

0 投票
1 回答
470 浏览

c++ - Spirit X3 没有调用“move_to”的匹配函数

为什么这不编译?(评论r3会编译,但我想在规则中使用分号)

0 投票
0 回答
1281 浏览

c++ - 如何用 boost Spirit x3 用位置信息注释 AST?

所以,我已经编写了我的语法,并想提供一些调试信息,比如行号,以便能够使用我自己的调试器单步执行生成的可执行代码。

经过一番谷歌搜索后,我发现可以完全定义规则中使用的标记类,如下所示:

在这个完全定义的标记类中,可以实现一个 on_success 方法,当规则可以成功匹配时调用该方法。所以我为匹配一行代码的规则实现了标记类。但是由于我找不到从 Spirit 中获取当前行号的方法,所以我求助于一个静态变量来跟踪当前行。问题是要知道何时重置线路计数器,正如您在我相当愚蠢的尝试中看到的那样。

这似乎是一种非常复杂的方法来跟踪行号,因此必须有更好的方法。

现在的问题是,获取当前行号的最佳或正确方法是什么?

谢谢阅读!

0 投票
1 回答
751 浏览

c++ - 如何在 Boost Spirit X3 中进行“流”解析?

我试图找出从istream使用 x3 解析的正确方法。较旧的文档引用了multi_pass一些东西,我还可以使用它吗?或者是否有其他方法可以为 X3 缓冲流以便它可以回溯?

0 投票
1 回答
415 浏览

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::vectorand 拆分为 a boost::fusion::vector

提前感谢您走到这一步;)。

0 投票
1 回答
1156 浏览

c++ - 使用 boost spirit X3 高效解析琐碎文件

我是 C++ 和 Boost Spirit X3 的新手。对于我的项目,我将具有以下结构的两个文件中的地理社交图与 boost spirit X3 解析为一个 boost 图。

我有一个有效的实现。由于我之前对这些库没有任何经验,我想知道您对这种方法的看法以及您是否建议采用不同的方法。

在图形文件中,每条边都有一条线。在解析边缘时,我必须创建图形的节点,以防之前没有看到节点。我使用语义操作来检查每次遇到节点 ID,如果该节点已经在图中。读完一整行后,我使用了一个语义动作,然后添加了边缘。

在位置文件中,在给定时间节点的每个已知位置都有一行。我存储图中节点的第一个已知位置(使用自定义提升图属性)。

我必须提出具体问题,但很乐意收到任何想法和建议:

  • 可以像对图形文件那样使用嵌套语义操作吗?这会影响性能吗?
  • 是否建议使用 Spirit X3 一次解析整个文件,还是应该使用 Spirit X3 单独解析每一行?

图(表示图中的边)

地点

Spirit X3解析代码

X3 调用的语义动作

升压图

0 投票
1 回答
644 浏览

c++ - boost::spirit::x3 属性兼容性规则,直觉还是代码?

是否有文档描述了各种 spirit::x3 规则定义操作如何影响属性兼容性?

我很惊讶:

无法移动到融合适应的结构中:

暂时我去掉了第一个强制的字母字符,但我还是想表达一个规则,定义名称字符串必须以字母开头。这是我需要尝试添加eps直到它起作用的情况之一,还是有说明上述方法不起作用的原因?

我很抱歉,如果这已经被写在某个地方,我找不到它。

0 投票
2 回答
988 浏览

c++ - 用升压精神 x3 编译时间

我正在尝试使用新的 Spirit X3(提升 1.61.0)。

我的机器是运行 Linux 的 MacBook Pro (i7-4750HQ)。

使用过 Spirit 的第 2 版后,我习惯了大的编译时间,但这感觉不对。对于表达式解析器的以下第一步,编译需要 20 秒。

我以为X3会更快,所以这合理吗?我的代码不是最优的吗?

编译器设置(clang 3.8.0)

代码: