一、引论
1.翻译(语言处理器)的三种形态的代表?
解:JAVA(混合),C(先编译后运行),PYTHON(边翻译边运行);
编译器:一遍翻译,多遍运行
解释器:一边翻译,一边运行
2.编译的步骤?
解:
3.每个步骤大概的功能?
解:
二、实现一个简单的编译器
1.语法与语义定义了程序语言?
解:语法描述了程序的正确形式;
语义定义了程序的含义。
2.闭包怎么操作的?以及什么是正规闭包?
解:
3.上下文无关文法G是什么,包含什么元素?
解:上下文无关文法G是一个四元式。
4.什么是句型,句子,语言?
解:可由开始符推得的叫做句型a;
若a只含有终结符则为句子;
G产生的所以句子是语言L(G)。
5.什么是符号表?
解:
6.什么是三地址码?
解:三地址代码是四元式的另一种表示形式。每个三地址码指令,都可以被分解为一个四元式(4-tuple)。因为每个陈述都包含了三个变量,所以它被称为三地址码。
7.语法分析的两种思路?
解:①.从语法规则出发检查源程序。
②.从源程序出发检查语法规则。
8.递归下降分析法特点?
回溯可能会导致效率低。
三、词法分析
(词法分析器功能是识别终结符,终结符不一定只有一个字符,如num,100)
1.词法分析输出格式?
解:输入“+”,输出“<op,153>”
2.词法分析器两种操作方法?
解:状态转换图法和正则表达式法。
3.什么是正则表达式,正则集?
解:
正则集是一种语言,集合的所有元素满足当且仅当可以被某种正则表达式表示。
4.自动机的五元式M意义?
DFA:
NFA:
5.DFA与NFA区别?
6.NFA如何转换为DFA?
7.正则表达式怎么转换为DFA?
8.自动机的语言L?
解:
与上下文无关文法语言不同。
四、语法分析
A.自上而下
(判断由终结符组合成的非终结符是否合法)
1.什么是0,1,2,3型文法
解:
2、什么是文法的语言?
解:一个文法生成的语言是它所有句子的集合。因此一个终结符号串Ω在G生成的语言中,则有S=*>Ω。
3.大小写,α,β?
解:大写代表非终结符,小写代表终结符,α和β代表字符串。
4.什么是具有二义性?
解:造成二义性的原因是:文法中没有体现出结合律和优先级。
5.最左广度搜索法如何操作以及两个技巧?
解:
技巧是①:如果前缀不匹配则舍去。
②如果一个输入的全是终结符的串前缀已经匹配成功,另一个栈串还有字符则舍去。
6.该方法存在的三个问题及改造方法?
①左递归
②公共左因子
③推出空串
7.最左深度搜索法
解:要求无左递归
8.预测分析法是什么?
9.LL(1)怎么工作的?
解:
10.什么是FIRST集,FOLLOW集?
解:
11.FIRST集与FOLLOW集如何构建预测分析表?
解:
12.最左推导与最右推导区别?
解:
13.怎么根据文法写出语言?
B.自下而上之LR(0)
1.自上而下与自下而上的区别
解:
2.语法树里什么是句型,短语,直接短语,句柄?
3.如何根据文法求句型中的短语?
4.如何构建有限自动机?
5.LR(0)算法
有状态栈和符号栈
6.LR(0)分析方法,action表和goto表。
7.什么是活前缀?
8.项目集闭包运算怎么求?
解:对活前缀有效的项目的集合。
9.项目集与项目集规范族关系?
10.LR(0)条件?
解:只要有规约项目就进行规约。
C.自下而上之SLR(1)
1.如何通过项目集规范族区分LR(0)和SLR(1)?
解:
2.SLR(1)条件?
解:
判断a与FOLLOW集是否有交集即可
3.如何建立SLR(1)分析表?
解:规约都按照SLR(1)方法来。
有规约移位冲突时,follow集有的规约,该移位的移位,其他报错。
4.存在的问题?
解:
D.自下而上之LR(1)
1.什么是LR(K)项目?
将一般形式为 [A→α·β, a]的项称为 LR(1) 项,其中A→αβ 是一个产生式,a 是一个终结符(这里将$视为一个特殊的终结符)它表示在当前状态下,A后面必须紧跟的终结符,称为该项的展望符。
- 在形如[A→α·β, a]且β ≠ ε的项中,展望符a没有任何作用(β中可能含有其他的终结符)
- 但是一个形如[A→α·, a]的项在只有在下一个输入符号等于a时才可以按照A→α 进行归约:这样的a的集合总是FOLLOW(A)的子集,而且它通常是一个真子集。
2.闭包的定义?
3.LR(1)流程?
由0)可以推导出1式【0):左边橙色框中的式子 1:右边蓝色框中的式子】,有1式中的S是非终结符,所以又可以继续推出等价项目2和3。又2式中圆点后面的L属于非终结符,继续推出4、5式【注意:4、5中的展望符是=,因为2式中L后面有终结符=】然后继续对左边橙色框中的式子进行相同算法的推导即可。