问题标签 [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.
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]
c++ - 如何使用 boost-spirit 将结果放入 STL map?
我上面的代码可以正常工作,但是太简单了,不能像这样解析代码:(enum myename {m1=1,m2=44 ,m3=89 ,m4=0 ,})。我需要两个枚举成员的名字和值。现在我决定“CPPCodeEnum::enumMembers”的替代类型
但是我不知道如何使用boost-spirit将结果放入STL map?</p>c++ - Boost.Spirit.Qi:获取规则的属性并将其设置为封闭规则的结构属性的字段?
就像许多其他问题一样,我正在尝试使用 Boost.Spirit.Qi 将简单的语法解析为结构树。
我将尝试将我正在尝试做的事情提炼成最简单的情况。我有:
后来,在语法结构中,我有以下成员变量:
我用它来定义
但是,当我尝试实际解析整数时,使用
myInteger.value
成功解析后始终未初始化。同样,我尝试了以下定义(显然那些不编译的定义是错误的):
很明显,我对 Spirit、Phoenix 或其他东西有误解。我的理解是,当方括号中的部分作为函数对象执行时,这qi::_1
是 , 的第一个属性,应该表示解析的整数。qi::int_
然后我假设函数对象将采用封闭integer
属性qi::_val
并尝试将解析的整数分配给它。我的猜测是,由于我的BOOST_FUSION_ADAPT_STRUCT
调用,两者将是兼容的,从静态分析的角度来看,这肯定是这种情况,但数据并没有被保留。
我在某处或某处缺少参考(&)名称吗?
copy - Boost::Spirit::Qi 自动规则——避免重复复制 AST 数据结构
我一直在使用 Qi 和 Karma 对几种小语言进行一些处理。大多数语法都很小(20-40 条规则)。我几乎完全可以使用自动规则,所以我的解析树完全由变体、结构和 std::vectors 组成。
此设置非常适用于常见情况:
1) 解析某些东西 (Qi),
2) 对解析树 (访问者) 进行少量操作,以及
3) 输出某些东西 (Karma)。
但是,我担心如果我想对语法树进行复杂的结构更改(例如移动大子树)会发生什么。考虑以下玩具示例:
使用自动规则的 s-expr 样式逻辑表达式的语法...
...这导致解析树表示看起来像这样...
假设我有一个看起来像这样的解析树:
(省略号的意思是“有更多类似形状的孩子pand
。”)
现在,假设我想否定每个por
节点,所以最终结果是:
对于每个por
子树,直接的方法是:
- 创建pnot
节点
(构造中的副本por
);- 在节点
中重新分配适当的向量槽
(复制节点及其子树)。 pand
pnot
por
或者,我可以构建一个单独的向量,然后pand
批量替换(交换)向量,从而消除第二轮复制。
与基于指针的树表示相比,所有这些似乎都很麻烦,这将允许在pnot
不复制现有节点的情况下插入节点。我的问题:
有没有办法使用符合自动规则的数据结构来避免复制繁重的树操作?我是否应该硬着头皮只使用非自动规则来构建基于指针的 AST(例如,http ://boost-spirit.com/home/2010/03/11/s-expressions-and-variants/ )?
c++ - 使用 Boost.Spirit.Lex 和 Boost.Spirit.Qi 解析“真”和“假”
作为使用 Boost.Spirit 的更大语法的第一阶段,我试图解析“true”和“false”以产生相应的布尔值,true
并且false
.
我正在使用 Spirit.Lex 对输入进行标记,并对整数和浮点文字(包括以宽松的科学记数法表示的文字)、公开int
和float
属性有一个有效的实现。
令牌定义
测试浮点文字的解析
我的实际实现使用 Boost.Test,但这是一个独立的示例。
解析“真”和“假”
我的问题是在尝试解析“true”和“false”时。这是我正在使用的测试代码(在删除 Boost.Test 部分之后):
但编译失败:
我对此的解释是 Spirit.Qi 不知道如何将字符串转换为布尔值——当然不是这样吗?以前有没有其他人这样做过?如果是这样,怎么做?
c++ - 如何使用 Boost::Spirit::Lex 对文件进行 lex 而不先将整个文件读入内存?
我正在考虑使用 boost::spirit::lex 编写词法分析器,但我能找到的所有示例似乎都假设您已先将整个文件读入 RAM。我想编写一个不需要整个字符串都在 RAM 中的词法分析器,这可能吗?还是我需要使用其他东西?
我尝试使用 istream_iterator,但除非我使用 const char* 作为迭代器类型,否则 boost 会给我一个编译错误。
例如,我能找到的所有示例基本上都是这样做的:
另外,是否有可能以某种方式从 lex 标记中确定行号/列号?
谢谢!
c++ - boost::spirit::qi 和乱序变量
我正在写一个词法分析器。它接受一个英文字符串,并将其转换为一组纬度/经度坐标。这有点像谷歌地球。
无论如何,我已经编写了我的符号表和语法,它正在愉快地解析格式化数据。
例如:{"North", 23.59, "East", -30.82}
这是我的语法:
其中纬度和经度是从速记罗盘方向映射到字符串的符号表(例如“e”到“East”)
所以,关于我的问题:
我想在我的语法中添加以下规则,其中纬度和经度符号位于相反的位置:
这会解析,但 degLat_ 和 degLong_ 值不会与字符串值一起反转。它们只是直接解析到结构中,而不考虑字符串标签。
当要解析的数据不连续时,如何构建结构(或 boost::fusion 向量)?
c++ - 用增强精神解析一对整数
我有以下代码:
所以我试图解析字符串测试并将结果放在 std::pair d 中。但是它不起作用,我怀疑它与Compound Attribute Rules有关。
有关如何使其正常工作的任何提示?
编译器错误如下:
错误:没有匹配函数调用'std::pair::pair(const int&)'
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 个字符,因此我将仅在此处显示前几个。该示例应该尝试在您的机器上编译和生成相同的东西。
……剪……
c++ - 提振精神期望失败
我想解析以下结构的向量:
我的语法如下所示:
我的 Harnass 看起来像这样:
如果我将规则规范从 kleene 星规范切换到序列匹配,则不会出现错误。
否则在尝试解析我的例句时会出现预期错误(显示在 harnass 中)。
理想情况下,我想写这样的规则dm_lines = +(data_member_line)
(这也不起作用)。使用 '*' 和 '+' 运算符时发生了什么导致预期失败?但不是在匹配序列时?以及我该如何解决。