如何创建允许语法错误的 AST 解析器?

2024-01-19

首先,关于解析和构建 AST 需要阅读哪些内容?

如何为将构建 AST 并允许语法错误的语言(如 SQL)创建解析器?

例如,对于“3+4*5”:

  +
 / \
3   *
   / \
  4   5

对于有语法错误的“3+4*+”,解析器会猜测用户的意思是:

  +
 / \
3   *
   / \
  4   +
     / \
    ?   ?

从哪儿开始?

SQL:

    SELECT_________________
   /           \           \
  .           FROM        JOIN
 / \           |         /    \
a city_name  people   address  ON
                                |
                                =______________
                               /               \
                              .____             .
                             /     \           / \
                            p  address_id     a  id

如何构建解析器(构建 AST)问题的标准答案是阅读编译时的标准文本。 Aho 和 Ullman 的《Dragon》编译器书非常经典。如果您没有耐心获得最好的参考资料,您将会遇到更多麻烦,因为它们提供了理论并研究了微妙之处。但这是我的答案 https://stackoverflow.com/a/25106688/120163对于匆忙的人来说,构建递归下降解析器。

人们可以构建具有内置错误恢复功能的解析器。关于这类事情有很多论文,这是 20 世纪 80 年代的热门话题。查看谷歌学术搜索,寻找“语法错误修复”。基本思想是,解析器在遇到解析错误时,会跳到一些众所周知的信标(“;”语句分隔符在类似 C 的语言中非常流行,这就是为什么您在评论中被问到您的语言是否有语句终止符),或者提出各种输入流删除或插入以克服语法错误点。此类计划的多样性令人惊讶。关键思想通常是考虑尽可能多的信息around尽可能的指出错误点。我见过的最有趣的想法之一two一个解析器先于另一个解析器运行 N 个标记,寻找语法错误地雷,第二个解析器在遇到语法错误之前根据可用的 N 个标记进行错误修复。这使得第二个解析器可以在出现语法错误之前选择不同的行为。如果没有这个,大多数解析器都会丢弃剩余的上下文,从而失去修复的能力。 (我从未实施过这样的计划。)

要插入的内容的选择通常可以从用于构建解析器的信息中得出(通常是First and Follow集)放在第一位。对于 L(AL)R 解析器来说,这相对容易做到,因为解析表包含必要的信息,并且解析器在遇到错误时可以使用它们。如果你想了解how为此,您需要了解如何构造解析器的理论(哎呀,又是那本编译器书)。 (这个方案我已经成功实施过好几次了)。

无论你做什么,语法错误修复都没有多大帮助,因为几乎不可能猜测解析文档的作者的实际意图。这表明花哨的计划不会真正有帮助。我坚持简单的;人们很高兴收到错误报告和一些半优雅的解析继续。

为真正的语言开发自己的解析器的一个真正的问题是,真正的语言是令人讨厌的混乱的东西;由于现有的代码库,构建实际实现的人们会犯错并被冻结,或者坚持改变/改进语言(标准是针对弱者的,好东西是针对营销的)因为它很酷。预计会花费大量时间根据真实代码的基本事实重新校准您认为的语法。作为一般规则,如果您想要一个可用的解析器,最好获得一个有跟踪记录的解析器,而不是自己动手。

大多数一心想要构建解析器的人都没有得到一个教训,那就是如果他们想做的话anything对于解析结果或树很有用,它们需要比解析器更多的基本机制。检查我的简历“解析后的生活”。

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

如何创建允许语法错误的 AST 解析器? 的相关文章

  • 优化 HTML 属性压缩顺序

    我在某处读到 按一定顺序组织 HTML 属性可以提高 HTML 文档的压缩率 我想我是从 Google 或 Yahoo 推荐的更快网站上读到这篇文章的 如果我没记错的话 建议是将最常见的属性放在第一位 例如id等 然后将其余的按字母顺序排列
  • 找到质数?

    为了判断 N 是否是质数 我们只需要查找所有小于或等于 sqrt N 的数字 这是为什么 我正在编写 C 代码 因此试图理解其背后的原因 如果 N 是一个正整数 且能被两个正整数 1 和 N 整除 则 N 是素数 由于数字的约数不能大于该数
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • 用于基本要素匹配的最坏情况 NlogN 算法

    查找两个相同大小数组的元素之间的唯一映射 https stackoverflow com questions 4411940 find the unique mapping between elements of two same size
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 用ast重写代码; Python

    我正在学习 AST 它看起来很强大 但我很困惑代码去了哪里以及为什么它消失了 说我想重写 example def fake x n y useless list n return x as example def fake x n retu
  • Google 文档如何处理编辑冲突?

    我一直在尝试编写自己的 Javascript 编辑器 其功能类似于 Google Docs 允许多人同时使用 我不明白一件事 假设用户 A 和用户 B 直接相互连接 网络延迟为 10 毫秒 我假设编辑器使用 diff 系统 据我了解 Doc
  • 来自 ANTLR 解析树的 Python AST?

    我找到了一个ANTLR4 Python3 语法 https github com bkiers python3 parser 但它会生成一个解析树 该树通常有许多无用的节点 我正在寻找一个已知的包来从该解析树获取 Python AST 这样
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • Python 旅行商贪婪算法 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 因此 我为旅行推销员问题创建了一种排序 并按 x 坐标和 y 坐标进行排序 我正在尝试实施贪婪搜索 但无法做到 此外 每
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构

