【编译原理】-- 第二章(一)(文法和语言的定义、递归规则与递归文法、例题)

目录

形式化方法

语言的定义可采用下列三种方法

一、文法和语言的定义

1、字母表和符号串的基本概念和术语

(1)字母表

(2)符号串

(3)字母表∑上的符号串的递归定义。

(4)符号串的前缀、后缀和字串

(5)符号串的连接和方幂

(6)符号(符号串)集合的正闭包A+

(7)符号(符号串)集合的闭包A*

2、文法的形式定义

(1)规则(产生式)

(2)文法G[Z]

(3)字汇表V

(4)文法的四元组表示

3、推导的形式定义

(1)直接推导

(2)推导(长度为n)

4、语言的形式定义

(1)句型

(2)句子

(3)语言

5、等价文法

二、递归规则与递归文法

1、递归规则

2、文法的递归性

三、例题

1、语言L={ambn ,m>=0,n>=0},试写出文法

2、语言L={(ab)ncm ,n>=0,m>=1},试写出文法。


形式化方法

简单来说,就是用一套带有严格规定的符号体系来描述问题的理论和方法,用形式化方法描述的语言便是形式语言。

语言的定义可采用下列三种方法

  • 枚举法--把该语言的所有句子列出放在一集合内(有限个句子时)
  • 有限条规则--描述语言的全部句子(有限或无限个句子),即文法表示。
  • 装置--检验和识别句子(有限或无限个句子),即自动机。


一、文法和语言的定义

1、字母表和符号串的基本概念和术语

(1)字母表

元素的非空有穷集合,元素称符号。

例:∑={0,1}        ∑={a,b}

(2)符号串

字母表中的符号所组成的任何有穷序列。

特别:空符号串      ε(不包含任何符号)

(3)字母表∑上的符号串的递归定义。

  • ε是∑上的符号串
  • 若x是∑上的符号串,且a∈∑,则xa或ax是∑ 上的符号串,特别:ε x = x ε= x
  • 若y是∑上的符号串,当且仅当y可由以上两条产生。

例:

∑ ={b,c} ,求∑上的所有符号串

根据1, ε是 ∑上的符号串

根据2, ε b和εc 即b,c 是∑上的符号串,bb,bc,cb,cc 是∑上的符号串
bbb,bbc ,bcb ,bcc ,cbb ,bcb ,ccb , ccc是∑上的符号串.......

∑上的 所有符号串 ε ,b , c, bb,bc,cb,cc, bbb,bbc ,bcb ,bcc ,cbb ,bcb ,ccb , ccc......

(4)符号串的前缀、后缀和字串

前缀:设x是一符号串,从x的尾部删去若干个(包括0个)符号之后所剩余下的部分称为x的前缀 ;
若x的前缀不是x本身,则称为x的真前缀。

后缀:设x是一符号串,从x的头部删去若干个(包括0个)符号之后所剩余下的部分称为x的后缀 ;
若x的后缀不是x本身,则称为x的真后缀。

子串:从一个符号串中删去它的一个前缀和一个后缀之后所剩下的部分称为此符号串的子串。
若x的子串不是x本身,则称为x的真子串。

例:

设x=abc       (x= ε a ε b ε c ε)

x前缀:abc   ab   a   ε(ε ,a,ab为真前缀)

x后缀:abc   c   bc   ε( ε, c,bc 为真后缀)

x字串:abc   ab   bc   a   b   c   ε(ε ,a,ab,b,c,bc为真子串)

(5)符号串的连接和方幂

连接:设有符号串x,y,把y的符号写在x的符号之后所得的符号串,叫做x与y的连接,记xy

方幂:设有符号串x,则x的n次自身连接称为x的n次方幂,记为xn特别:x0 = ε

(6)符号(符号串)集合的正闭包A+

设A为符号集合,则定义A的正闭包A+为:A+  =  A1∪A2 ∪ A3 ∪... ... ∪ An ∪ ... ...

A+是由A上的元素构成的符号串(除ε)的集合.

例:

设A={b , c}
则 A+ =  {b , c} ∪{bb,bc,cb,cc} ∪ ... ...
= {b , c, bb,bc,cb,cc, bbb,bbc ,
bcb ,bcc ,cbb ,bcb ,ccb , ccc......}

(7)符号(符号串)集合的闭包A*

设A为符号集合,则定义A的闭包A*为:A*=A0 ∪ A+= {ε} ∪ A+

则A*={ε}∪{b,c}∪{bb,bc,cb,cc}∪ ... ...= {ε,b,c,bb,bc,cb,cc,bbb,bbc,bcb,bcc,cbb,bcb,ccb,ccc......}

A*是由A上的元素构成的所有符号串的集合.

2、文法的形式定义

文法是用来描述语言的。

(1)规则(产生式)

一有序对(U,x) 记为U→x或U::=x。

规则的左部:U是符号(有的文法也可为符号串)

规则的右部:x是有穷符号串表示: U定义为x

(2)文法G[Z]

规则的非空有穷集合。

Z:开始符号(识别符号),至少在一条规则的左部出现。

(3)字汇表V

规则左右部中所有符号组成的集合。

非终结符号:规则左部出现的符号,组成非终结符号集合Vn

终结符号:规则中不属于Vn的符号组成终结符号集合Vt;V = Vn∪Vt

非终结符号以< >括起,但当是大写字母是时常省略。

(4)文法的四元组表示

G = (Vn,Vt,P,Z)

其中,Vn:非终结符号集

           Vt:终结符号集

            P:规则的集合

            Z:文法的开始符号

说明:

规则中有相同的左部时:V→ x
V → y
...
V → z
写成:V →x|y|...|z (’|’表示‘或’)

3、推导的形式定义

(1)直接推导

如果U→u是G中的一条规则,x,y∈V*,则将规则U→u用于符号串r=xUy上,得到符号串w =xuy,记为: xUy => xuy (r=>w)

称符号串w是符号串r的直接推导,或符号串r直接产生了符号串w,也称w直接归约到r。

例:

上述文法G[S]可进行的直接推导

文法BNF表示为
G[S]:
S → aB | bA
A →a | aS | bAA
B →b | bS | aBB
① S=>aB         (规则S → aB )
U =>u               (规则U → u , x,y均为ε )
② abS=>abbA  (规则S →bA)
xU =>xu            (规则U → u , x为ab,y为ε )
③ aB=>aaBB    (规则B →aBB)
xU =>xu             (规则U → u , x为aaB,y为ε )
④ aaBB => aabSB (规则B →bS)
xUy =>xuy          (规则U → u , x为aa,y为B )

上述文法G[S]可进行的系列直接推导
推导过程                         使用规则
S=>aB                               S → aB
=>abS                                B →bS
=>abbA                              S → bA
=>abbbAA                          A → bAA
=>abbbaA                           A →a
=>abbbaa                           A →a

只要符号串中存在非终结符号,推导就能继续,直至符号串全由终结符号组成,这也是为什么称终结符和非终结符的原因。

(2)推导(长度为n)

设u0,u1,...un(n>0)均∈V*,且有r=u0=>u1=>......=>u n-1=>un=w,记为r =+>w。

则称以上序列为长度n的推导,也称r产生w(w归约为r)

特别:如果r=+>w(一步或一步以上)或r=w(0步),记为 r=*>w

4、语言的形式定义

(1)句型

设有文法G[Z],如果有Z=*>x , x ∈V*,则称x是文法G的一个句型。

凡是由开始符号(识别符号)推导出来的字汇表V上的终结和非终结符号组成的符号串w称为句型。

(2)句子

如有Z=+>x(或Z=*>x)且x∈Vt*,则称x是文法G的一个句子。

由Z推导出的终结符号组成的符号串为句子。

(3)语言

文法G[Z]产生的所有句子的集合, 称文法G[Z]所定义的语言,L(G[Z])={x|x∈Vt*且Z=+>x}

5、等价文法

描述相同的语言的不同文法为等价文法。

例:

G1[A]:A→Bb
          B→a                  L(G1)={ab}
G2[A]:A→ab                L(G2)={ab}


