不急于提升灵气的克莱恩星
Non eager Kleene star in boost spirit qi
我试图执行以下操作来解析一些"a",然后解析一个"a":
*(lit("a")) >> lit("a")
不幸的是,Kleene明星在boost::spirit::qi中*
急切地消耗了所有的"a",之后没有回溯,最后的lit(a)
无法匹配任何东西。
当然,使用(例如)grep
,以下内容将起作用:
$ echo "aaa" | grep "a*a"
aaa
在这里解决气行为的最佳方法是什么?我知道回溯会搞砸语义操作,所以让我们假设 qi 仅用于在 AST 中存储属性。
使用+
而不是 *
并不能解决我的问题;例如,假设我有一个解析器ignore_int_
解析整数但不产生任何属性,那么我可能想要使用:
*ignore_int_ >> int_
仅存储最后一个整数。
你只能提前否定断言:
*(graph - 'z') >> 'z'
在这里,graph
将匹配,除非遇到 z。如果您在输入/表达式结束时需要它,请考虑例如
*(graph - (graph >> eoi)) >> graph >> eoi
或
*(!(graph >> eoi) >> graph) >> graph >> eoi
简而言之,你需要一个积极的前瞻性来"断言"。隐式断言不会让你得到你所期望的回溯,因为Spirit是一个PEG解析器生成器,而不是一个正则表达式匹配器。
相关文章:
- 莱克斯没有返回我想要的东西
- 如何在 C/C++ 中运行阿克曼函数而不会出错?
- 康斯坦特还行,但不是康特克斯普尔?
- 增强精神解析器:绕过贪婪的克莱恩*
- 在运行时找不到共享对象.克尔普克
- 快板不与克里昂合作(0xC000007B)
- 我同时使用了莱布尼茨和瓦利斯公式来估算π但输出数字错误,我不知道我哪里出错了
- C++记忆霍夫莱恩斯·
- C++ 如何实现双倍权重(而不是整数)的克鲁斯卡尔定理
- 提升灵气:省略克莱恩星辰解析器中的元素
- 克洛克沃恩.无符号字符上的签名位
- 犰狳 : 找不到克拉帕克
- 霍夫莱恩不工作
- 精神莱克斯->气语法问题
- 普吉克斯姆.如何从节点获取所有子结构,如果事先不知道它的位置
- 不急于提升灵气的克莱恩星
- 图书馆访问比格尔骨黑(3.8 克恩 - 埃)
- 提升::精神::莱克斯;如何指定令牌"||"?
- 提升::精神::业力:复制在重复或克莱恩星中不起作用?
- 德克 - 为什么"储备"不存在?