c语言 bnf,c语言bnf范式.pdf

c语言bnf范式

BNF 范式简介

席圣渠 2014/10/24

巴科斯范式(BNF 范式)是一种用于描述给定语言语法的形式化符号规范,很多编程语言的语法规则都

是通过 BNF 范式来定义的。BNF 的基本思想是一个符号可以被满足给定规则的一系列符号替换,它以

递归的方式描述语言中的各种成分,从一个起始符号开始,通过不断的符号替换,就可以得到多种多样

并且符合语法规则的程序。

我们以 C 语言为例。在 C 语言中,语句可以分为五个种类,即表达式语句、控制语句、复合语句、调用

语句和空语句。那么,我们可以说:

语句 是 表达式语句 或者 控制语句 或者 复合语句 或者 调用语句 或者 空语句

这句话的含义很清楚,接下来,我们尝试用符号来表达这句话的意思,可能是:

Stmt ::= ExpStmt | CondStmt | CompStmt | FuncStmt | SEMI

上述符号化的表述方式,就是 BNF 范式的表达方式,每一个符号的含义与自然语言的描述一一对应。

现在,语句已经被定义好了,但是我们还不清楚每一类语句,比如表达式语句的含义。因此,我们继续

定义表达式语句:

表达式语句 是 表达式 分号

其对应的符号化表示为:

ExpStmt ::= Exp SEMI

就像这样,表达式语句也被定义好了,这就是文章刚开头指出的,递归的方式。只要不断的定义下去,

就能得到一种语言的整体的描述。那么,问题就来了,递归的定义什么时候终止呢?其实,只要符号被

表述成具体的内容就可以了,比如说分号或者加号就是具体的内容,更具体的例子就是:

Type ::= "int" | "float"

即类型Type 这个抽象符号可以被字符串 int 或者 float 替换,由于int 和 float 都是具体的表述,我们的

递归定义也就可以终止了。

一般的 BNF 范式的表述规则如下:

1. 在双引号中的字( "word" )代表着这些字符本身。

2. 方括号( [ ] ) 内包含的为可选项。

3. 大括号( { } ) 内包含的为可重复0 至无数次的项。

4. 竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。

5. ::= 是“被定义为”的意思。

我们用这些规则,简单的表述一下 C 语言中的 i 语句:

IF ::= "if"

ELSE ::= "else"

LP ::= "("

RP ::= ")"

IfStmt ::= IF LP CompareExp RP Stmt [ELSE Stmt]

其中 CompareExp 表示比较表达式,Stmt 表示语句,这里就不递归定义了。

好了,关于 BNF 范式的基本知识,我们就讲完了,下面来说说这次作业。

1. 不需要递归定义所有符号,比如变量可以直接用Var 表示,递归定义 Var 就不需要了。但是,请

确保符号的含义能通过其名字猜测出来。

2. BNF 的表述规则尽可能符合规范,但不做强制要求。

3. 增加一条表述规则,大括号后边紧跟加号( { }+ )表示,大括号内部包含的内容至少 1 次。

以上内容应该可以帮助你完成作业了,如果依然有疑问,我会在QQ 上尽力解答。

祝好~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值