问题标签 [boost-spirit]

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 回答
1639 浏览

boost-spirit - 从 boost Spirit 语法获取结果(phoenix push_back 导致编译错误)

我有以下精神语法。我正在尝试struct myresult使用标准创建 AST 节点的向量,push_back(at_c<0>(qi::_val), qi::_1)但出现编译错误(见下文)。

以下是 XCode 返回的实际错误:

编辑:以下是经过修改的精神语法,可以编译和工作。有一些细微的变化需要注意,包括使用 phoenixnew_运算符并将以下语义操作添加到turtle_commands = ... [_val = _1]

0 投票
3 回答
2500 浏览

c++ - 如何使用 boost-spirit 将结果放入 STL map?

我上面的代码可以正常工作,但是太简单了,不能像这样解析代码:(enum myename {m1=1,m2=44 ,m3=89 ,m4=0 ,})。我需要两个枚举成员的名字和值。现在我决定“CPPCodeEnum::enumMembers”的替代类型

但是我不知道如何使用boost-spirit将结果放入STL map?</p>
0 投票
1 回答
4012 浏览

c++ - Boost.Spirit.Qi:获取规则的属性并将其设置为封闭规则的结构属性的字段?

就像许多其他问题一样,我正在尝试使用 Boost.Spirit.Qi 将简单的语法解析为结构树。

我将尝试将我正在尝试做的事情提炼成最简单的情况。我有:

后来,在语法结构中,我有以下成员变量:

我用它来定义

但是,当我尝试实际解析整数时,使用

myInteger.value成功解析后始终未初始化。同样,我尝试了以下定义(显然那些不编译的定义是错误的):

很明显,我对 Spirit、Phoenix 或其他东西有误解。我的理解是,当方括号中的部分作为函数对象执行时,这qi::_1是 , 的第一个属性,应该表示解析的整数。qi::int_然后我假设函数对象将采用封闭integer属性qi::_val并尝试将解析的整数分配给它。我的猜测是,由于我的BOOST_FUSION_ADAPT_STRUCT调用,两者将是兼容的,从静态分析的角度来看,这肯定是这种情况,但数据并没有被保留。

我在某处或某处缺少参考(&)名称吗?

0 投票
1 回答
491 浏览

copy - Boost::Spirit::Qi 自动规则——避免重复复制 AST 数据结构

我一直在使用 Qi 和 Karma 对几种小语言进行一些处理。大多数语法都很小(20-40 条规则)。我几乎完全可以使用自动规则,所以我的解析树完全由变体、结构和 std::vectors 组成。

此设置非常适用于常见情况:
1) 解析某些东西 (Qi),
2) 对解析树 (访问者) 进行少量操作,以及
3) 输出某些东西 (Karma)。

但是,我担心如果我想对语法树进行复杂的结构更改(例如移动大子树)会发生什么。考虑以下玩具示例:

使用自动规则的 s-expr 样式逻辑表达式的语法...

...这导致解析树表示看起来像这样...

假设我有一个看起来像这样的解析树:

(省略号的意思是“有更多类似形状的孩子pand。”)

现在,假设我想否定每个por节点,所以最终结果是:

对于每个por子树,直接的方法是:
- 创建pnot节点
(构造中的副本por);- 在节点
中重新分配适当的向量槽 (复制节点及其子树)。 pand
pnotpor

或者,我可以构建一个单独的向量,然后pand批量替换(交换)向量,从而消除第二轮复制。

与基于指针的树表示相比,所有这些似乎都很麻烦,这将允许在pnot不复制现有节点的情况下插入节点。我的问题:

