编译器语法推导(1)基本定义(逐句举例对照)

编译器语法推导(1)基本定义

在文法定义中,我们讲到了两个概念,分别是终结符号非终结符号。回忆一下二者。

  • 终结符号
词法单元,不可再变
  • 非终结符号
词法变量,尚未确定

比如

stmt -> if(expr) stmt else stmt

其终结符号为

if, (), {}

非终结符号为

expr, stmt

术语

  • 语言
从开始符号推导得到所有终结符号串的集合称为该文法定义的语言。

比如在语法定义的例子中,从一个9-5+23-17这样一个表达式推导出所有的终结符号

+ - 0 1 2 3 4 5 6 7 8 9

这样就可以推导完成

反过来,如何判断9-5+2是属于上述推导出来的语言呢?

首先看看产生式

list -> list + digit | list - digit | digit

然后把9-5+2中的终结符全部放入产生式

  • 9digit,所以9list
  • 9-5是中间段list-digit的表达式,5digit, 所以9-5也是list
  • 然后再看+2部分,由于前面9-5已经是list,所以9-5+2也就是list+2,然后2digit,所以9-5+2也就是list + digit,也是list

至此可以说,9-5+2根据产生式右部的定义可以推导出左部,也就是说9-5+2就是产生式所定义的语言

语法分析

书上定义(读起来很拗口,说不定越看越糊涂)

语法分析(Parsing)的任务是:接收一个终结符号串作为输入,找出从文法的开始符号推导出这个串的方法。如果不能从文法的开始符号推导得到该终结符号串,则报告该终结符号串包含的语法错误。

回到上面的例子,来对应书中的每一句话

  • 接收一个终结符号串作为输入
    对应 9-5+2

  • 找出从开始符号推导出这个串的方法
    对应 找出9-5+2的产生式

list-> list + digit | list - digit | digit; digit -> 0|1|2|3|4|5|6|7|8|9
  • 如果不能从文法的开始符号推导得到该终结符号串,则报告终结符号串包含的语法错误。

反例, 9-+5+2
对应 无法最后得到list

关于编译原理中产生式的常见表达方法

很多时候,产生式并不会像上面的所述的那么容易看出来。比如下面

call -> id(optparms)
optparams -> params | e
params -> params, param | param

注意:

e是
ϵ \epsilon ϵ
表示Empty,即空集,也就是什么都没有。

这里还是可以用语法定义中对产生式的定义和替换的方法来看

call可以具有以下形式:id(optparams)
其中optparams可以具有以下形式:params 或 空集
其中params可以具有以下形式:params, param 或 param
举例

max(x,y)是上述产生式的语言

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值