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

语法描述;

我们采用一种称为巴克斯范式的注释法书写语法,这种方式由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+“不合法呢?
因为推导不出来啊

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据上机练习一给出的PL/0语言扩充的巴克斯范式语法描述,我们主要利用递归下降来对语法进行分析和解析。递归下降是一种自顶向下的语法分析方法,可以根据产生式规则来递归地分析输入的代码。 首先,我们需要扩展原有的巴克斯范式语法描述,增加新的非终结符和产生式规则。例如,我们可以添加一个非终结符declaration来表示声明语句,以及相应的产生式规则。 在编写递归下降分析器时,我们首先要定义一些函数来对不同的非终结符进行分析。例如,我们可以编写一个函数parseDeclaration来分析声明语句。在这个函数中,我们可以首先判断当前的token是否符合声明语句的语法规则,如果是的话我们可以进一步解析该声明。 在函数中,我们可以根据产生式规则递归地调用其他的分析函数,例如parseExpression来解析表达式,parseStatement来解析语句等等。这样,我们可以根据产生式的规则来逐步解析整个程序。 当遇到终结符时,我们可以根据终结符的类型来进行相应的操作和判断。例如,当遇到标识符时,我们可以将其加入符号表中;当遇到数字时,我们可以将其转换为相应的值。 递归下降分析的过程中,我们需要进行语法错误的处理。例如,当发现输入的代码不符合语法规则时,我们可以输出错误信息并进行相应的纠正。 总的来说,根据上机练习一给出的PL/0语言扩充的巴克斯范式语法描述,我们可以利用递归下降分析方法来解析和分析该语言。通过定义适当的函数和产生式规则,我们可以逐步解析整个程序,并进行相应的语义处理和错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值