编程语言语法描述工具-巴克斯范式

语法描述;

我们采用一种称为巴克斯范式的注释法书写语法,这种方式由John Bakcus发明(他是Fortain语言的首席设计师)。Fortain语言的设计师们描述Fortain的方法是使用大量的例子和文字进行解释,这种方式很有效,很多程序员能够理解并猜测出正确的含义,但是与足够精确还相距甚远。后来在描述Algol语言的时候,这种非正式的描述方法的不够精确的缺点逐渐凸显,于是John Bakcus就发明了我们现在用来描述语言的这种注释法。

巴克斯构造

巴克斯范式的目的是以一种简单概括的方式来精确地描述语言;巴科斯范式义同BNF范式(BNF: Backus-Naur Form 的缩写)描述计算机语言语法的符号集。

  1. BNF范式是一种用递归的思想来表述计算机语言符号集的定义规范
  2. 法则:
    1. ::=表示定义;
    2. “ ”双引号里的内容表示字符;
    3. <>尖括号里的内容表示必选内容;
    4. | 竖线两边的是可选内容,相当于or;
      现在在网络上大多数能搜出来的都是extended BNF ,允许使用循环,但正真的BNF只需要递归就够了。(多看一些例子就懂了~)

非终止符;用尖括号括起来;中间是一个箭头;然后右边是一个可替换项;

<non-terminal>->replacement //替换项可以是任何的东西,可以是非终止符,终止符等

推导(derivative)的过程

碰到终止符就需要停止,一个推导意味着从非终止符开始,按照此类来构成,最终左侧只剩下终止符,我们就用语法构成了一个句子;

编程语言,比如python必须符合编码规范(match the grammar exactly)。我们使用自然语言交流的时候,尽管不经意间会出现一些小错误,也能让别人理解我们的意思;以英文举例子,me love you;尽管有语法错误,但是我想大家还是能理解这句话的意思;但是编程语言不同,它的代码必须严格符合语法;

我们先来看看python语言中算数表达式的相关语法;
Python Grammer for Arithmetic Expressions

<Expressions>-><Expression><Operator><Expression>

这条规则看起来有点像循环(circular),不过因为我们还有其他的规则,所以并不是彻底的循环(completely circular),这称为递归定义(recursive definition)
To make a good recursive defintion,we need at least two rules,we need one where we can keep going,we need one where we can stop;

< Expressions >->< Expression ><Operator>< Expression>
< Expressions >->< Number >
< Operator>->+
< Operator>->*
< Number>->0,1,... //对于数字的指定有些复杂,我们假设这些数字已知

以上的语法规则虽然很短,但是却能表达无穷无尽的内容(express infinitely many things)
原因是两侧都有表达式,我们可以用一个衍生的表达式去替换另一个表达式,并这样重复下去;
我们再加一条规则

<Expressions>-><Expression><Operator><Expression>
<Expressions>-><Number>
<Operator>->+
<Operator>->*
<Number>->0,1,... //对于数字的指定有些复杂,我们假设这些数字已知
<Expressions>->(<Expression>)

虽然这是一个很短的语法,但是他已经强大到足够生成我们遇到的所有python表达式了
print 6+ //不合法
print 6+6 //合法
为什么”6+“不合法呢?
因为推导不出来啊

发布了52 篇原创文章 · 获赞 72 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/engineerxin/article/details/89646459