并行解析器存在哪些概念或算法?

2024-04-23

对于已经以分割格式给出的大量输入数据,并行化解析器似乎很容易,例如单个数据库条目的大列表,或者很容易通过快速预处理步骤进行分割,例如解析大型文本中句子的语法结构。

并行解析似乎有点困难,它已经需要相当多的努力来定位给定输入中的子结构。通用编程语言代码看起来就是一个很好的例子。在像 Haskell 这样的语言中,使用布局/缩进来分隔各个定义,您可以在找到新定义的开头后检查每行的前导空格数,跳过所有行,直到找到另一个定义并传递每个定义将块跳过到另一个线程进行完整解析。

当涉及到像 C、JavaScript 等使用平衡大括号来定义范围的语言时,预处理的工作量会大得多。您需要遍历整个输入,从而计算大括号的数量,处理字符串文字内的文本等等。对于像 XML 这样的语言,情况更糟,您还需要跟踪开始/结束标记中的标记名称。

I found CYK 解析算法的并行版本 https://pdfs.semanticscholar.org/7f00/907026e8ed51f46e3226134c111baf796a85.pdf这似乎适用于所有上下文无关语法。但我很好奇确实存在哪些其他通用概念/算法可以使解析器并行化,包括上面描述的大括号计数之类的东西,它只适用于有限的语言集。这个问题不是关于具体的实现,而是关于这种实现所基于的想法。


我想你会找到 McKeeman 1982 年的论文并行LR解析 http://www.cs.dartmouth.edu/~mckeeman/references/ParallelLR82.pdf非常有趣,因为它看起来很实用并且适用于广泛的语法类别。

基本方案是标准LR解析。聪明的是,(大概很长)输入被分成大约 N 个大小相等的块(对于 N 个处理器),并且每个块都被单独解析。因为块的起点可能(必须!)位于某些产生式的中间,所以与经典的 LR 解析器不同,McKeeman 的各个解析器从所有可能的左上下文开始(需要增强 LR 状态机)来确定哪个 LR项目适用于块。 (在单个解析器确定真正适用的状态之前,不应该需要太多标记,因此这并不是非常低效)。然后所有解析器的结果被拼接在一起。

他在某种程度上回避了在令牌中间划分输入的问题。 (您可以想象一个任意大的字符串文字,其中包含看起来像代码的文本,以欺骗解析器从中间开始)。似乎发生的情况是解析器遇到错误,并放弃其解析;左边的解析器填补了空缺。人们可以想象分块器使用一点点智能来基本上避免这种情况。

他演示了一个真正的解析器,可以在其中获得加速。

确实很聪明。

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