G1≠G2但L(G1)=L(G2),称G1和G2为等价文法。

G3[S]:S → A | S-A
          A → a | b | c
G4[S]:S → A | A-S
          A → a | b | c
符号串a-b-c是G3[S] 、G4[S]合法句子,但语义不同。
G3计算为左结合 (a-b)-c
G4计算为右结合 a-(b-c)

说明:

  • 给定一文法,就能从结构上唯一确定其语言,即 G 唯一确定 L(G)
  • 给定一语言,能确定其文法,但这种文法不是唯一的。 即L 确定 G1,或G2...

二、递归规则与递归文法

1、递归规则

形如U→xUy U∈Vn, x,y∈V*,左右具有相同的非终结符号的规则。

特别:U→Uy (x=ε)左递归规则
        U→xU (y=ε)右递归规则
        U→xUy (x,y≠ε)自嵌入递归规则

2、文法的递归性

直接递归性:文法中至少包含一条递归规则。

间接递归性:文法的任一非终结符号经一步以上推导产生的递归性。

文法的递归性原则:文法具有直接递归性或间接递归性,否则,文法无递归性。

例:

G[Z]:Z→aZb∣ab            具有直接递归性


G[Z]:U →Vx
          V →Uy ∣z                具有间接递归性
原因:U=>Vx=>Uyx

三、例题

1、语言L={ambn ,m>=0,n>=0},试写出文法

解:分析 S→AB A表示am B表示bn
A→aA|ε 或者A→ Aa|ε 递归规则
B→bB|ε 或者B→ Bb|ε 递归规则

得文法 G[S]:S→AB
A→aA|ε
B→bB|ε

2、语言L={(ab)ncm ,n>=0,m>=1},试写出文法。

解:分析 需要递归规则,最短句子ε
S→AB 使得A对应(ab)n 最短ε
B对应cm 最短ε
A→abA|ε
B→cB|c 或B→Bc|c

得文法 G[S]:S→AB
A→abA|ε
B→cB|c


  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
由于您没有给出文法的具体定义,我将给出一个基本的文法计算器的Bison代码,您可以根据需要进行修改和扩展。 首先,我们需要定义文法中的终结符和非终结符。假设我们有以下文法规则: ``` expr -> term expr -> expr + term term -> factor term -> term * factor factor -> NUMBER factor -> ( expr ) ``` 其中,`NUMBER`是一个整数常量。那么我们可以将其翻译成以下Bison代码: ``` %{ #include <stdio.h> %} %token NUMBER %left '+' '-' %left '*' '/' %% expr: term | expr '+' term | expr '-' term ; term: factor | term '*' factor | term '/' factor ; factor: NUMBER | '(' expr ')' ; %% int yylex(void) { int c; do { c = getchar(); } while (isspace(c)); if (isdigit(c)) { int val = c - '0'; while (isdigit(c = getchar())) { val = val * 10 + c - '0'; } ungetc(c, stdin); yylval = val; return NUMBER; } return c; } int yyerror(const char *msg) { fprintf(stderr, "error: %s\n", msg); return 1; } int main(void) { yyparse(); return 0; } ``` 在Bison代码中,我们使用`%token`指令定义终结符`NUMBER`,并使用`%left`指令定义运算符的优先级和结合性。在规则中,`expr`表示表达式,`term`表示项,`factor`表示因子,这些都是非终结符。规则中使用`|`表示可能的选择,使用`'+'`、`'-'`、`'*'`和`'/'`表示运算符。 在Bison代码中,我们还定义了`yylex()`函数,它从标准输入中读取输入,并返回识别到的终结符类型。在本例中,我们只需要识别整数常量。`yyerror()`函数用于处理语法错误,`main()`函数则调用`yyparse()`函数开始解析输入。 现在,我们可以将以上代码保存为`calc.y`,并使用以下命令编译它: ``` bison -d calc.y gcc calc.tab.c -o calc ``` 然后,我们就可以运行这个文法计算器了: ``` $ ./calc 1+2*3 7 (1+2)*3 9 ``` 以上是一个基本的文法计算器,您可以根据需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天行健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值