问题标签 [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 回答
955 浏览

c++ - Boost Spirit (X3) 符号表产生 UTF8 字符串

我正在尝试将 LaTeX 转义码(例如\alpha)解析为 Unicode(数学)字符(即U+1D6FC)。

现在这意味着我正在使用这个symbols解析器(规则):

这工作正常,但意味着我得到了std::u32string一个结果。我想要一种优雅的方式来将 Unicode 代码点保留在代码中(可能是为了未来的自动化)和维护原因。有没有办法让这种解析器解析成 UTF-8 std::string

我曾想过将symbols结构解析为 a std::string,但这将非常低效(我知道,过早的优化 bla bla)。

我希望有一些优雅的方法,而不是通过一堆箍来让这个工作(symbols在结果中附加字符串)。

我确实担心使用代码点值并想要 UTF8 会产生转换的运行时成本(或者是否存在constexprUTF32->UTF8 转换可能?)。

0 投票
1 回答
424 浏览

c++ - 如何让这个递归规则起作用?

我想解析(首先,只识别,保留符号)LaTeX 数学。现在,我在使用大括号和下标以及花括号时遇到了麻烦(例如a^{bc},它们的组合,我的基本a^b工作很好)。一个最小的例子(在保持可读性的同时尽可能短):

它也是Available on Coliru

问题是,这个段错误(我确信原因很明显)而且我没有其他方法可以用......表达式语法表达这个。

0 投票
1 回答
176 浏览

c++ - 解析 64 位十六进制数

我正在使用 Spirit X-3 并想解析以十六进制表示的 RAM 地址,例如“00ff0af0”。对于 64 位系统,地址的大小为 64 位。

不幸的是boost::spirit::x3::hex使用无符号。

如何使用 boost-spirit 解析 64 位十六进制数字?

0 投票
1 回答
564 浏览

c++ - Boost.Spirit 语法中的属性:来自 std:vector of boost::variant 的错误

我有一个工作解析器来读取棋盘游戏的位置描述(国际选秀,官方语法):

Live On Coliru

现在我想从合成属性中提取值,所以我围绕 Boost.Fusion 等做了样板舞,

Live On Coliru

但是,然后我收到一条错误消息

错误:static_assert 失败“属性没有预期的大小。”

和几页下来:

^ main.cpp:16:8: 注意:候选构造函数(隐式移动构造函数)不可行:第一个参数 struct num_seq { sqrs;没有从 ' std::vector<boost::variant<ast::num_rng, ast::num_pc>, std::allocator<boost::variant<ast::num_rng, ast::num_pc> > >' 到 'ast::num_seq' 的 已知转换 std::vector<rng_or_pc>};

^ main.cpp:16:8: 注意:候选构造函数(隐式复制构造函数)不可行:第一个参数 struct num_seq { sqrs;没有从 ' std::vector<boost::variant<ast::num_rng, ast::num_pc>, std::allocator<boost::variant<ast::num_rng, ast::num_pc> > >' 到 'const ast::num_seq' 的 已知转换 std::vector<rng_or_pc>};

问题:此错误来自哪里,如何解决?显然我的规则的综合属性num_seq不等于std::vector<boost::variant>>. 我该如何纠正?

0 投票
2 回答
310 浏览

c++ - Boost.Spirit 表达式未找到重载的输出运算符

这是本问答的后续内容。我现在在 a 中有几个数据结构namespace ast,细分为两个子命名空间(algebraicnumeric),它们对应于语法识别的两种不同格式。

工作解析器Live On Coliru

当我尝试为各种类型定义流式操作符时,麻烦就开始了。由于泛型operator<<采用vector<T>与各种结构相同的命名空间ast(如在链接的问答中),一切都很好。但是一旦我有两个子命名空间algebraicnumeric在这些命名空间中定义各种运算符:

Live On Coliru不再找到合适的运算符。

问题:如何定义各种流操作符以正确打印匹配的 AST?

0 投票
1 回答
841 浏览

c++ - 使用语义操作解析逗号分隔的范围和数字列表

使用Boost.Spirit X3,我想将逗号分隔的范围列表和单个数字(例如 1-4、6、7、9-12)解析为单个std::vector<int>. 这是我想出的:

给定输入

这被成功解析为(Live On Coliru):

问题:我想我明白对部件应用语义动作expandrange必要的,但为什么我还必须对部件应用语义push动作number?没有它(即有一个简单的( -(range [expand] | number) % ',')规则expr,单个数字不会传播到 AST(Live On Coliru)中:

奖励问题:我什至需要语义动作来做到这一点吗?Spirit X3 文档似乎不鼓励他们。

0 投票
1 回答
89 浏览

c++ - 注释期间和之后的AST排列

标记的 AST 节点可以在 X3 中使用annotation_base::on_success.

我可以获取他们的地址(并存储以及其他信息,例如相应的输入范围迭代器对)并parse在使用它们时依赖其不变性(对于所有人,但可能除了顶级 AST 节点,它可以在之后移动/复制)之后?

我可以假设 AST 节点已经分配了一个状态,返回时不会改变parse

AST 是聚合和 STL 容器的组合:递归树。

0 投票
1 回答
370 浏览

c++ - Spirit X3解析器启动状态?

我一直在浏览我能够找到的 Boost.Spirit X3 文档——这并不多——并认为我想将它用于我的下一个解析项目。值得注意的是,我从未使用过 Boost.Spirit Classic 或 V2,但使用过 flex/bison 和 ANTLR。

从最基本的意义上说,我要解析的格式如下所示:

仅解析“# BEGIN”和“# END”之间的文本,而其他所有内容都被完全忽略。我试图找出一种在 X3 解析器中完成此任务的有效方法。我的一些想法:

  1. 使用基本的字符串搜索函数来限制解析的范围。这似乎是最糟糕的选择,因为文本将被处理多次而不是一次处理。
  2. 查看 Spirit.Lex。同样,我发现在 Spirit.Lex 上找到任何体面的阅读材料有些困难,但似乎 Lex 提供了词法分析器启动状态,这将是处理这项工作的传统方式。顺便说一句,由于 X3 基于 C++14 并且 Spirit.Lex 构建在lexertl 之上,是否有配置选项或方法可以将 Spirit.Lex 与现代化的 lexertl14 一起使用?
  3. 也许在 X3 中有一些有意义的方法来处理这个问题?由于语法实际上非常简单,我认为拥有一个单独的词法分析器是矫枉过正的。
0 投票
1 回答
897 浏览

c++ - Boost Spirit X3 local variables and getting the synthesized attribute

I'm trying to port a parser from Spirit V2 to X3. The overall experience is quite good but there are two problems.

The first one is that local variables are gone, which is quite inconvenient to me since I used them quite often to keep track of things. Hence I'm asking for something that would do the job of locals in V2.

The other one is best illustrated with this dummy example: I want to parse a comma separated list of integers into a vector<int>, but it should only parse when the list sums up to zero:

#xA;

I'm stuck with the last checking here as I don't know how to get my hands on the vector<int> the rule is synthesizing.

0 投票
1 回答
2120 浏览

c++ - Boost Spirit X3 跳过解析器实现?

对于我使用 X3 解析的当前语法,空格和 Perl 样式的注释将被忽略。

在我看来,X3 中的跳过解析器只是一个普通的解析器,它消耗的任何输入都被认为是“跳过的”。我想出了这个:

在解析一个非常基本的输入(一对注释行和一个引用字符串行)时,这似乎运作良好。(住在科利鲁

但是,由于我找不到任何有关此事的文档,并且当前跳过解析器的详细信息都隐藏在复杂的模板系统中,我希望得到一些输入。

  1. 这是定义“跳过解析器”的正确方法吗?有标准方法吗?
  2. 这样的实现是否存在性能问题?将如何改进?

我之前在 SO 中搜索了详细信息,并使用 Qi(带有 Boost::Spirit 的 Custom Skip Parser)找到了答案。因为我从来没有学过气,很多细节都很难理解。我上面描述的方法似乎更直观。