第三章词法分析练习3.1给出一个正则表达式和自动机,使之表示满足下面条件的0、1序列:1)只包含两个1。
2)不包含连续的1。
3)包含偶数个1。
3.2写出下面符号串集的正则表达式:1){a,b,c}a偶数出现2){a,b,c}不包含子串baa3)二进制数,大于1010014)二进制数,4的倍数5)偶数个0奇数个1的0/1串3.3构造识别下列正则表达式定义的NFA:1)(a|(b)+2)(a*|(b*)*3)(a|(bc)*d*4)((0|1)*(2|3)*)|00115)(a|b)*abb(a|b)*3.4为下列正则表达式构造极化的DFA:1)(a|b)*a(a|b)2)(a|b)*a(a|b)(a|b)3.5利用自动机原理构造模式匹配程序,即构造一个程序,使它能识别给定a/b串是不是a i b j a k b m类串:,其中i和j是大于等于0的整数,而k和m是大于0的整数。
3.5将下面不确定自动机NFA转换为确定自动机DFA:3.6将下面不确定自动机NFA转换为确定自动机DFA:3.7试将下面不确定自动机NFA转换为确定自动机DFA:3.8试写出下面确定自动机DFA的正则表达式:3.9设置一个名字表NameL和整数表ConstL,当遇到标识符时,将其字符串送入名字表NameL,并把其名字表地址作为标识符的Value值。
整常数情形也一样,不要求翻译成二进制数。
要求在NameL表和ConstL表中没有相同元素。
试用C语言写一个针对上述单词集的词法分析器。
单词class valuebegin BeginSymbend EndSymbvar VarSymbinteger IntSymbif IfSymbthen ThenSymbelse ElseSymb;SemiSymb:ColonSymb:=AssigSymb<LittleSymb<=LittEquiSymb标识符IdentSymb名字表地址整常数ConstSymb常数表地址3.10实数的语法定义如下面所述:<实数>::=<整数部分><小数部分><指数部分><整数部分>::=<数字>|<整数部分><数字><小数部分>::=ε|.<整数部分><指数部分>::=ε|e<指数符号><整数部分><指数符号>::=ε|+|-试写出实数的非确定自动机。
3.11试写出3.10题中实数的确定自动机;3.12试写出3.10题中实数的正则表达式。
3.13当构造词法分析器时,根据单词的正则表达式定义首先构造NFA,之后将NFA转换成DFA,并用其DFA进行词法分析。
从正则表达式到NFA的转换速度快,而NFA到DFA的转换速度比较慢,因此在某些场合下,用NFA并按NFA到DFA的转换思想进行词法分析可能是很有意思的。
就是说,在NFA的一个状态下,遇到一个字符时,用NFA到DFA时的构造技术确定下一状态。
试写出算法。
第四章语法分析练习4.1将下列正则表达式转换成上下文无关文法:1)((ab *a)|(ba *b))|ε2)((0|1)+"."(0|1)*)|(((0|1)*"."(0|1)+))3)(a|b)*a(a|b)(a|b)4.2我们称如下形式的上下文无关文法叫做ε-正则文法,即其产生式具有下面形式:A→aB 或A→εB 或A→a其中A 和B 是非终极符,a 是终极符。
要求把下面自动机(确定)转换成ε-正则文法,其中A 是初始状态,而C 是接受状态。
确定自动机状态转换矩阵4.3把下面自动机(非确定)转换成上ε-正则文法,其中A 和B 是初始状态,而C 是接受状态。
非确定自动机状态转换矩阵4.4已给定下面ε-正则文法,试将其转换成非确定自动机。
S→εA |εBA→aA |aC |bB |bC|εB B→aA |aC |bB |εC C→aB |aC |ε4.5试将题4.4中给定的ε-正则文法转换成确定自动机。
4.6试将题4.4中给定的ε-正则文法转换成正则表达式。
提示:用消除法消除开始符以外的非终极符。
关键知识:C→aC |α,可转换成C→a *α,4.7试给出将ε-正则文法,转换成确定正则文法,但允许开始符有ε产生式。
这相当于从NFA 到DFA 的转换。
4.8形如A→A α的产生式称为左递归的,类似地称B→βB 的产生式为右递归的。
证明如果一个非终极符既有左递归式,又有右递归式,则文法一定有二义性。
4.9试给出一个算法,它判定文法中有哪些非终极符是不可能出现于任何句型中,称这种非终极符为不可到达符号。
4.10试给出一个算法,它判定文法中有哪些非终极符是不可能导出任何终极符串。
4.11形如A→ε的产生式为空产生式,以例说明任何含空产生式的文法均可转换成无空产生式的等价文法(可能只差一个空句子)。
4.12下列哪些文法是LL(1)文法?ab A A B B C BCCab εA A,C B,CB B A,C BCCB,C1)S→Abc2)S→Ab3)S→ABBA4)S→a S eA→a A→a A→a S→BA→εA→B A→εB→b B eB→b A→εB→b B→CB→εB→b B→εC→c C cB→εC→d4.13对下面文法构造LL(1)分析表:E→-EE→(E)E→Var EtailEtail→-EEtail→εVar→id VtailVtail→(E)Vtail→ε4.14试写出用上述LL(1)分析器分析i--i(i)的过程,其中i是标识符。
4.15试将下列文法转换为LL(1)文法DL→DL;DDL→DD→idL:TypeidL→ididL→idL,idType→StypeType→array(STypeL)of TypeStype→idStype→Bound..BoundBound→Sign IntLiteralBound→idSign→+Sign→-STypeL→STypeL,StypeSTypeL→Stype4.16称一个文法是greibach规范型(GNF)文法,如果每个产生式具有形式A→tβ,其中t是终极符,β是任何符号串。
设G是任一不含空句子的文法,试给出G到GNF的转换算法。
4.17证明下列问题:1)左递归文法不是LL(1)文法。
2)证明LL(1)文法是无二义性文法。
1)若文法G没有空产生式,且每个非终极符的产生式均以不同的终极符打头,则G顶是LL(1)文法。
4.18为下面文法构造LR状态机,并给出相应的goto表。
Prog→Block$Block→begin SL endSL→SL;SSL→SS→BlockS→V:=EV→idV→id[E]E→E+TE→TT→VT→(E)4.19以下文法中哪些不是LR(0)?为什么?1)Q→SL$SL→SL;SSL→SS→null2)Q→SL$SL→S;SLSL→SSL→null3)Q→SL$SL→SL;SLSL→SS→null4)Q→SL$SL→null SLtailSLtail→εSLtail→;SL4.20证明对应LL(1)文法的LR状态机的每个状态的项目集恰有一个基本项目。
4.21为4.18题中给出的文法构造一个LR(1)状态机。
4.22下面的文法中哪一些是LR(1)?LALR(1)?SLR(1)?说明你的理由。
4.23为4.18中的文法构造SLR(1)_ACTION 表。
4.24以4.21中为4.18文法构造的LR(1)状态机为基础,合并同心项,即合并有共同核心的项目,建立LALR(1)状态机。
4.25从为4.18构造的LR(0)状态机出发,利用向前看符号的传播与生成算法,确定LALR(1)向前看符号集,并与4.24中通过合并的方法产生的结果进行比较。
4.26证明任何无ε-产生式的LL(1)文法都是LR(0)文法。
4.27证明存在不是LL(1)的LR(0)文法、SLR 文法和LALR(1)文法。
4.28证明所有LL(1)文法都是LR(1)文法。
第五章语义分析练习5.1试写出下面类型的内部表示:1)array[1..5]of array[1..10]ofrecord i:integer;b:boolean end2)record r:record x:real;y:integer end;a:array[1..10]of booleanend5.2试用C语言描述读数组类型的Token序列并构造其类型树的算法。
5.3试用C语言描述读记录类型的Token序列并构造其类型树的算法。
5.4试用C语言描述读联合类型的Token序列并构造其类型树的算法。
5.5试写出按结构等价概念判定类型等价的程序,其输入是两个类型树的根指针,输出是0或1,0表示不等价,1表示等价。
5.6假设给定数组类型树的根结点(指针),并且假设树结点中没设置记录空间大小的size域。
试写出函数EvaluateArraySize,其输入是数组类型树根结点的指针,而输出是表示大小的整数。
5.7假设给定记录类型树的根结点(指针),并且假设树结点中没设置记录空间大小的size域。
试写出函数EvaluateRecordSize,其输入是记录类型树根结点的指针,而输出是表示大小的整数。
5.8假设给定联合类型树的根结点(指针),并且假设树结点中没设置记录空间大小的size域。
试写出函数EvaluateUnionSize,其输入是联合类型树根结点的指针,而输出是表示大小的整数。
5.9试写出一个过程SearchFieldType,其功能是只要给定记录类型树的根结点Ptr和一个域名fid,则在FPtr中返回fid类型数的结点指针。
5.10设当前层数为L,可用偏移量Offset值为101,且有下面程序,写出本层符号表的内容。
const m=333;n=444;type at=array[1..10]of real;rt=record i,j:integer end;var a,b:at;x,y:real;5.11设当前层数为L,当前偏移量为Offset,且有下面过程首部,试写出符号表内容,其中at见5.2题。
var x,y:at;function f(val a:at;var b:at;var x:real):nteger;5.12表达式的语义检查都包括哪些内容?5.13赋值语句的语义检查包括哪些内容?5.14hile语句的语义检查包括哪些内容?5.15答如何检查通过goto语句跳入结构语句内部的错误?5.16程调用语句的语义检查包括哪些内容?5.17要说明如何检查实参与形参的相容性。
5.18试用C语言写出标识符表(顺序式)的界面程序(填表,查表),其中标识符属性可定义为一个整数。