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

Programming languages 如何证明给定语法的正确性?,programming-languages,grammar,context-free-grammar,formal-verification,context-free-language,Programming Languages,Grammar,Context Free Grammar,Formal Verification,Context Free Language,我想知道编程语言开发者如何验证和证明他们的语法是正确的。假设我为一门新语言创建了一种新语法。我可以通过提供不同类型的测试程序,使用单元测试工具测试我的语法。然而,我永远不会100%保证我的语法是正确的。语言开发人员如何确保他们的语法在现实世界中是正确的 比如说,我用铅笔和纸为一种新语言创建了语法。然而,我犯了一个错误,我的语法接受以+结尾的表达式,比如2+2+。如果我没有发现错误,我会用这个错误的语法来实现我的语言。在实现和单元测试之后,我可以找到错误。是否有可能在开始任何实施之前找到它 当然,

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

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


当然,我可以用铅笔和纸(派生词等)试着输入我的语法,但我可能会错过一些小例子。在真正的语言开发人员中,有没有更好的方法或者如何测试他们的语法?

证明是一种逻辑论证,它证明了一种说法的真实性。证明某事的方法和思考问题的方法一样多。证明离散结构(如语法)的常见方法是使用数学归纳法。基本上,你可以在基本情况下证明某些东西是正确的——最简单的情况是可能的——然后证明,如果在某个大小下所有的情况都是正确的,那么在下一个大小的情况下它一定是正确的

在我们的例子中:假设我们只想证明你的语法没有在一个单词的末尾生成+。我们可以对在语言中构造字符串时使用的结果的数量进行归纳。我们将确定所有相关的基本情况,显示这些字符串的属性,然后显示该语言中较长的字符串是以这样一种方式构造的,即不可能在最后得到+的。这里有一个例子

S:=S+S |(S)| x

基本大小写:语言中最短的字符串是x,生成为S->x。它不以+结尾

归纳假设:假设使用最多k个产生式(包括k个产生式)产生的所有字符串都不以+结尾


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

语法“正确”是什么意思?或者你的意思是问如何检查解析器是否正确识别了预期的语法?理论上,你会给出正确性证明。我不知道这是否是在现实世界中完成的,但我对此表示怀疑。如果没有正确性证明,你就不知道语法是正确的。因此,也许人们不知道他们的语法是否正确——或者,更确切地说,语法被定义为正确的,没有人真正知道他们描述的是什么语言!我更新了我的问题。我怎样做语法的正确性证明?有什么联系或解释吗?