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

c++ - 存储在变量模板特化中的 Spirit-X3 解析器不适用于 Clang

我有一个可以工作的 Spirit-X3 解析器,它可以解析两个密切相关的语法来设置草稿和检查器的位置。我定义了两个变量模板特化作为语法的两种方言的解析器:

此代码编译并正确解析我在 Clangg++上的测试输入。

由于两个变量模板特化依赖于完全相同形式的模板参数,我想将它们合并到一个通用变量模板中:

这也为g++正确编译和解析。它也为 Clang 编译,但它只能正确解析我在Wandbox上的输入,而不是在Coliru上。在我自己的开发盒上,使用来自apt.llvm.org的 clang-3.8.0 ,我得到了与 Coliru 相同的错误行为。

问题:Clang 中是否存在变量模板专业化的错误?如何以与 Wandbox 相同的方式配置 Clang 以解决该错误?或者它是某种与 Spirit-X3 相关的错误?

0 投票
2 回答
615 浏览

c++ - Boost.x3:属性在备选方案之间累积

我有一个解析器用于解析标识符foo, bar, baz,一个解析器也解析嵌套标识符,foo::bar, foo::bar.baz, foo::bar.baz.baham 它们都解析为相同的 ast 结构,如下所示:

an 的解析器identifier如下所示:

对于nested_identifier这样的:

我知道我为宏感到羞耻。标识符解析器工作正常,但是 nested_identifier如果我尝试解析像foo::bar::bazast 对象这样掉出解析器的东西,它有一个奇怪的行为,它有所有的命名空间,在这种情况下foo和向量bar中的两次。namespaces我在 这里有一个这种奇怪行为的小例子。谁能解释我为什么会发生这种情况,以及如何避免这种情况?

0 投票
0 回答
122 浏览

boost - 是否可以推断 Spirit X3 语法的(预期)属性的类型?

我有这个典型的 Spirit 代码。

我想知道是否可以从语法中推断出预期属性的类型?

就像是

推断boost::fusion::vector<double, double>

我发现了这个http://boost-spirit.com/home/2010/01/31/what-is-the-attribute-type-exposed-by-a-parser/但它不起作用x3或者我不是包括正确的标题。

0 投票
0 回答
77 浏览

c++ - 序列解析器属性错误

我尝试了精神 x3 文档中的以下示例

我得到的错误是

如果我更改p为 typedouble它会编译并匹配2.0。这显然不是我的本意。我尝试使用多个版本的 gcc(4.9、6.2、trunk)和 boost 版本 1.61.0。我觉得这应该是配置问题,除非有人在代码中发现错误。

是否有人经历过类似的事情并知道问题出在哪里?

0 投票
1 回答
319 浏览

c++ - 解析一对字符串失败。坏精神x3语法

我想解析键值对,将字符串映射到字符串。因为我想支持{ ... }右手边的块,所以我想出了一个简单的语法开始

但它无法组合编译,除非我将表达式的属性更改为std::string

我得到错误

位于

如果尝试以下表达式,也会发生同样的事情

几天后我就来了,但不知道如何正确地做到这一点。我感谢任何帮助... :^)

使用 boost-1.60{-62} 和 gcc 6.1.1、6.2 和较新的主干版本对其进行了测试。

0 投票
1 回答
528 浏览

c++ - 使用 boost spirit x3 解析为递归变体的问题

我目前正在尝试x3::variant使用 boost spirit x3 解析为 . 变体看起来像:

其中 LambdaType 和 ClassType 看起来像:

如果我尝试解析为 Type 或这些结构之一,则会收到编译器错误,告诉我无法将 a 分配const boost::spirit::x3::char_classType,我对此感到困惑,因为我不想分配 a const boost::spirit::x3::char_class。我在这里有一个活生生的例子,它有一个解析器,当你尝试编译它时,它会显示问题和错误。我试图解决这个问题一整天,我现在不知道为什么这不起作用。对于这方面的任何帮助,我将不胜感激。

0 投票
1 回答
669 浏览

c++ - 消除精神x3解析器规则中的左递归

