boost::spirit 替代解析器返回重复项

2024-01-07

我正在研究https://github.com/F-Bergemann/RegexSplitter https://github.com/F-Bergemann/RegexSplitter.
目的:解析正则表达式字符串,并创建可破坏和不可破坏的顶级子字符串。可分解的子串可以再次分解。牢不可破的子字符串必须保持原样。 Unbreakable 适用于“团体”和“角色类别”
我目前正在研究“角色课程”。对于这些,我主要使用 qi::rule 解析器,并且仅使用单个 qi::rule 解析器作为根解析器。 IE。只有根解析器才能创建 AST 结果。子解析器将仅进行验证。

当测试编译的正则表达式分割器时,我得到这个:

> ./regex-splitter "[1]"
TEST:[1]
### ASTNode c'tor (std::string &) #1: Unbreakable
### ASTNode c'tor (std::string &) #2: U:[11]
### ASTNode c'tor (ASTNode const *, std::vector<ASTNode *> &) #1: Collection
### ASTNode d'tor #1: Unbreakable
### ASTNode d'tor #2: U:[11]
### ASTNode c'tor (ASTNode const *, std::vector<ASTNode *> &) #2: Collection
U:[11], 
### ASTNode d'tor #1: Collection
### ASTNode d'tor #2: C:[11]

IE。我得到的结果不是“[1]”,而是“[11]”。
我知道这与代码的以下部分有关:

tok_set_item =
tok_range | tok_char
;

tok_range =
tok_char >> qi::char_('-') >> tok_char
;

tok_char =
qi::alnum // TODO BNF: <char> ::= any non metacharacter | "\" metacharacter
;

似乎尝试 tok_range,1st。然后切换到tok_char。
但为什么我会在这里得到“[11]”?
它应该只是验证语法并返回原始数据。

我试图找出解析器操作在这里发生了什么。
我这里没有明确的解析器操作。
它正在使用什么隐含地?升压::变体<...>?
当我使用 qi::as_string[...] 包装器时,这有什么区别吗?


这是古老的“容器属性不是原子的”陷阱:

  • boost::spirit::qi 对输出进行重复解析 https://stackoverflow.com/questions/13869978/boostspiritqi-duplicate-parsing-on-the-output/13875183#13875183
  • 理解 Boost.spirit 的字符串解析器 https://stackoverflow.com/questions/21959270/understanding-boost-spirits-string-parser/21960981#21960981
  • 使用 Boost::Spirit (V2.4) 解析到容器中 https://stackoverflow.com/questions/3912674/parsing-with-boostspirit-v2-4-into-container/3915892

你可以用纸覆盖它qi::hold。或者你可以修改你的策略。

我会看看是否可以抽出时间来检查代码。为了获得更好的效果,您可以在 CodeReview.stackexchange.com 上发帖。

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

boost::spirit 替代解析器返回重复项 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0

