编译原理复习资料

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理

一、填空题

1.什么是编译程序?

它是能够把某一种语言程序(即源语言程序)转换成另外一种语言程序(即目标程序)的一个程序,前者与后者在逻辑上是等价的。

2.源程序中的错误通常分为语法错误和语义错误两大类。

3. 文法是描述语言的语法规则的刑事规则(语法规则)。上下文无关文法所定义的语法范畴是完全独立于这种范畴可能出现的环境的。

4.产生式的构成:一组终结符号VT,一组非终结符号VN,一个开始符号S,一组产生式。

5.句型:任何能由开始符号推出的符号串。

句子:只含有终结符的句型。

语言:文法所有句子的集合。

6.属性文法:是在上下文无关文法的基础上,为每个文法符号(含终结符和非终结符)配备若干个属性值,对文法的每个产生式都配备了一组属性计算规则(称为语义规则)。在语法分析过程中,完成语义规则所描述的动作,从而实现语义处理。

7.属性文法分为综合属性和继承属性。

二、判断题

1.判断二义性:是否存在两颗不同的语法树,存在则即是二义性。

2.给出文法判断类型:0型短语文法,产生式的左右部都可以使用终结符和非终结符随意组合,但左部不能为空,如DAaBb->CcdD;;1型上下文有关文法,在0型文法的基础上,右部(空除外)长度大于等于左部,如AaBb->CcddDd;2型上下文无关文法,在1型的基础上,左部只能有一个非终结符,如A->CcdddDd;3型右(左)线性文法,在二型的基础上,如A->CcdddDd。

3.短语:设αβδ是文法G[S]中的一个句型,如果有S=*>αAδ且A=+>β,则称β是句型αβδ相对于非终结符A的短语。

直接短语:特别的如有A=>β,则称β是句型αβδ相对于规则A→β的直接短语(简单短语)。

句柄:一个句型的最左直接短语称为该句型的句柄。句柄就是“可归约串”。

三、简答题

1. 编译程序的工作过程一般主要划分为5个阶段:词法分析,语法分析,语义分析与中间代码生成,优化,目标代码生成。同时还会伴有表格处理和出错处理。

词法分析——词法分析器:识别句子中的一个个单词。输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词。

语法分析——语法分析器:分析句子的语法结构。在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)。

语义分析与中间代码产生——语义分析与中间代码产生器:根据句子的含义进行初步翻译。对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。

优化——优化器:对译文进行修饰。对前段产生的中间代码进行加工转换,以期在最后阶段能产生出更为高效的目标代码。

目标代码生成——目标代码生成器:写出最后的译文。把中间代码变换成特定机器上的低级语言代码。P5图1.1

2. 我们有时把编译原理划分为编译前端和编译后端。前端主要由与源语言有关但与目标机无关的那些部分组成。这些部分通常包括词法分析、语法分析、语义分析与中间代码产生,有的优化工作也可包括在前端。后端包括编译程序中与目标机有关的部分,如与目标机有关的代码优化和目标代码生成等。通常,后端不依赖于源语言而仅仅依赖于中间语言。

3.怎么实现目标代码改变?

四、综合计算题

(一)表达式的推导

例:G = ({E}, {i, +, *, (, ) } , P , E)

P:E → E+E | E*E | (E) | i

答:表达式(i)和(i+i)*i的推导:

E ⇒ (E) ⇒(i)

E ⇒ E*E ⇒ (E)*E ⇒ (E + E)*E ⇒ (i + E)*E ⇒(i + i)*E ⇒ (i + i)*i

⇒(i + i)*i

(i+i)*i的最左推导过程:

E ⇒ E*E ⇒ (E)*E ⇒ (E + E)*E ⇒ (i + E)*E ⇒(i + i)*E ⇒ (i + i)*i

(i+i)*i的最右推导过程:

E ⇒ E*E ⇒ E*i ⇒ (E + E)*i ⇒ (E+ i)*i ⇒(i + i)*i

2.语法树

例:对文法G = ({E}, {i, +, *, (, ) } , P , E)

P:E → E + E | E * E | ( E ) | i

答:句子(i+i)*i 的语法树:

例:G = ({E}, {i, +, *, (, ) } , P , E)

P:E → E + E | E * E | ( E ) | i

答:句子( i * i + i)的语法树:

(1) E ⇒ (E) ⇒ (E + E) ⇒ (E * E + E) ⇒(i * E + E) ⇒ (i *i + i)

(二).NFA的确定化和最小化(P50)

(三).预测分析表(1)FIRST集求法

First集合最终是对产生式右部的字符串而言的,但其关键是求出非终结符的First集合,由于终结符的First集合就是它自己,所以求出非终结符的First集合后,就可很直观地得到每个字符串的First集合。

1. 直接收取:对形如U->a…的产生式(其中a是终结符),把a收入到First(U)中

2. 反复传送:对形入U->P…的产生式(其中P是非终结符),应把First(P)中的全部内容传送到First(U)中【意思就是只需要把第一个非终结符的First集传过去~这个地方是要注意的地方,也是难点】。

FOLLOW集的求法

Follow集合是针对非终结符而言的,Follow(U)所表达的是句型中非终结符U所有可能的后随终结符号的集合,特别地,“#”是识别符号的后随符。注意Follow集合是从开始符号S开始推导。

1. 直接收取:注意产生式右部的每一个形如“…Ua…”的组合,把a直接收入到Follow(U)中。因a是紧跟在U后的终结符。

2.直接收取:对形如“…UP…”(P是非终结符)的组合,把First(P)直接收入到Follow(U)中【在这里,如果First(P)中有空字符,那么就要把左部(假设是S)的Follow(S)送入到Follow (U)中。还有就是Follow集中是没有空字符的】。

3. 直接收取:若S->…U,即以U结尾,则#∈Follow(U)

4.*反复传送:对形如U->…P的产生式(其中P是非终结符),应把Follow(U)中的全部内容传送到Follow(P)中。

自顶向下分析(P80)

例:求对应于下述文法的预测分析表:E →TE'

E' → +TE' |ε

T → FT'

T' → *FT' |ε

F →(E) |i

答:

1)首先求first集:

2)由于ε∈First(E'), ε∈First(T'), 求E'和T'的Follow集:

相关文档
最新文档