我目前坚持使用 boost spirit x3 解析的规则。这是我要解析的 EBNF(使用精神中的 % 运算符作为列表):

使用 boost spirit x3,我试图解析为以下结构/变体:

我有一个我目前在这里尝试的活生生的例子,但它不起作用,我还尝试更改变体解析器的顺序,这没有帮助,我得到无休止的递归,或者不是我期望的行为(或希望)。

谁能帮我调试这个解析器?

我想我在解析器中有某种​​类型的左递归,有没有机会避免这种情况,或者没有机会重写语法?这个语法甚至可以用 boost spirit x3 解析吗?

编辑:

我设法消除了这个语法中的左递归。现在语法如下:

但是现在有下一个问题,我怎样才能让 boost spirit x3 将这些规则解析为给定的结构?我无法想象解析器现在返回A的是什么,解析器应该解析成一个结构,但取决于解析成的内容,现在这不是必需的。所以现在的问题是,我怎样才能得到一个非左递归解析器,它使用 boost-spirit-x3 将上面的语法解析成我的结构?one_arg_lambdaone_arg_lambdaLambdaTypeA

编辑二:

我想=>成为正确的联想所以foo => bar => baz => baham
意味着foo => (bar => (baz => bahama))

0 投票
1 回答
242 浏览

c++ - 有限制的 boost spirit x3 双解析器

我目前正在使用 boost spirit x3 和这个解析器解析双打:

boost::spirit::x3::real_parser<double, x3::strict_real_policies<double> > const strict_double = {};

但它也会解析双精度数.356356.我想避免这种情况,而是让用户编写0.356and 356.0。我怎样才能对这个现有的解析器应用这样的限制?有没有办法不从头开始编写我自己的双解析器?

0 投票
0 回答
264 浏览

c++ - 使用 boost spirit x3 将函数调用解析为表达式

我目前正在使用 boost spirit X3 开发 DSL。我正在使用这个示例来实现表达式和运算符层次结构,并避免表达式解析器中的左递归。我还想.为成员访问[]实现 -operator,为索引访问(例如数组)实现 -operator,并且由于 DSL 将是一种函数式语言,我想实现函数调用,即()-operator,也作为运算符,因为每个表达式都可以返回一个函数,所以()- 运算符应该适用于任何其他表达式。我想解析的结构看起来像这样:

我能够为[]-operator.-operator使用以下规则创建解析器(查看 EDIT 中的 mcve):

现在我正在尝试对函数调用做同样的事情,但我无法做到这一点,也index_access_expr没有data_access_expr优先级,我怎样才能让这两个规则具有优先级以及如何将函数调用实现为运算符表达式,也可以使用相同的优先级?

编辑:是一个关于我如何使用index_access_exprand的 mcve data_access_expr。在此示例中,我想添加()-operator, 并且希望三个运算符具有相同的优先级。

编辑二:是另一个 mcve,关于我如何厌倦将函数调用实现为表达式,但就像您在示例中看到的那样,它根本不起作用。我的方法是添加std::vector<Expression>Operand变体中,然后尝试像这样添加函数调用解析器:

这根本不起作用,看看我在 中的测试,main操作员层次结构问题仍然存在。

0 投票
2 回答
280 浏览

c++ - 内部编译器错误,同时使用 boost spirit x3

我目前正在使用 boost spirit X3 为我的 DSL 实现表达式和运算符层次结构。

我认为我的解析器在语义上是正确的,但是当我尝试编译它时,在编译时,gcc 和 clang 具有巨大的内存占用,编译了无限的时间,然后以“g++:内部编译器错误:被杀死(程序 cc1plus )”。

我试图最小化表达式解析器周围的代码,但它在某种程度上并不是那么微不足道

是一个演示。

有人可以告诉我我在这里做错了什么,还是这是一个错误?

编辑:我认为问题出在某个地方:

如果我更改(idx|func|data)(idx|func),它也会永远编译并使用多达 16GB 的内存,但 gcc 能够编译它,并且解析器可以正常工作。

编辑二:请查看上面的链接,这是导致错误的示例。