并行解析器存在哪些概念或算法? 的相关文章

  • 如何将数据存储在对象的对象列表中?

    我有以下代码 将年龄相同且得分最高的用户分组 我现在有而不是Map
  • 面临减法时的算法复杂性

    我必须简化以下公式才能获得算法的时间复杂度 n 2 n 3 是否有任何适用的规则可以让我进一步简化这个表达式为更 常见 的 n 2 或类似的东西 我假设这就是结果 可能是错误的 我根本不知道如何处理这里的减法 通常 如果两个值相加 您只考虑
  • 作为颜色表示的值

    将值转换为颜色是众所周知的 我确实理解以下两种方法 在改变 RGB 颜色值来表示一个值 https stackoverflow com questions 1423925 changing rgb color values to repre
  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • 更快的第二好 MST 算法?

    我正在为此苦苦挣扎 我们可以使用 Kruskal 算法或 Prim 算法得到 MST 对于 第二好的 MST 我可以 首先使用上述任一算法获取 MST 对于来自 MST 的最优边缘的每个 V 1 A 首先删除或标记边缘b 继续计算 MST
  • 使用堆属性按排序顺序打印树 (Cormen)

    我对算法理论 来自 Cormen 感到耳目一新 二进制尝试一章中有一个练习 要求 min heap 属性可以用来打印 n 节点的键吗 树在 O n 时间内排序 展示如何做 或解释为什么不做 我想是的 这是可能的 在最小堆中 节点中的元素小于
  • 求分数 a/b 的小数点后第 k 位,其中 a、b、k 是非常大的整数(小于 10e18)

    我的任务是找到分数 a b 小数点后第 k 位的数字 昨天我发现了这个算法 为了获取小数点后的任何数字 我生成一个名为 rem 的变量并进行循环 for int i 1 i lt k 1 i rem a b a rem 10 cout lt
  • OT 和 CRDT 之间的区别

    有人可以简单地向我解释一下操作转换和 CRDT 之间的主要区别吗 据我了解 两者都是允许数据在分布式系统的不同节点上无冲突地收敛的算法 在哪种用例中您会使用哪种算法 据我了解 OT主要用于文本 而CRDT更通用 可以处理更高级的结构 对吧
  • 在 O(nloglogn) 最坏情况时间内对具有 O(logn) 个不同元素的 n 元素数组进行排序

    目前的问题是标题本身的内容 即给出一种算法 该算法在 O log logn 最坏情况时间内对具有 O log n 个不同元素的 n 元素数组进行排序 有任何想法吗 此外 您通常如何处理具有多个非不同元素的数组 O 日志 日志 n 时间足以让
  • 集合划分比差分获得更好的结果

    分区问题 https en wikipedia org wiki Partition problem已知是 NP 困难的 根据问题的特定实例 我们可以尝试动态规划或一些启发式方法 例如差分法 也称为 Karmarkar Karp 算法 后者
  • 分割如何提高埃拉托斯特尼筛法的运行时间?

    我遇到了埃拉托色尼筛的分段实现 它的运行速度比传统版本快很多倍 有人可以解释一下分段如何提高运行时间吗 请注意 我想在其中找到素数 1 b 它适用于这个想法 用于查找 10 9 之前的质数 我们首先生成 sqrt 10 9 以下的筛选素数
  • 计算产生相同 BST 的唯一节点序列的数量

    问题 给定一个最多 50 个整数的特定序列 它们代表 某个二叉搜索树 BST 的节点 有多少种排列 这个序列在那里 这也会产生完全相同的 空白石板时间 将原始序列作为 1 个序列包含在总计数中 例如 对于这样的序列 5 2 1 9 8 答案
  • 对 Big O 表示法仍然有点困惑

    所以我一直在尽力理解 Big O 表示法 但仍然有一些事情我感到困惑 所以我一直读到如果某件事是 O n 那么它usually指的是算法的最坏情况 但它不一定要指最坏的情况 这就是为什么我们可以说插入排序的最佳情况是 O n 但是 我无法真
  • Big O 用于有限、固定大小的可能值集

    这个问题 https stackoverflow com questions 12305028 java what is the best way to find first duplicate character in a string引
  • .Net 有什么好的解析库吗?

    我正在寻找一些简单易用 语法易于定义的东西 虽然我以前没用过 ANTLR http www antlr org 有 C 运行时
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的
  • 最大流量算法的修改

    我试图解决一个关于最大流量问题 http en wikipedia org wiki Maximum flow problem 我有一个源和两个接收器 我需要找到该网络中的最大流量 这部分是一般的最大流量 然而 在这个特殊版本的最大流量问题
  • 最近点对算法

    我目前正在致力于用 C 实现最接近的点对算法 也就是说 给定一个点列表 x y 找到具有最小欧氏距离的点对 我对此进行了研究 我对算法的理解如下 如果我错了 请纠正我 将点数组从中间拆分 递归地找到左半部分和右半部分距离最小的点对 按 y
  • 使用正则表达式或其他解析从文件中读取值

    我有一个记录带有时间戳的值的文件 我必须在特定时间后读取特定值 例如 文件有 2013 03 03 19 08 22 car 2001 Ford 2013 03 03 19 08 27 Truck 2012 Chevy 2013 03 03
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree

