我想知道编程语言开发人员如何验证并证明他们的语法是正确的。假设我为新语言创建了一个新的语法。我可以通过提供不同类型的测试程序,用单元测试工具测试我的语法。但是,我永远不会100%确保我的语法是正确的。语言开发人员如何确保他们的语法在现实世界中是正确的?
我们说我用铅笔和纸创建了一种新语言的语法。但是,我犯了一个错误,我的语法接受了以+ + 2 + 2 +结尾的表达式。如果我没有发现错误,我将使用这种不正确的语法来实现我的语言。实施和单元测试后,我可以找到错误。是否有可能在开始任何实施之前找到它?
当然,我可以尝试使用铅笔和纸张(推导等)的一些样本输入我的语法,但我可能会错过一些角落案例。是否有更好的方法或真正的语言开发人员如何测试他们的语法?
答案 0 :(得分:0)
证明是一个逻辑论证,证明了索赔的真实性。有很多方法可以证明某些事情,因为有各种方法可以解决问题。证明离散结构(如语法)的常用方法是使用数学归纳法。基本上,你表明在基本情况下某些事情是真的 - 尽可能最简单的情况 - 然后表明如果对于所有特定尺寸的情况都是如此,那么对于下一个尺寸的情况必须如此。
在我们的案例中:假设我们只想证明你的语法没有在一个单词的末尾生成+。我们可以对用于构造语言中的字符串的制作数量进行归纳。我们将识别所有相关的基本情况,显示这些字符串的属性保留,然后显示语言中的较长字符串是以不可能在结尾处获得+的方式构造的。这是一个例子。
S:= S + S | (S)| X
基本情况:语言中最短的字符串是x,生成为S - > X。它不以+。
结尾归纳假设:假设使用最多和包括k制作产生的所有字符串都不以+结尾。
归纳步骤:我们必须显示使用超过k个制作而产生的字符串不以+结尾。如果我们将规则(S)应用于从S生成的任何字符串,我们不添加+,因此该属性成立。如果我们将S + S应用于从S生成的字符串,则S + S中的最后一个符号是由S生成的较短字符串的最后一个符号(至少2个符号较短)。通过归纳假设,该字符串不以+结尾,所以这个也不是。没有其他产品,因此语言中没有字符串以+结尾。 QED