boost-spirit相关内容
edit :我已经删除了词法分析器,因为它没有与 Qi 完全集成并且只是混淆了语法(请参阅下面的答案). 我的词法分析器如下所示: template 结构标记:lex::lexer{令牌(): left_curly("\"{\""),right_curly("\"}\""),left_paren("\"(\""),right_paren("\")\""),冒号(":"),冒号(";"),n
..
可以通过二进制-(减号)运算符创建“差异"解析器: rule = qi::char_ - qi::lit("}}") 甚至复合差异: rule = qi::char_ - qi::lit("}}") - qi::lit("]]") 但是我怎么能在解析时生成差异解析器的整个结果? 我猜它可能是某种形式,如下所示: phoenix::function差异解析器;规则 = qi::lazy(
..
我的目标是让我的 qi::grammar 返回一个属性.不过,我在使用 spirit::lexer 时遇到了很大的困难. 我希望使用下面给定的语法,如果我用 spirit::qi::parse(begin, end,grammar, output); 调用它,structident 输出 将包含已解析词素的内容. 错误似乎主要是从这一行流出:start %= lexer.identif
..
是否有文档描述了各种 Spirit::x3 规则定义操作如何影响属性兼容性? 我很惊讶: x3::lexeme[ x3::alpha >*(x3::alnum | x3::char_('_')) ] 无法移动到融合适应的结构中: 结构名称{std::string 值;}; 暂时去掉了第一个强制字母,但我还是想表达一个规则,定义名称字符串必须以字母开头.这是我需要尝试添加 eps 直到
..
[看来我的解释和期望都不是很清楚,所以我在帖子末尾添加了我希望如何使用该功能的精确性] 我目前正在使用 boost qi 研究语法.我有一个规则的循环构造,因为我需要从向量的元素构建它.我用简单的类型重写了它,它看起来像: #include //使用 boost 1.43.0#include #include #include 命名空间 bqi = boost::spirit::qi;ty
..
我看过一些与 qi 语法中关键字/标识符使用的细微差别相关的帖子,但我不太明白 boost 示例中演示的方法应该如何工作...... 关键字声明: qi::symbols关键词; 示例关键字集: keywords.add(“富")(“酒吧"); 标识符规则声明: qi::rule标识符; 以下是 qi calc 和编译器示例中标识符规则的定义方式: identifier = !
..
来自 Boost Spirit X3 教程: 首先,让我们创建一个代表员工的结构体: namespace client { namespace ast{结构员工{年龄;std::string 姓氏;std::string 名;双薪;};}} 然后,我们需要将我们的员工结构告诉 Boost.Fusion 以使其成为语法可以利用的一流融合公民. BOOST_FUSION_ADAPT_STR
..
我尝试学习使用 boost::spirit.为此,我想创建一些简单的词法分析器,将它们组合起来,然后开始使用精神进行解析.我尝试修改示例,但它没有按预期运行(结果 r 不正确). 这是词法分析器: #include 命名空间 lex = boost::spirit::lex;模板 struct lexer_identifier : lex::lexer{lexer_identifier()
..
是否可以(使用 Boost::Spirit::QI)从逗号分隔的字符串中解析数字,以便获得每个解析数字的索引? 假设我有一个字符串 "23,123,65,1" 并且我想将这些数字中的每一个插入到给定位置 (0, 1, 2, 3) 的矩阵中.一种方法是将数字解析为 std::vector,然后将它们复制到矩阵行,但速度不是特别快. 目前我正在使用矢量变体: 矩阵数据(10, 4);整数
..
我正在寻找一种将字符串解析为 int 或 double 的方法,解析器应该尝试两种选择并选择匹配输入流最长部分的那个. 有一个已弃用的指令 (longest_d) 完全符合我的要求: number =longest_d[ 整数 |真实的 ]; ...既然已弃用,还有其他选择吗?如果有必要实施语义操作来实现所需的行为,有人有建议吗? 解决方案 首先,切换到 Spirit V2 -
..
我正在尝试将 CUDA 集成到使用 boost::spirit 的现有应用程序中. 隔离问题,我发现以下代码不能与 nvcc copile: main.cu: #include int main(){退出(0);} 使用 nvcc -o cudaTest main.cu 编译我得到了很多可以看到的错误 这里. 但是如果我将文件名更改为 main.cpp,然后使用 nvcc 再
..
我正在寻找实现可变参数函数的最简单方法,该方法接受 boost::spirit::qi 规则列表并将列表扩展为格式表达式:rule1 |规则 2 |rule3 |.... 让我们假设规则不合成任何属性.非常感谢您的帮助. #include #include #include #include #include 命名空间 qi = boost::spirit::qi;命名空间 ph = boost
..
你能帮我理解 a % b 解析器和它扩展的 a >> 之间的区别吗?*(b >> a) 形式在 Boost.Spirit 中?即使参考手册 表示它们是等价的, 列表运算符 a % b 是一种二元运算符,它匹配由 ba 的一个或多个重复的列表代码>.这相当于 a >>*(b >> a). 以下程序会根据使用的程序产生不同的结果: #include #include #include #
..
我希望我的基于 boost::spirit 的解析器能够解析文件,将解析的规则转换为不同的类型,并发出一个包含它找到的所有匹配项的向量.所有作为属性发出的类型都应该从基类型继承,例如: #include #include #include #include 结构体命令库{虚拟无效 commandAction(){std::cout
..
我有一个使用 Boost::Spirit 的非常简单的解析器: 规则zeroTo255 = (string("25") >> char_('0', '5'))|(char_('2') >> char_('0', '4') >> 数字)|(char_('1') >> repeat[2](digit))|(char_('1', '9') >> 数字) |数字; 当我尝试解析时 std::stri
..
我正在尝试解析以下语法序列: .例如: 浮点 foo 方向可以是in、out或in_out.通过使用 qi::symbols 类将方向关键字转换为枚举,我成功地解析了正确的文本. 但是,当我没有正确的文本时会出现问题.举个例子: int foo 符号表解析器将排除 'int' 类型的 'in' 部分,因此结果将是: 方向:在类型:t名称: foo
..
我想解析一个浮点数,但不允许 NaN 值,所以我生成了一个继承自默认策略的策略,并用它创建了一个 real_parser: //使用 boost::spirit::qi::{real_parser,real_policies,//短语解析,double_,char_};模板 struct no_nan_policy : real_policies{模板
..
我想写一个可以使用的解析器(作为qi扩展)通过 my_parser(p1, p2, ...) 其中 p1, p2, ... 是 qi 解析器表达式. 实际上,我想实现一个 best_match 解析器,它的工作方式类似于 qi 替代方案,但不选择第一个匹配规则,而是选择“解释"大部分输入的规则. 给定两个规则 simple_id = +(qi::alpha) 和 complex_id
..
在这篇文章中关于提升精神语义动作 提到了 实际上还有 2 个参数正在传递:解析器上下文和一个对布尔“命中"的引用范围.解析器上下文是只有语义动作才有意义附在右侧某处手边的一条规矩.我们会看到更多很快有关这方面的信息.这布尔值可以设置为 false在语义动作内部无效回顾比赛,使解析器失败. 一切都很好,但我一直试图找到一个示例,将函数对象作为使用其他参数(解析器上下文和命中布尔值)的语义
..
我有一个包含数百万行的文件,每行有 3 个以空格分隔的浮点数.读取文件需要很多时间,所以我尝试使用内存映射文件读取它们才发现问题不是IO的速度而是解析的速度. 我目前的解析是取流(称为文件)并执行以下操作 float x,y,z;文件 >>x>>y>>z; Stack Overflow 中有人推荐使用 Boost.Spirit,但我找不到任何简单的教程来解释如何使用它. 我试图找到
..