Skip to main content
QUICK REVIEW

[论文解读] Recognising and Generating Terms using Derivatives of Parsing Expression Grammars

Tony Garnock-Jones, Mahdi Eslamimehr|arXiv (Cornell University)|Jan 31, 2018
Software Testing and Debugging Techniques参考文献 23被引用 5
一句话总结

本文提出了一种基于导数的解析表达式文法(PEG)术语识别与生成技术,将此前用于正则表达式和上下文无关文法(CFGs)的Brzozowski导数概念扩展至PEGs。通过定义PEG的导数并利用其进行句子生成,该方法实现了精确的、工具支持的语法分析,揭示了隐藏的错误(例如Ford的$a^n b^n c^n$文法中的问题),并为任何具备导数定义的形式化系统提供了通用框架。

ABSTRACT

Grammar-based sentence generation has been thoroughly explored for Context-Free Grammars (CFGs), but remains unsolved for recognition-based approaches such as Parsing Expression Grammars (PEGs). Lacking tool support, language designers using PEGs have difficulty predicting the behaviour of their parsers. In this paper, we extend the idea of derivatives, originally formulated for regular expressions, to PEGs. We then present a novel technique for sentence generation based on derivatives, applicable to any grammatical formalism for which the derivative can be defined--now including PEGs. Finally, we propose applying derivatives more generally to other problems facing language designers and implementers.

研究动机与目标

  • 为解决PEG缺乏调试工具支持的问题,因为PEG易受前瞻与优先选择之间复杂交互影响,导致细微且难以察觉的错误。
  • 将已在正则表达式和CFG中取得成功的导数技术扩展至解析表达式文法(PEGs),实现在统一框架下的识别与生成。
  • 为语言设计者与实现者提供一种实用且自动化的技术,用于从PEG生成示例句子,提升对语法的理解并实现早期缺陷检测。
  • 探索导数在语言工程中的更广泛应用,包括测试、等价性检查,以及支持左递归和结构化数据上的模式匹配等高级特性。

提出的方法

  • 通过在核心PEG表达式中引入通配符($\_$)和失败($\emptyset$)来扩展PEG的导数定义,以支持系统化的导数计算。
  • 将基于导数的识别算法适配至PEG,确保选择项并行评估,并在导数计算过程中保留前瞻约束。
  • 利用PEG表达式的导数系统地探索所有可能的推导路径,通过遍历导数树实现有效句子的生成。
  • 利用基于导数的生成技术,从任意PEG(包括具有否定与肯定前瞻、优先选择的文法)生成具体实例。
  • 通过生成测试句子来检测语法缺陷,例如揭示Ford的$a^n b^n c^n$文法也接受$aaa$,证明其在调试中的实用性。
  • 将该方法推广以支持高级语言特性,如OMeta风格的结构化数据模式匹配,实现用于测试的随机对象生成。

实验结果

研究问题

  • RQ1能否将已在正则表达式和CFG中有效的导数技术扩展至包含优先选择与前瞻等复杂特性的解析表达式文法(PEGs)?
  • RQ2如何为PEG正式定义导数,以在存在否定与肯定前瞻的情况下保持语义正确性?
  • RQ3是否可基于导数方法从任意PEG生成有效句子,即使其具有复杂的语法约束?
  • RQ4基于导数的句子生成在多大程度上能提升语言设计者的工具支持能力,特别是在检测细微语法错误方面?
  • RQ5导数框架能否扩展以支持高级语言特性,如左递归、OMeta风格的模式匹配以及概率等价性检查?

主要发现

  • 本文成功定义了PEG的导数,涵盖所有核心构造,包括$\epsilon$、终结符、非终结符、序列、选择、重复,以及正负前瞻。
  • 基于导数的句子生成技术正确识别了意外的语言成员,如Ford的$a^n b^n c^n$文法中包含$aaa$,揭示了此前未被发现的缺陷。
  • 该方法可在IDE中实现实时语法反馈,即在编辑语法时动态生成示例句子,提升开发人员的理解与早期错误检测能力。
  • 通过从等式两侧的PEG生成随机句子并验证匹配一致性,该方法支持PEG的概率等价性检查。
  • 导数框架可扩展以支持OMeta风格的模式匹配,实现用于测试目的的结构化数据(如对象、数组)的随机生成。
  • 该技术为解决PEG语义中的开放问题(如混合左递归与右递归规则的自然解释)提供了基础,通过导数实现选择项的并行评估。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。