随机推荐

  • 在 Angular JS (1.x) 中验证分页表单

    我有一个使用带输入字段的表格的角度形式 用户可以添加和删除行 每个单元格的输入类型可以是文本 数字 日期等 如果表格太大 表格就会变慢 解决此问题的一种方法是对表进行分页 不幸的是 对表格进行分页是一个问题 因为我对输入字段进行了自定义验证
  • lfe 包裹去了哪里?我怎样才能找到类似的信息?

    我正在寻找这个的更新版本 https cran r project org web packages lfe index html https cran r project org web packages lfe index html包裹
  • 链接器命令失败,sdl

    我正在尝试编译我的第一个 SDL 程序 但它无法编译 顺便说一句 我猜这不应该是关于设置库 因为我认为我正确安装了库 这是我的命令 g main cpp o main I Library Frameworks SDL2 framework
  • 如何使用 gganimate 动画让 x 轴跨度移动?

    使用 R 我尝试使用 gganimate 制作一个基于 x 轴从左到右显示的折线图 我已经设法做到了这一点 但我还想做的是使scale x continuous limits c i 5 i 5 即在正在显示的点和窗口周围有一个窗口将继续前
  • 成员访问不完整类型“QScrollBar”[重复]

    这个问题在这里已经有答案了 QScrollArea scrollArea new QScrollArea this scrollArea gt verticalScrollBar gt width 我试图获取 QScrollArea 的 V
  • 如何在 OncreateView 中运行异步功能?

    我的应用程序有问题 首先 我使用以下命令制作了两个选项卡碎片这会膨胀一个activity 实现的选项卡工作正常 其次我已经展示了XAML right 但是 我现在需要异步运行一些东西 Fragment 中的 OnCreateView 我怎样
  • 万物皆对象是如何运作的?

    我了解背后的主要理论一切都是对象但我真的不明白它是如何在幕后实现的 功能 So foo 4 是相同的foo call 4 但是什么阻止了我做foo call call 4 foo是一个函数并且foo call 都是围绕函数的方法包装器 但是
  • 复制带有下一个和随机指针的链表,仅赋予链表读取权限

    我需要复制带有下一个和随机指针的链表 下 一个指针照常指向链表中的下一个元素 随机指针可能指向任何其他节点 甚至指向其自身 如果我不允许在任何时候修改给定的列表 而只给出列表的读取权限 该怎么办 优雅的解决方案 线性时间 恒定空间 创建节点
  • Microsoft Exchange 不会将 PHPmailer 生成的电子邮件呈现为 HTML

    这个问题已经困扰我好几个星期了 我有一个脚本 可以在 PHPmailer 的帮助下将带有 xls 附件的 html 电子邮件发送给多个收件人 它已经运行良好一年多了 最近 来自同一家公司的两个使用 Microsoft Exchange 作为
  • 如何设置svn仓库的权限?

    我在网络驱动器上创建了一个存储库svnadmin create repos 有没有办法设置用户对存储库的权限 如果是这种情况 如何设置这些权限 如果您需要通过以下方式管理访问svn 协议 嵌入授权 您所需要做的就是更改文件conf新创建的存
  • 是否可以将标准的纯 C 标头 #include 指令放入命名空间中? [复制]

    这个问题在这里已经有答案了 可能的重复 将 include 包装在命名空间块中是个好主意吗 https stackoverflow com questions 6670738 is it a good idea to wrap an inc
  • 如何使用 roxygen 包从 dplyr 导入管道运算符 %>%

    我想用我编写的一些函数构建一个包 现在我的问题是 我无法将管道运算符 gt 与 dplyr 一起使用 我用 roxygen2 创建包 如果我编写没有 gt 的 dplyr 命令 则一切正常 代码里面 import dplyr readr m
  • 如何传递函数参数的值并运行独立的 Google Apps 脚本?

    从文档来看 https developers google com apps script guides standalone https developers google com apps script guides standalon
  • 如何在 vim 中进行语法检查?

    这个问题已经以这样或那样的形式被问过十几次了 这让我大吃一惊 为什么没有一个人真正解决如何配置合成的 http www vim org scripts script php script id 2736 or jslint http www
  • jsf 表达式语言中的 null 检查

    请参阅此表达语言 styleClass obj validationErrorMap eq null obj validationErrorMap contains key highlight field highlight row 即使地
  • 如何使用 Cognito Id(+配置)调用 AWS API Gateway 端点?

    我想打电话给AWS API Gateway Endpoint受保护的是AWS IAM使用generated JavaScript API SDK 我有一个Cognito UserPool and a Cognito Identity Poo
  • CSS 问题 - 边距顶部 - Google Chrome [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions On my
  • Android 应用程序在向下滚动 ListView 后崩溃

    我有一个 listView 当我没有太多项目时 一切都工作正常 当我向下滚动时项目列表很长时 它会在某个点崩溃 这是我的适配器代码 public class SearchListViewAdapter extends BaseAdapter
  • DotNetZip:将文件添加到动态创建的存档目录

    我无法想象这很难做到 但我还没能让它发挥作用 我有一个文件类 它只存储我想要压缩的文件的位置 目录和名称 我要压缩的文件存在于磁盘上 因此 FileLocation 是完整路径 磁盘上不存在 ZipFileDirectory 如果我的文件列
  • 如何创建允许语法错误的 AST 解析器?

    首先 关于解析和构建 AST 需要阅读哪些内容 如何为将构建 AST 并允许语法错误的语言 如 SQL 创建解析器 例如 对于 3 4 5 3 4 5 对于有语法错误的 3 4 解析器会猜测用户的意思是 3 4 从哪儿开始 SQL SELE