随机推荐

  • Java ArrayIndexOutOfBounds 错误

    所以我有一个数组 Canvas 256 256 它的随机索引 Canvas r r r 是随机的 设置为 1 然后我想循环遍历该数组以准确查看哪个索引不为 0 然后随机选择一个点 上 下 左 右 并将其设置为 1 它在第一个循环中工作得很好
  • 如何从 Sinatra 发送二进制数据?

    我想从 Sinatra 应用程序发送二进制数据 以便用户可以将其作为文件下载 我尝试使用send data但它给了我一个undefined method send data 我怎样才能做到这一点 我可以将数据写入文件 然后使用send fi
  • 在 UITextView 上点击时未调用 UICollectionView didSelectItemAtIndexPath

    我有一个UICollectionView与定制细胞 他们有一个UITextView大部分覆盖整个细胞 这在使用时会出现问题didSelectItemAtIndexPath 触发它的唯一方法是点击外部UITextView 我希望它在您点击的单
  • PHP PDO 如何运行多个查询请求?

    你好 我正在尝试在 PHP 中执行此 SQL 请求PDOStatement CREATE TEMPORARY TABLE r1 SELECT CONCAT MONTH Heure deb DAY Heure deb as Date Heur
  • 具有嵌套属性的 DynamoDB SCAN

    在给定的示例中 我可以通过 order shortCode 扫描 DynamoDB 吗 控制台表明我不能使用点表示法 并且我找不到任何相关文档 key2 cj11b1ygp0000jcgubpe5mso3 order amount 74 2
  • 如何向 ngx-bootstrap/tooltip 添加自定义样式

    我更改了工具提示的背景和边框颜色 工具提示中的箭头应填充白色而不是黑色并带有边框 那可能吗 我已经尝试过堆栈闪电战 https stackblitz com edit angular j8vcbb 将其添加到您的style css file
  • 如何让 shell 脚本每 5 分钟重复一次

    如何让这个 shell 脚本每五分钟重复一次 我在service d中使用它 system bin sh sleep 60 su c CLASSPATH storage emulated 0 DisplayToggle dex app pr
  • 无法下载spark-nlp库提供的管道

    我无法使用spark nlp库提供的预定义管道 recognize entities dl 我尝试安装不同版本的 pyspark 和 Spark nlp 库 import sparknlp from sparknlp pretrained
  • TWebBrowser 是否随 IE 一起更新?

    我在 D7 应用程序中使用 TwebBrowser 问题是 当我升级 IE 时 该组件将使用新的 IE 来渲染页面吗 Yes TWebBrowser里面的SHDocVw单位内部创建一个IWebBrowser2OLE 控制 并且该界面使用已安
  • amcharts 中动态图表容器宽度和高度

    我正在使用 amcharts 我想要图表容器的宽度和高度动态取决于 amcharts 中 x 轴上没有列和 y 轴上的最高值 这是我的小提琴我使用css如下 graphsdata width 100 height 800px overflo
  • 网页中允许的最大 div 数

    您好 我想知道网页上允许的 div 数量是否有限制 例如 当 Internet Explorer 必须渲染具有一千个 div 的网页时 它会开始感到窒息吗 我知道这是一篇旧文章 但我最近做了一个与该主题直接相关的测试 我想分享我的结果 我创
  • Socket.io 在 Express Route 上发出

    我想在调用某些 API 路由时向客户端发送一些数据 我必须遵循 server js 上的代码 var app express var http require http Server app var io require socket io
  • 为什么此代码在到达 StreamReader 的第一个 ReadLine 时挂起?

    我在第一个参数中将一个大文件传递给下面的 SendXMLFile 但由于它导致手持设备 挂起 冻结 我暂时硬编码了一个小得多的文件 3 KB 而不是 1121 KB 供测试用 该文件确实存在 与 exe dll 位于同一文件夹中 如以下代码
  • Iframe 和同源策略以及反向代理黑客

    我一直在阅读具有不同域的 Iframe 然后是父文档 我有点困惑 据我了解 如果 iframe 与其父文档来自同一域 则父文档可以访问 iframe 的文档 看来我可以通过以下技巧来规避这个问题 我在以下位置设置了一个网络服务器mydoma
  • Android:处理ListView回收

    我正在开发一个音板应用程序 在其中使用 Listview Activity 但是由于Android的Listview具有回收其listview的属性 滚动列表视图时 我对所选文本视图所做的更改会反映在所有页面中 我不希望这种事发生 那么我该
  • J2ME 的 JSON 解析器

    我需要一个与 J2ME CLDC 1 1 配合使用的基本 JSON 解析器 Google 搜索返回了大量关于此问题的答案 有些甚至在 stackoverflow 上 但似乎所有内容都指向不再可用的库和解决方案 例如 很多都指向应该位于 js
  • 过滤负时间增量

    考虑一系列持有timedelta64 ns 测量两个事件 A 和 B 之间的时间差 gt time deltas 499900 1 days 23 45 13 499916 1 days 23 50 57 499917 00 03 27 4
  • VB 6:如何执行 .bat 文件但等到其运行完成后再继续?

    VB 6 如何执行 bat 文件但等到其运行完成后再继续 您将需要使用 Win32 API 调用Shell执行Ex http msdn microsoft com en us library bb762154 VS 85 aspx和从SHE
  • 如何处理自动模块中的拆分包?

    我目前正在测试将现有应用程序迁移到 Jigsaw Modules 我的模块之一使用 ElasticSearch 及其 Groovy 插件 org elasticsearch elasticsearch org elasticsearch m
  • boost::spirit 替代解析器返回重复项

    我正在研究https github com F Bergemann RegexSplitter https github com F Bergemann RegexSplitter 目的 解析正则表达式字符串 并创建可破坏和不可破坏的顶级子