如何证明给定语法的正确性?

时间:2017-04-10 11:38:55

标签: programming-languages grammar context-free-grammar formal-verification context-free-language

我想知道编程语言开发人员如何验证并证明他们的语法是正确的。假设我为新语言创建了一个新的语法。我可以通过提供不同类型的测试程序,用单元测试工具测试我的语法。但是,我永远不会100%确保我的语法是正确的。语言开发人员如何确保他们的语法在现实世界中是正确的?

我们说我用铅笔和纸创建了一种新语言的语法。但是,我犯了一个错误,我的语法接受了以+ + 2 + 2 +结尾的表达式。如果我没有发现错误,我将使用这种不正确的语法来实现我的语言。实施和单元测试后,我可以找到错误。是否有可能在开始任何实施之前找到它?

当然,我可以尝试使用铅笔和纸张(推导等)的一些样本输入我的语法,但我可能会错过一些角落案例。是否有更好的方法或真正的语言开发人员如何测试他们的语法?

1 个答案:

答案 0 :(得分:0)

证明是一个逻辑论证,证明了索赔的真实性。有很多方法可以证明某些事情,因为有各种方法可以解决问题。证明离散结构(如语法)的常用方法是使用数学归纳法。基本上,你表明在基本情况下某些事情是真的 - 尽可能最简单的情况 - 然后表明如果对于所有特定尺寸的情况都是如此,那么对于下一个尺寸的情况必须如此。

在我们的案例中:假设我们只想证明你的语法没有在一个单词的末尾生成+。我们可以对用于构造语言中的字符串的制作数量进行归纳。我们将识别所有相关的基本情况,显示这些字符串的属性保留,然后显示语言中的较长字符串是以不可能在结尾处获得+的方式构造的。这是一个例子。

S:= S + S | (S)| X

基本情况:语言中最短的字符串是x,生成为S - > X。它不以+。

结尾

归纳假设:假设使用最多和包括k制作产生的所有字符串都不以+结尾。

归纳步骤:我们必须显示使用超过k个制作而产生的字符串不以+结尾。如果我们将规则(S)应用于从S生成的任何字符串,我们不添加+,因此该属性成立。如果我们将S + S应用于从S生成的字符串,则S + S中的最后一个符号是由S生成的较短字符串的最后一个符号(至少2个符号较短)。通过归纳假设,该字符串不以+结尾,所以这个也不是。没有其他产品,因此语言中没有字符串以+结尾。 QED