【编译原理·总复习】第二章||文法语言||语法树||最左最右推导归约||句柄直接短语||例题+知识点

41 篇文章 1 订阅
4 篇文章 6 订阅

step by step.

目录

一、 程序设计语言的精确定义和描述

1、语法:语言结构的定义。

2、语义:描述语言的含义。

3、语用:从使用的角度描述语言。

二、 字母表与符号串

1、 字母表

例题: 

2、 符号:字母表里的元素。

例题:

3、 符号串:符号的有穷序列。

例题:

三、 符号串的运算

1、 符号串的连接

例题:

2、 符号串的乘积

3、 符号串的幂运算

 例题:

4、 集合的幂运算

例题:

5、 集合的正闭包和闭包

例题:

6、 例题

例题: 

四、 文法的形式定义

1、 规则-BNF

2、 文法

例题:

 例题:

五、 语言的形式定义 

1、句子

例题:

2、 语言

3、 规范推导

 4、 规范归约

例题:

5、 短语和句柄

例题:

六、 语法树

1、 语法树的生成 

例题:

例题:

2、 子树

3、 简单子树 

4、 短语、直接短语、句柄

5、 二义性(没有优先性的)

七、 2型文法、3型文法

1、 2型文法

2、 3型文法(正规文法)

 3、 例题

例题:

八、 例题练习


 光看不练没有效果


一、 程序设计语言的精确定义和描述

1、语法:语言结构的定义。

(eg. 赋值语句由一个变量、一个后随赋值号“=”、一个表达式构成。)

2、语义:描述语言的含义。

(eg. 先计算右部表达式的值,然后把所得结果送入左部变量中)

3、语用:从使用的角度描述语言。

(eg. 赋值语句用于计算和保存表达式的值)


二、 字母表与符号串

1、 字母表

字母表是元素的非空又穷集合。(不是26个字母表)

例题: 

机器语言的字母表:0、1——    \sum (0 ,1)    

🔺注字母表里的元素可以是数字、字母或其他符号

2、 符号:字母表里的元素。

例题:

机器语言的字母表中的符号为0和1

3、 符号串:符号的有穷序列。

例题:

  \sum a,b,c 的符符号串为:a,b,ab,ba,cba,abc,...

🔺注:符号串中符号的顺序很重要。

符号串总是建立在某个特定字母表上的且只能由字母表上的有穷多个符号组成。

\varepsilon:不包含任何符号的序列

\varphi:不含任何元素的空集  


三、 符号串的运算

 \varepsilon:不包含任何符号的序列;

\phi:不包含任何元素的空集。

1、 符号串的连接

串a和串b的连接,ab👉即,串b写在a串之后得到的字符串。 

例题:

x=abc, y=10a; xy=abc10a, yx=10aabc

2、 符号串的乘积

串a和串b的乘积,ab👉即,满足的所有构成的集合。 

🔺:任意符号串x:

\varepsilon x=x\varepsilon =x

3、 符号串的幂运算

x^{0}=\varepsilon

x^{1}=x

x^{2}=xx   

 例题:

x=abc,


x^{2} = abcabc

👆注意顺序

4、 集合的幂运算

        A^{0}=\left \{ \varepsilon \right \}

例题:

A={a,b} 


 A^{2} =AA={aa,ab,bb,ba}

5、 集合的正闭包和闭包

正闭包: A^{+}A^{1}\cup A^{2}\cup A^{3}\cup …

闭包A^{*}  = { \varepsilon } \cup A^{+}

例题:

A={a,b}


正闭包A^{+}:{a,b,aa,ab,bb,ba,aaa,aab,...}

闭包:    A^{*}:{\varepsilon,a,b,aabab,bb,ba,aaa,aab,...}

6、 例题

例题: 

 光看不练没有效果。。


四、 文法的形式定义

有穷集合的语言描述:枚举法。

无穷集合的语言描述:文法(含递归) 。

文法的组成:文法终结符集合;文法非终结符集合;文法规则的集合。

1、 规则-BNF

一个符号与一个符号串的有序对——

A\rightarrow \beta

2、 文法

文法:描述语言的语法结构的形式规则。文法是规则的非空有穷集合。

上下文无关文法:文法所定义的语法范畴完全独立于这种范畴可能出现的环境。

例题:


 例题:

∑={0,1} , 则集合 ∑+表示为递归文法:

解:

A→0        A →1

A→A0       A →A1


五、 语言的形式定义 

1、句子

仅含终结符号的句型是一个句子。

例题:

对: S→01| S01

有: S=>01

        S=>0S1

        S=>00S11

        S=>000111


句型:01,0S1,00S11,000111

句子:01,000111

2、 语言

由文法G产生的所有句子所组成的集合就是语言L(G)。 (P16)

3、 规范推导

最左推导:每一步都替换最左边的非终结符号。

最右推导(规范推导):每一步都替换最右边的非终结符号。

 4、 规范归约

规约:推导的逆过程。

例题:

5、 短语和句柄

句柄:一个句型的最左直接短语。

例题:


六、 语法树

1、 语法树的生成 

例题:

E→ T|E+T|E-T     T→  F|T*F|T/F      F→  (E)|i


例题:

G=(VT,VN,S,P),   其中

P:    S→aAS | a     A →SbA | SS | ba


2、 子树

自己也是自己的子树。

3、 简单子树 

简单子树:只有单层分支的子树。

4、 短语、直接短语、句柄

短语——子树的叶子形成的符号串。

直接短语——简单子树的叶子形成的符号串。

句柄——最左简单子树的叶子形成的符号串。

5、 二义性(没有优先性的)

如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。


七、 2型文法、3型文法

