在 boost::spirit 语法中翻转规则内的子规则顺序会导致段错误

2024-04-08

警告;虽然我试图将代码缩短到最少。我仍然需要包含相当多的内容,以确保提供所需的信息。

该代码编译文件并运行,导致语法错误;

name = simple_name      [ qi::_val = qi::_1 ]
     | qualified_name   [ qi::_val = qi::_1 ]
     ;

虽然这;

name = qualified_name   [ qi::_val = qi::_1 ]
     | simple_name      [ qi::_val = qi::_1 ]
     ;

结果是SIGSEGV, 分段故障;

boost::detail::function::function_obj_invoker4<boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<__gnu_cxx::__normal_iterator<char*, std::string>, boost::mpl::vector<std::string, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, mpl_::bool_<false>, unsigned long>, boost::spirit::lex::lexertl::detail::data, __gnu_cxx::__normal_iterator<char*, std::string>, mpl_::bool_<true>, mpl_::bool_<false> > >, Ast::name* (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> const>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::assign, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::attribute<0> >,0l>,boost::phoenix::actor<boost::spirit::argument<0> > >, 2l> > >,boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<__gnu_cxx::__normal_iterator<char*, std::string>,boost::mpl::vector<std::string, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, mpl_::bool_<false>,unsigned long>, boost::spirit::lex::lexertl::detail::data, __gnu_cxx::__normal_iterator<char*,std::string>, mpl_::bool_<true>, mpl_::bool_<false> > >, Ast::name* (), ... more to come ...

Where;

simple_name = (tok.identifier) [ qi::_val = build_simple_name_(qi::_1) ];

And;

qualified_name = (name >> qi::raw_token(DOT) >> tok.identifier) [ qi::_val = build_qualified_name_(qi::_1, qi::_2) ] ;

所有这些规则,返回一个Ast::name*();

qi::rule<Iterator, Ast::name*()> name;
qi::rule<Iterator, Ast::name*()> simple_name;
qi::rule<Iterator, Ast::name*()> qualified_name;

辅助函数定义为:

Ast::name* build_simple_name(std::string str)
{
    return (new Ast::name_simple(Ast::identifier(str)));
}
BOOST_PHOENIX_ADAPT_FUNCTION(Ast::name*, build_simple_name_, build_simple_name, 1)

And;

Ast::name* build_qualified_name(Ast::name* name, std::string str)
{
    std::list<Ast::identifier> qualified_name = Ast::name_to_identifier_list(name);
    qualified_name.push_back(Ast::identifier(str));

    return (new Ast::name_qualified(qualified_name));
}
BOOST_PHOENIX_ADAPT_FUNCTION(Ast::name*, build_qualified_name_, build_qualified_name, 2)

使用的词法分析器定义定义为:

lex::token_def<std::string> identifier = "{JAVA_LETTER}{JAVA_LETTER_OR_DIGIT}*";

And;

('.', DOT)

图案在哪里{JAVA_LETTER} and {JAVA_LETTER_OR_DIGIT}被定义为;

("DIGIT",           "[0-9]")
("LATIN1_LETTER",   "[A-Z]|[a-z]")
("JAVA_LETTER",     "{LATIN1_LETTER}|$|_")
("JAVA_LETTER_OR_DIGIT", "{JAVA_LETTER}|{DIGIT}")

我的输入是一个简单的字符串;

package a.D;

令牌的词法;

Keywords : package
Identifier : a
Delimiters : .
Identifier : D
Delimiters : ;

其中第一个示例(首先是 simple_name)抛出语法错误:

Syntax Error at line 1:
package a.D;
          ^^

最后一个示例只是抛出一个段错误,错误已在前面发布。

显然,第二个示例是我想要的,因为它应该在简单表达式之前尝试匹配复杂表达式。

有谁知道代码崩溃的原因,或者我将如何解决? - 这也应该在代码审查中进行吗?


问题是你有一个左递归语法 http://en.wikipedia.org/wiki/Left_recursion并且不能与 Boost.Spirit 一起使用。 你所拥有的基本上是:

name = identifier | name >> dot >> identifier;

如你看到的here http://www.csd.uwo.ca/~moreno//CS447/Lectures/Syntax.html/node8.html,以便在遇到以下情况时删除左递归:

A = A >> alpha | beta;

您需要创建 2 条新的“规则”:

A = beta >> A_tail;
A_tail = eps | alpha >> A_tail;

在你的情况下:

A := name
alpha := dot >> identifier
beta := identifier

所以你的“规则”是:

name = identifier >> name_tail;
name_tail = eps | dot >> identifier >> A_tail;

如果你仔细观察name_tail你可以看到它的字面意思是:要么什么都没有,要么dot >> identifier紧接着什么也没有或dot >> identifier等等。这意味着name_tail is:

name_tail = *(dot >> identifier);

所以最后你的name规则是:

name = identifier >> *(dot >> identifier);

所有这些都是正确的,但很有可能它不适用于您的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 boost::spirit 语法中翻转规则内的子规则顺序会导致段错误 的相关文章

  • boost::filesystem::unique_path() 如何解决 C++ 中 mkstemp 类似物的需求?

    An old 功能要求 https svn boost org trac boost ticket 590对于 Boost 来说 请求的功能类似于mkstemp http pubs opengroup org onlinepubs 0096
  • 查找带有 Anaconda cmake 前缀的 boost-python3

    DLDR如何将 cmake 指向 boost python3 库 cmake 不会自动检测到它 我正在尝试建立caffe https github com BVLC caffe对于 Python 3 6 使用提供的 cmake 我的系统规格
  • Boost 库构建 - 运行时链接和链接选项之间的区别

    我正在尝试使用 MSVC VS 2010 在 Windows 7 中构建 boost 库 我遇到过这些选择运行时链接和链接在 bjam 命令行选项中 我想知道它们是如何使用的以及它们之间的确切区别是什么 我已经使用此命令行构建了 Boost
  • 如何使用 boost::spirit::qi 解析行尾?

    不应该是一个简单的eol http www boost org doc libs 1 42 0 libs spirit doc html spirit qi quick reference qi parsers auxiliary html
  • 在 C++ 中传递参数到 boost odeint

    This https stackoverflow com questions 33856910 passing runtime parameters to odeint integrator 答案很有帮助 但我想知道如何将不同类型的多个参数
  • Spirit qi 解析为嵌套函数的抽象语法树

    我正在尝试使用 boost 的spirit qi 解析器创建一个解析器 它正在解析包含三种类型值的字符串 常量 变量或函数 这些函数可以相互嵌套 测试字符串是f a b f g z x g x h x c where a e是常数 f r是
  • Boost.MPL 和类型列表生成

    背景 这是用于游戏引擎中的内存管理器 我有一个freelist已实现 并且希望有一个编译时列表 如果有 例如 MPL 或 Fusion 向量 这freelist对应于分配大小 当分配 释放大小小于常量的对象时 它们将转到相应的freelis
  • C++ Boost.asio Ping

    我正在尝试编写一个程序来列出网络上设备的所有 IP 地址 其主要组成部分之一是能够对设备执行 ping 操作 这个程序必须在Linux Windows和Mac上运行 所以我选择了Boost库 我设法在文档中找到这个示例 http www b
  • 提升精神带走关键字并忽略船长

    这是使用表达式的语法的一小部分 prefix lit L not gt gt prefix lit gt gt prefix postfix 我在 postfix 内部有某种方式纯名称获取标识符 name pure lexeme boost
  • C 语言的计算单元转换器

    我正在学习 C 并且编写了一个简单的程序 只是晒黑 输入时 您传递两个参数 行和列 输出时您会获得该单元格的 Calc 或 Excel 代码 例如 Input 3 1 Output A3 Input 1 27 Output AA1 代码 i
  • 如何将 Boost 库添加到 XCode 6.0 中的 C++ 程序?

    我在用着XCode6 0并且需 要boost程序库 我已经下载了boost 1 57 0 tar gz from http sourceforge net projects boost files boost 1 57 0 http sou
  • boost Deadline_timer 最小示例:我应该替换“睡眠”吗?

    我有一个线程 我需要每 10 毫秒执行一些操作 所以我有非常简单的代码 如下所示 while work do something Sleep 10000 boost sleep can be also used 我听说Sleep一般不推荐
  • 如何构建 Boost::program_options

    我想使用 boost program options 安装boost后 我认为我必须单独构建program options http www boost org doc libs 1 43 0 more getting started wi
  • 不明确的元函数或未定义的类型

    我是元功能的新手 我想编写一个函数 将复合类型中某种类型的所有匹配项替换为其他类型 在示例中 replace
  • 如何取消 boost asio io_service 帖子

    如何取消已发布的回调 getIoService gt post boost bind MyClass myCallback this 并保持其他发布的回调不变 问题是我有一些对象从不同线程接收事件 并将它们发布到 ioservice 以便处
  • Xcode 4 上的 Boost 库静态链接

    我在 OS X 上使用 Xcode 使用 Boost 库 Boost 使用 macports 安装在我的系统上 通过将我需要的 3 个 boost 库 例如 libboost thread mt a 添加到 Targets Link Bin
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 为什么 `boost::any` 比 `void*` 更好?

    有什么先天优势boost any and boost any cast提供超过使用void and dynamic cast 优点是boost any比类型安全得多void E g int i 5 void p i static cast
  • 使用 Boost program_options 指定级别(例如 --verbose)

    我的一些选择有多个级别 例如的 冗长 我希望我的用户在以下两种等效样式之间进行选择 no argument verbosity of 1 my program v count the v s verbosity of 4 my progra
  • 从模板类创建对象时出错

    我一直在尝试找到一种方法 从 C 中的多元正态分布中采样随机向量 同时具有均值向量和协方差矩阵 就像 Matlab 的那样mvnrnd功能有效 我找到了实现此功能的类的相关代码这一页 http lost found wandering bl

随机推荐

  • 在没有按钮连接的情况下以编程方式执行 Segue?

    我的故事板中有两个视图控制器 我需要从视图 1 推送到视图 2 我需要在不直接从故事板中的按钮连接转场的情况下执行此操作 我需要以编程方式执行此操作 我怎么能够 Thanks 当您单击按钮时调用 self performSegueWithI
  • VBScript 宏 getParentFolder 名称

    我正在尝试创建一个 vbscript 宏 它将获取存储宏的文件夹位置并将输出文件创建到同一文件夹中 我正在使用下面的代码 但它没有获得正确的位置 Set obj1FSO CreateObject Scripting FileSystemOb
  • 跨包模块设置日志记录的有效方法

    我有一个包 其中包含多个组件 这些组件将从使用日志记录和输出有用信息中受益匪浅 我不想做的是为每个文件 设置 正确的日志记录 并在以下位置进行 import logging logging basicConfig level DEBUG m
  • Boost:为什么 ~/user-config.jam 中列出的工具集不可用于 ./b2?

    在我试图回答我自己的问题时Clang 链接器报告 未找到符号 尽管 nm m 显示该名称存在于正在链接的库中 https stackoverflow com questions 20599721 clang linker reports s
  • window.onbeforeunload 执行查询

    我试图在用户离开页面时执行后查询 我正在使用的代码是 我在这里做的事情有什么问题吗 我在 FF 错误控制台中得到的结果只是说其他不相关的函数 变量未定义 因为它们正在卸载 对于我需要修复的问题有什么提示或指示吗 简单的答案是你不能在中进行异
  • 使用 sql 通过 csv 将产品导入到 woocommerce

    当sql表post meta不断增长时 通过插件wp all import导入产品会花费太多时间 目前有200 000种产品进口 有没有办法直接在sql中通过csv导入产品而不需要wordpress 我不需要导入任何图像 只需导入标题和描述
  • 应用程序图标创建叠加信息(数字)?

    如何在 Android 应用程序上克隆此行为 iOS 从技术上讲 这绝对是可能的 因为我在 Android 手机上有一个自己的应用程序 它是一个电子邮件应用程序 图标上有一个非常相似的指示器 显示未读邮件数量 是的 你可以像 ios 一样实
  • 用户输入-DOS批处理文件

    我得到一个bat文件 如下所示 ECHO Executing scripts PAUSE for X in SQL do SQLCMD S localhost d CTL I i X gt gt ResultScript txt pause
  • 以编程方式更改滑动时的 ViewPager 动画持续时间

    我正在使用以下代码更改幻灯片 viewPager setCurrentItem index true 但变化太快了 有没有办法手动设置动画速度 I ve wanted to do myself and have achieved a sol
  • 我可以在全局范围内只安装 Gulp 吗?

    我一直致力于新的网络开发项目 这些项目在实践中并不需要他们的node modules部署时的文件夹 如果我能够创建一个小的 它会更适合我gulpfile js对于每个项目 而不是包含在 6000 多个文件node modules每个项目的文
  • 在 Restful Web 服务中下载文件

    我的要求是 我应该通过restful服务向客户端发送一个10MB的zip文件 我在论坛中找到了发送StreamingOutput对象是更好的方法 但是我如何创建一个StreamingOutput以下代码中的对象 Path PDF file
  • 使用“Object.create”而不是“new”

    Javascript 1 9 3 ECMAScript 5 介绍Object create 其中道格拉斯 克罗克福德 Douglas Crockford 等人提倡 http javascript crockford com prototyp
  • 如何从一组 N 个对象中选择 n 个对象,最大化它们之间的成对距离之和

    您有一组 N 400 个对象 每个对象在 19 维空间中都有自己的坐标 您计算 欧几里德 距离矩阵 所有成对距离 现在您想要选择 n 50 个对象 使得所选对象之间所有成对距离的总和最大 我设计了一种通过线性编程来解决这个问题的方法 下面的
  • 如何使用完成处理程序将图像放入 SwiftUI 视图中

    我已经尝试过这个 但我不知道如何在 SwiftUI 视图中使用结果 func getProfilePicture completion escaping UIImage gt Void Alamofire request GIDSignIn
  • 关于如何构建 HTML Diff 工具的建议?

    In 这个帖子 https stackoverflow com questions 48669 are there any tools out there to compare the structure of 2 web pages我问是
  • SQL Server 进程队列竞争条件

    我有一个订单队列 多个订单处理器通过存储过程访问该队列 每个处理器都会传递一个唯一的 ID 该 ID 用于锁定接下来的 20 个订单以供自己使用 然后 存储过程将这些记录返回给订单处理器以进行操作 有些情况下多个处理器能够检索相同的 Ord
  • MYSQL限制特定列值的出现次数

    从数据库中提取一些优惠券 每张优惠券都有一个merchantid包含优惠券所属商家 ID 的列 我正在尝试构建一个提取 5 张优惠券的查询 但我只想要每张 1 张优惠券merchantid 我不想要多张相同的优惠券merchantid 你可
  • strtol 重用参数

    该代码似乎按预期工作 使用单个指针填充数字数组 include
  • 您可以指定嵌入 IPython 后运行的命令吗?

    打电话时IPython embed 是否可以给它一个命令或魔术函数来在嵌入发生后运行 我想运行这样的东西 import IPython IPython embed command pylab qt4 我当前的解决方法是将命令字符串复制到剪贴
  • 在 boost::spirit 语法中翻转规则内的子规则顺序会导致段错误

    警告 虽然我试图将代码缩短到最少 我仍然需要包含相当多的内容 以确保提供所需的信息 该代码编译文件并运行 导致语法错误 name simple name qi val qi 1 qualified name qi val qi 1 虽然这