解析器错误恢复可以由语法自动引导吗?

2023-11-24

我正在编写一个 LALR 解析器生成器作为一个宠物项目。

我使用紫龙书来帮助我进行设计,我从中了解到解析器中有四种错误恢复方法:

  • 恐慌模式:开始转储输入符号,直到找到编译器设计者预先选择的符号
  • 短语级恢复:将输入字符串修改为允许当前产生减少的内容
  • 错误产生式:通过将错误合并到语法中来预测错误
  • 全局更正:短语级恢复的更复杂版本(据我所知)

其中两个需要修改输入字符串(我想避免),另外两个需要编译器设计者预测错误并根据他们的语言知识设计错误恢复。但是解析器生成器也了解该语言,因此我很好奇是否有更好的方法可以从解析错误中恢复,而无需预先选择同步标记或用错误产生式填充语法。

解析器不能只将当前产生式可以简化为同步标记的所有非终结符后面的符号视为同步标记,而不是选择同步标记吗?我还没有真正弄清楚它的工作效果如何 - 我想象解析器处于正在进行的产品链中,但当然这不是自下而上解析器的工作方式。尝试找到可行状态时会产生太多不相关的错误吗?它会尝试将解析器恢复到无效状态吗?有没有一种好方法可以用有效的错误操作预先填充解析器表,以便实际的解析程序在遇到错误时不必推理下一步该去哪里?


当您试图盲目跟随所有可用的产品时,很容易迷失在死胡同中。有些关于您的语言的知识对于解析器生成器来说是很难弄清楚的。 (例如,跳到下一个语句分隔符很可能允许解析恢复。)

这并不是说自动化程序还没有被尝试过。有一个很长的部分关于它句法分析理论(Sippu 和 Soisalon-Soininen)。 (很遗憾,本文是付费的,但如果您有 ACM 会员资格或可以访问好的图书馆,您可能可以找到它。)

总体而言,yacc 策略已被证明“并不糟糕”,甚至“足够好”。有一种众所周知的方法可以让它变得更好,那就是收集非常糟糕的语法错误消息(或失败的错误恢复),将它们跟踪到它们发生时的活动状态(这很容易做到),并附加一个到该精确状态和前瞻标记的错误恢复过程。例如,参见拉斯·考克斯的方法.

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

解析器错误恢复可以由语法自动引导吗? 的相关文章

  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc
  • Java 库有 parseInt、parseLong、parseDouble 等接受默认值并且不抛出异常吗?

    我喜欢中的建议java中的String到Int 可能是坏数据 需要避免异常 https stackoverflow com questions 174502 string to int in java likely bad data nee
  • 如何使用 BeautifulSoup 从表中选择特定行?

    So I have a question related to a previous question but I realized I needed to go one level more to get an 11 digit NDC
  • .Net 中是否有与 HTML 等效的 XmlReader?

    我用过Html敏捷包 http html agility pack net z codeplex过去在 Net 中解析 HTML 但我不喜欢它只使用 DOM 模型 在大型文档和 或具有大量嵌套的文档上 可能会遇到堆栈溢出或内存不足异常 另外
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • 在Python中解析.xsd

    我需要在 Python 中解析文件 xsd 就像解析 XML 一样 我正在使用 libxml2 我必须解析如下所示的 xsd
  • Preg在html标签之间匹配php中的文本

    您好 我想在 PHP 中使用 preg match 从 html 文档中解析出以下内容中的 所需文本 p class review Desired text p 通常我会使用 simple html dom 来做这样的事情 但在这种情况下它
  • 如何将 RFC 2822 日期/时间解析为 Python 日期时间?

    我有 RFC 2822 指定的表格日期 比如说Fri 15 May 2009 17 58 28 0000 作为字符串 有没有一种快速和 或标准的方法来将其作为datetimePython 2 5 中的对象 我尝试生成 strptime 格式
  • 使用 XSLT 转换 XML 并保留 CDATA(在 Ruby 中)

    我正在尝试将包含如下内容的文档转换为另一个文档 使 CDATA 与第一个文档中的完全相同 但我还没有弄清楚如何使用 XSLT 保留 CDATA 初始 XML
  • 如何从 Perl 中的文本文件中提取/解析表格数据?

    我正在寻找类似的东西HTML 表格提取 http search cpan org dist HTML TableExtract 只是不适用于 HTML 输入 而是适用于包含采用缩进和间距格式化的 表格 的纯文本输入 数据可能如下所示 Her
  • 解析dev/input/event触摸事件

    我能够在 Android 手机上从 dev input event 读取事件 然而 它们是按一定顺序排列的行代码 就像触摸事件给出的那样 3 53 216 3 54 444 3 48 40 3 50 5 0 2 0 0 0 0 如何将它们解
  • 在 C++ 中解析逗号分隔的数字

    我有一个简短的问题要问大家 我正在尝试编写一个简单的代码来从用户输入中提取数字并将其保存到 int 数组中 但我很难思考如何使其工作 下面显示的代码适用于单位数 但不适用于超过 1 位的数字 例如 如果用户输入 1 2 3 4 50 60
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • .NET 的 C 代码解析器

    有谁知道 NET 的 C 解析器库吗 我打算将 C 代码解析为某种形式的对象图 这样我就可以将其转换为不同的语言 ANTLR 可以做你想做的事 它有一个 C 预处理器和 ANSI C 语法 https github com antlr gr
  • Rebol / Red Parse html规则返回true但没有插入任何内容

    我有一个返回 true 的解析规则 但它没有按预期插入我的文本 html 未更改 而它应该插入到主结束 div 的末尾 我尝试使用类似的计数器如何使用 REBOL 解析 HTML 标签内部 https stackoverflow com q
  • 如何从 URL 字符串中删除某些参数?

    我有这个var存储表示充满参数的 URL 的字符串 我正在使用 AngularJS 我不确定是否有任何有用的模块 或者可能使用纯 JavaScript 来删除不需要的 URL 参数而无需使用正则表达式 例如我需要删除 month 05并且
  • 计算机AI算法写句子?

    我正在寻找有关处理文本句子或在创建在正常人类语言 例如英语 中有效的句子时遵循结构的算法的信息 我想知道这个领域是否有我可以学习或开始使用的项目 例如 如果我给一个程序一个名词 为其提供同义词库 相关单词 和词性 以便它理解每个单词在句子中
  • 如何将 HTML 表格转换为 csv 格式?

    是否有 HTML 解析器或某些库可以自动将 HTML 表格转换为 CSV 数据行 Here is http www unix com shell programming scripting 45274 html table csv html

随机推荐