1、 2型文法

2型文法也称上下文无关文法,非终结符的替换不考虑上下文。 

2、 3型文法(正规文法)

3型文法等价于正规式,也称正规文法。  

 3、 例题

例题:

考虑文法G[S]:

  S → AB     A → aA|a      B → bB|b

定义的语言为:L(G[S])= {a^{n}b^{m} | n,m³1}


是2型文法。

但这个是线性问题,所以也可以写3型文法:

S → aA     A → aA| bB          B → bB| e

八、 例题练习

1. “→” 符号表示:_____

定义为;


2. 设有文法G[E]:

E → E+T | E-T | T

T → T*F | T/F | F

F  → (E) | i

该文法句型E+T*F的句柄是:______

T*F;


3. 设有文法G[T]:

T → T*F | F

F → F↑P | P

P → (T) | a

该文法句型T*P↑(T*F)的直接短语是:_____

P; T*F


 !考试加油  !


  • 15
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,我们需要构造该文法的 LR(0) 项集族和 SLR(1) 分析表。 构造 LR(0) 项集族: $I_0 = \{A' → ·A\}$ $I_1 = \{A → ·fAa, A → ·fAg, A → ·b\}$ $I_2 = \{A → f·Aa, A → f·Ag\}$ $I_3 = \{A → fa·a, A → fa·g\}$ $I_4 = \{A → fA·a, A → fA·g\}$ $I_5 = \{A → fAg·\}$ $I_6 = \{A → fAa·\}$ $I_7 = \{A' → A·\}$ 构造 SLR(1) 分析表: | 状态 | f | a | g | b | $ | A | | ---- | --- | --- | --- | --- | --- | --- | | 0 | s1 | | | | | G | | 1 | | s3 | s4 | | | | | 2 | s6 | | | | acc | | | 3 | | | | r2 | r2 | | | 4 | | | | r3 | r3 | | | 5 | | | | r1 | r1 | | | 6 | | | | r4 | r4 | | 其中,状态 0 的状态标记为 G,表示文法的起始符号。对于状态转移,例如状态 1 的 $f$ 转移 $s1$ 表示在状态 1 读入 $f$ 后转移到状态 1。对于归约操作,例如状态 3 的 $b$ 转移 $r2$ 表示在状态 3 读入 $b$ 后执行 $A → fAg$ 的归约操作。 在 SLR(1) 分析表中,出现了状态 1 和状态 2 之间的归约-移进冲突,这说明该文法不是 SLR(1) 文法。因此,该文法不是 SLR(1) 文法。 ### 回答2: 要判断一个文法是否是SLR(1)文法,需要经过以下步骤: 1. 对于文法中的每一个产生式,将其扩展成项目集。对于给定的文法A→fAa|fAg|b,将其转化为项目集如下: I0: A'→·A, A→·fAa, A→·fAg, A→·b I1: A→f·Aa, A→f·Ag I2: A→fA·a, A→fA·g I3: A→b· 2. 构建DFA。从初始项目集I0开始,依据项目的闭包和Go函数构建DFA。其中,闭包操作会将所有可达的项目都加入到项目集中,Go函数表示在给定一个符号后,能够转移到哪个项目集。 初始状态是I0,根据Go函数可得到: Go(I0, f) = I1 Go(I0, b) = I3 Go(I1, A) = I2 Go(I2, a) = I1 Go(I2, g) = I1 构建DFA如下: I0 -f-> I1 I0 -b-> I3 I1 -A-> I2 I2 -a-> I1 I2 -g-> I1 3. 分析DFA中的冲突。对于SLR(1)文法,不应该存在移进-归约冲突和归约-归约冲突。具体分析如下: - 在I1状态中,存在移进-归约冲突,即Go(I1, a)和Go(I1, g)都指向了I1。这是因为在该文法中,存在一个前缀相同的产生式A→fAa和A→fAg,因此无法消除冲突。 因此,根据以上分析,该文法不是SLR(1)文法。 ### 回答3: 编译原理中的SLR(1)文法是指可以通过SLR(1)分析方法进行分析的文法。而SLR(1)分析方法是一种自底向上的语法分析方法,通过构造分析表来实现对文法的分析。 判断一个文法是否是SLR(1)文法,需要满足以下两个条件: 1. 没有移进-归约冲突:对于文法中的任何一个项目 X → α•aβ,如果存在一个状态 i,在状态 i 中既有一个归约项目 X → α• 和一个移进项目 a,那么该文法就不是SLR(1)文法。 2. 没有归约-归约冲突:对于文法中的任何两个归约项目 X → α• 和 Y → β•,如果存在一个状态 i,在状态 i 中既有归约项目 X → α• ,又有归约项目 Y → β•,那么该文法就不是SLR(1)文法。 对于给出的文法 A → fAa|fAg|b,我们来进行判断: 1. 构造项目集规范族: I0: A' → •A, A → •fAa, A → •fAg, A → •b I1: A' → A•, A → f•Aa, A → f•Ag, A → •fAa, A → •fAg, A → •b I2: A → fA•a, A → fA•g I3: A → fAg• 2. 构造LR(0)分析表: f g a b $ ------------------------ 0 s2 s3 1 1 acc 2 s2 s3 4 3 s5 4 r1 5 r2 分析表中的s表示移进,r表示归约,acc表示接受,空表示报错。 3. 判断是否有移进-归约冲突和归约-归约冲突: - 对于状态1,存在移进项目f和归约项目A → •fAa,存在移进-归约冲突,所以该文法不是SLR(1)文法。 综上所述,给出的文法 A → fAa|fAg|b 不是SLR(1)文法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值