有没有办法使用符合自动规则的数据结构来避免复制繁重的树操作?我是否应该硬着头皮只使用非自动规则来构建基于指针的 AST(例如,http ://boost-spirit.com/home/2010/03/11/s-expressions-and-variants/ )?

0 投票
3 回答
1463 浏览

c++ - 使用 Boost.Spirit.Lex 和 Boost.Spirit.Qi 解析“真”和“假”

作为使用 Boost.Spirit 的更大语法的第一阶段,我试图解析“true”和“false”以产生相应的布尔值,true并且false.

我正在使用 Spirit.Lex 对输入进行标记,并对整数和浮点文字(包括以宽松的科学记数法表示的文字)、公开intfloat属性有一个有效的实现。

令牌定义

测试浮点文字的解析

我的实际实现使用 Boost.Test,但这是一个独立的示例。

解析“真”和“假”

我的问题是在尝试解析“true”和“false”时。这是我正在使用的测试代码(在删除 Boost.Test 部分之后):

但编译失败:

我对此的解释是 Spirit.Qi 不知道如何将字符串转换为布尔值——当然不是这样吗?以前有没有其他人这样做过?如果是这样,怎么做?

0 投票
1 回答
1277 浏览

c++ - 如何使用 Boost::Spirit::Lex 对文件进行 lex 而不先将整个文件读入内存?

我正在考虑使用 boost::spirit::lex 编写词法分析器,但我能找到的所有示例似乎都假设您已先将整个文件读入 RAM。我想编写一个不需要整个字符串都在 RAM 中的词法分析器,这可能吗?还是我需要使用其他东西?

我尝试使用 istream_iterator,但除非我使用 const char* 作为迭代器类型,否则 boost 会给我一个编译错误。

例如,我能找到的所有示例基本上都是这样做的:

另外,是否有可能以某种方式从 lex 标记中确定行号/列号?

谢谢!

0 投票
1 回答
477 浏览

c++ - boost::spirit::qi 和乱序变量

我正在写一个词法分析器。它接受一个英文字符串,并将其转换为一组纬度/经度坐标。这有点像谷歌地球。

无论如何,我已经编写了我的符号表和语法,它正在愉快地解析格式化数据。

例如:{"North", 23.59, "East", -30.82}

这是我的语法:

其中纬度和经度是从速记罗盘方向映射到字符串的符号表(例如“e”到“East”)

所以,关于我的问题:

我想在我的语法中添加以下规则,其中纬度和经度符号位于相反的位置:

这会解析,但 degLat_ 和 degLong_ 值不会与字符串值一起反转。它们只是直接解析到结构中,而不考虑字符串标签。

当要解析的数据不连续时,如何构建结构(或 boost::fusion 向量)?

0 投票
1 回答
1518 浏览

c++ - 用增强精神解析一对整数

我有以下代码:

所以我试图解析字符串测试并将结果放在 std::pair d 中。但是它不起作用,我怀疑它与Compound Attribute Rules有关。

有关如何使其正常工作的任何提示?

编译器错误如下:

错误:没有匹配函数调用'std::pair::pair(const int&)'

0 投票
1 回答
1164 浏览

boost - 尝试编译 Spirit.Qi 解析器的问题

下面是一个完全独立的示例。问题似乎是第 84-89 行 - 如果这些行被注释掉,则示例编译。我要解析的是文件的每一行,有五个用冒号分隔的项目,最后三个项目是可选的。单个函数接受 a boost::filesystem::file,将其吸入 usingboost.interprocess并解析它。

我想要解析的示例:

a:1
a:2:c
a:3::d
a:4:::e
a:4:c:d:e

结果应该存储在 , 中vector<file_line>,并且file_line是一个有五个成员的结构,最后三个是可选的。这是代码和错误:

代码

来自 MSVC 10 的错误消息

由于问题限制为 30,000 个字符,因此我将仅在此处显示前几个。该示例应该尝试在您的机器上编译和生成相同的东西。

……剪……

0 投票
1 回答
1456 浏览

c++ - 提振精神期望失败

我想解析以下结构的向量:

我的语法如下所示:

我的 Harnass 看起来像这样:

如果我将规则规范从 kleene 星规范切换到序列匹配,则不会出现错误。

否则在尝试解析我的例句时会出现预期错误(显示在 harnass 中)。

理想情况下,我想写这样的规则dm_lines = +(data_member_line)(这也不起作用)。使用 '*' 和 '+' 运算符时发生了什么导致预期失败?但不是在匹配序列时?以及我该如何解决。