随机推荐

  • SASS/SCSS 变量不适用于 CSS 变量赋值

    我有以下 SCSS 代码 mixin foo bar 42 xyzzy bar bar include foo 我希望得到 CSS 变量 xyzzy set to 42 on all bar元素 相反 我得到 CSS 说明bar xyzzy
  • 根据背景将前景色设置为黑色或白色

    比如计算RGB分量的平均值 然后决定使用黑色还是白色 我是否必须在第一步将 RGB 转换为 HSV 因为 RGB 并不总是人眼看到的 我正在使用 C 恰巧我不久前的一个项目需要这个功能 private int PerceivedBright
  • 如何正确访问后台线程中创建的查询结果?

    我想在后台线程中执行数据库查询 OmniThread 库将帮助我处理所有线程问题 但到目前为止我不明白一件事 每个线程都需要一个单独的数据库连接 因此 后台线程创建数据库连接 创建查询 然后执行它 现在我可以使用后台线程的查询对象访问查询结
  • 停止并重新启动 HttpListener?

    我正在开发一个应用程序 它有一个HttpListener 我的目标是让用户根据自己的选择关闭和打开监听器 我将侦听器放入一个新线程中 但在中止该线程时遇到问题 我在某处读到 如果您尝试中止非托管上下文中的线程 那么一旦它重新进入托管上下文T
  • 尝试从客户端发送数据,但 req.session 无法正常工作

    我正在尝试执行发布请求 当我使用邮递员执行此操作时非常成功 但我正在尝试从客户端发送它 我想发布购物车 但结果是我不断发布数量为 1 的商品 无论我发布该请求多少次 解决此问题并以正常方式发布请求的最佳解决方案是什么 我正在使用会话 也许这
  • Mutation Observer不检测通过innerHTML、appendChild添加的节点

    当我们尝试使用appendChild或innerHTML在DOM中添加嵌套节点时 嵌套节点不会出现在突变的addedNodes中 初始 HTML 设置 div div 这是我的突变观察者代码 var observer new Mutatio
  • 回收器查看致命异常:java.lang.ArrayIndexOutOfBoundsException

    我通过 crashlytics 得到了这个堆栈跟踪 我不知道问题出在哪里 有没有 StaggeredGridLayoutManager 的替代方案可以用来获取类似列表视图的布局 Fatal Exception java lang Array
  • 仅正样本和未标记数据集的二元半监督分类

    我的数据由评论组成 保存在文件中 其中很少被标记为正面 我想使用半监督和PU http www cs uic edu liub publications ICDM 03 pdf分类将这些评论分为正面和负面类别 我想知道 python sci
  • Angular 2 可用的 yeoman 生成器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有官方的 Angular 生成器 许多用户为 Angular 1 提供了生成器 但我还没有找到 Angu
  • 简单游戏服务器的代码示例

    我想为游戏中心构建一款 iPhone 游戏 目前正在研究其中的服务器部分 我通过示例学习得最好 但我很难找到任何简单游戏服务器的示例来演示 数据如何格式化并发送到服务器以及如何接收 如何验证正在发送 接收的数据以避免玩家作弊等 游戏服务器代
  • 将 Google People API 与 Cloud Functions for Firebase 结合使用

    我正在尝试使用 Firebase 的 Cloud Functions 从 Google People API 获取联系人列表 但我只得到一个空对象作为响应 有什么想法吗 云函数代码如下 var functions require fireb
  • 如何将现有的 AngularJS 2 Web 应用程序转换为 Cordova 应用程序?

    我有一个用 Angularjs 2 0 构建的 web 应用程序 我想将其转换为 android apk 并将其安装在 android 手机上并进行测试 我没有任何构建移动本机应用程序或将网络应用程序转换为本机应用程序的经验 我已经完成了如
  • 反转 PyQtGraph 中的 Y 轴

    我正在使用 Python 和 PyQt4 开发一个应用程序 该应用程序根据深度绘制不同的参数 绘图包是 PyQtGraph 因为它具有良好的动画速度特性 由于我正在根据深度进行绘图 因此我想反转 Y 轴 我发现我可以修改PyQtGraph文
  • WooCommerce - 获取用户在一段时间内完成的状态订单

    我需要通过 Woocommerce 中的用户 ID 获取用户上个月完成的购买 用户有级别 金级 银级 金卡会员每月可购买4件商品 银卡会员每月可以购买 1 件商品 在将商品添加到购物车之前 我需要检查这一点 我不想仅使用插件来实现此功能 顺
  • .htaccess 需要 WWW 域,但允许子域(如果存在且没有硬编码)

    我试图弄清楚如何设置一组 htaccess 规则 如果最初未指定 则强制在域前面出现 www 但同时 它不会如果存在子域 则有任何影响 所有这一切都无需对任何域名进行硬编码 以便脚本可以在不同的服务器和配置之间移植 EDIT 很抱歉我没能首
  • 错误页面注册器和全局异常处理

    我正在创建一个 Spring Boot Web 应用程序 但我很困惑为什么人们在存在更整洁 更明确的错误页面注册器时使用全局异常处理程序 ControllerAdvice 请有人解释更多 是否可以从全局异常处理程序类 用 Controlle
  • 如何在关闭阶段后清除 Javafx Webview 内存使用情况

    我尝试在JavaFX中使用webview制作UI 但是有一个问题 当使用popup打开大图像时 内存使用量非常大 并且当popup关闭时 内存使用量不会下降 我明白了通过 Windows 中的任务管理器查看内存使用情况 当使用webview
  • 如何计算innerHTML内的变量?

    如何对innerHTML 中的变量进行计数 JS var counter 1 counter alert counter end html Test counter 1 Test HTML p class end p In my JSfid
  • 在 EXE 文件末尾写入字节安全吗?

    我听说如果我们在 EXE 文件末尾附加一些字节 它仍然可以正常工作 在所有情况下都是如此吗 这是一种安全的方法吗 我打算使用程序执行文件中的数据来编写演示 因此它可以是安全的 至少对普通用户而言 并且我不必将数据存储在其他地方 这是不可能用
  • 并行解析器存在哪些概念或算法?

    对于已经以分割格式给出的大量输入数据 并行化解析器似乎很容易 例如单个数据库条目的大列表 或者很容易通过快速预处理步骤进行分割 例如解析大型文本中句子的语法结构 并行解析似乎有点困难 它已经需要相当多的努力来定位给定输入中的子结构 通用编程