本文主要是介绍7文法分析 软设刷题 软考 +,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文法分析
- 刷题
- 1-5
- 5-10
- 10-15
- 15-20
- 20-25
- 25-30
- 30-35
- 35-40
- 40-45
- 知识点
- 1-5
- 5-10
- 10-15
- 15-20
- 20-25
- 25-30
- 30-35
刷题
1-5
1
沟通渠道公式如下:M=n*(n-1)/ 2。M表示沟通渠道数,n表示项目中的成员数
2
本题给出的NFA,能够识别字符串000,010等,以这两个字符串为例进行分析。
与之等价的DFA,也必须能够识别这样的串。A选项不能识别000,B选项不能识别010,D选项不能识别010。只有C选项能够同时识别这2个串。
3
执行y=f(2),即传参x=2至f(x)。
首先la=x+1=2+1=3。
- g(la)采用引用调用时,在g(la)函数中,将x记为x’以区分函数,x’=x’x’+1=lala+1=10,由于是引用调用,会影响形参la的取值,此时la=10,接下来计算lax=102=20。
2.g(la)采用值调用,在g(la)函数中,将x记为x’以区分函数,x’=x’x’+1=lala+1=10,由于是值调用,不会影响形参la的取值,此时la仍然为3,接下来计算lax=32=6。
4
根据本题题干“a or(( c<d )and b )”,最后计算的是or,对于或运算,只要有一个为真则结果为真,不需要进行后面的计算,因此当a为true时,可进行短路计算,直接得到后面的结果。
5
本题因为是不确定的有限自动机,中间内容由多种可能,但由图可以看到,从初态0开始,首字符只能为0,到终态结束之前,尾字符也只能为0。
5-10
6
对题中选项中4个二叉树进行后序遍历,得出结果与该后缀表达式一致的则为与其等价的语法树。
7
根据图中展示,其正规式的收尾必定会包含a和b字符,所以答案是ab*a。
8
一个上下文无关语法定义一个语言,其主要思想是从文法的开始符号出发,反复连续使用产生式,对非终结符进行替换和展开。
9
的答案:[B]
A有限自动机(确定或非确定的)识别字符串的过程都是从初态出发,找出到达终态的一条路径,使得路径上的字符序列与所识别的字符串相同。
在题中所给的有限自动机上,可以在路径0->1->3->3->4上形成字符序列aaab,所以aaab可被该自动机识别。
对于abab,从状态0出发,首先识别出第一个字符a到达状态1,接下来不存在识别第二个字符b的状态转移,所以不能识别abab。
对于bbba,从状态0出发识别出第一个字符b到达状态2,再识别出第二个字符b到达状态3,随后识别出第三个字符仍然转移到状态3,之后不存在能识别第四个字符a 的状态转移,所以该自动机不能识别bbba。
对于abba,从状态0出发,首先识别出第一个字符a到达状态1,接下来不存在识别第二个字符b的状态转移,所以不能识别abba。
10
(a|b)*表示由字符a、b构成的所有字符串集合,题目要求以b结尾,故在(a|b)*后添上b,得出(a|b)b。
(b|ab)b表示的字符串集合为{b,bb,abb,bbb,abab,bbbb,abbb,babb,… },除了以b结尾,还要求每个a后面至少有1个b。
(ab)b表示的字符串集合为{b,ab,abb,aab,abbb,aaab,abab,…},除了以b结尾,还要求以a开头(除了仅有1个b的情形)。
abb表示的字符串集合为{b,ab,bb,abb,aab,bbb,abbb,aabb,aaab,bbbb,… },除了以b结尾,还要求若干个a之后连接若干个b,b只能出现在a之后。
10-15
11
在自动机中,从初态到达终态的一条路径上所标记的字符形成的串正好与要识别的串相同,则称该自动机能识别此字符串。
对于00110,从状态A出发,其识别路径为A→B→D→C→E→B,字符串结束时,自动机所在状态为B,而不是终态D或E,所以该DFA不能识别00110。
对于10101,从状态A出发,其识别路径为A→C→B→C→B→C,字符串结束时,自动机所在状态为C,而不是终态D或E,所以该DFA不能识别10101。
对于11100,从状态A出发,其识别路径为A→C→E→E→B→D,字符串结束时,自动机所在状态为终态D,所以该DFA可以识别11100。
对于11001,从状态A出发,其识别路径为A→C→E→B→D→C,字符串结束时,自动机所在状态为C,而不是终态D或E,所以该DFA不能识别11001。
12
表达式语法树后缀形式,就是对树进行后序遍历(左右根),结果为:x5y+*a/b-。
13
由“逻辑与”“逻辑或”运算构造的逻辑表达可采用短路计算的方式求值。
“逻辑与”运算“&&”的短路运算逻辑为:a&&b为真当且仅当a和b都为真,当a为假,无论b的值为真还是假,该表达式的值即为假,也就是说此时不需要再计算b的值。
“逻辑或”运算“||”的短路运算逻辑为:a||b为假当且仅当a和b都为假,当a为真,无论b的值为真还是假,该表达式的值即为真,也就是说此时不需要再计算b的值。
对逻辑表达式“x&&(y(||!z)”进行短路计算方式求值时,x为假则整个表达式的值
即为假,不需要计算y和z的值。若x的值为真,则再根据y的值决定是否需要计算z的值,y为真就不需要计算Z的值,y为假则需要计算z的值。
14
正规式(b|ab)表示的正规集为{b,ab},(b|ab)表示的正规集为{ε,b,ab,bb,bab,abb,abab,bbb,bbab,babb,babab,abbb,abbab,ababb,ababab,…},用自然语言描述就是每个a后面都至少有1个b。
正规式(ab)表示的正规集为{ε,a,ab,abb,abbb,abbbb,…},(ab*)表示的正规集为{aa,aab,aabb,aabbb,aabbbb,aba,abba,abbba,abab,abbab,…},用自然语言描述就是除了空串,每个串中都至少有1个a。
正规式(ab*)*和(a|b)*是等价的,它们都表示{ε,a,b,aa,ab,ba,bb,am,aab,aba,abb,baa,bab,bab,bbb,,用自然语言描述就是用a、b构成的任何字符串。
15
程序语言的大多数语法现象可用乔姆斯基的上下文无关文法描述。
15-20
16
在DFA中,如果存在从初态到达终态的路径,其上的标记字母构成字符串s,则称该DFA可以识别s。
根据题目中的状态转换图,对于aabb,从状态A出发,识别字母“a”后转到状B,接下来不存在字母“a”的状态转换,因此,该DFA不能识别aabb。
对于abab,其识别路径为A->B->C->B->C,当字符串结束时,到达终态C,因此该DFA能识别abab。
对于baba,不存在识别路径,因为从状A出发没有字母“b”的状态转换,
对于abba,其识别路径为A->B->C->C->B,字符串结束时不在终态,因此该DFA不能识别abba。
17
借助栈可以方便地对后缀式进行求值。后缀式(逆波兰式)是波兰逻辑学家卢卡西维奇发明的一种表示表达式的方法。这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。
18
若存在一条从初态到某一终止状态的路径,且这条路径上所有弧的标记符连接成的字符串等于ω,则称ω可由NFA识别(接受或读出)。
对于题中给出的NFA,其初态为q0,q0上的自回路表示识别零个或多个1,接下来识别出一个0时进入状态q1,q1上的自回路表示识别零个或多个0,接下来识别出1个1之后再回到q0。
例如,该自动机可识别空串(因为q0既是初态,也是终态)、01、00001、101、1、11、111、1111等。
01的识别路径为q0->q1->q0
00001的识别路径为q0->q1->q1->q1->q1->q0
101的识别路径为q0->q0->q->q1->q0
1的识别路径为q0->q0
11的识别路径为q0->q0->q0
111的识别路径为q0->q0->q0->q0
1111的识别路径为q0->q0->q0->q0->q0
识別字符串时必须从初始状态q0出发,并回到状态q0,因此对于仅由1构成的任意长度的串,在识别过程中不会离开q0。当识别出一个0而离开q0后就进入q1,此后的字符若全部为0,则会一直在q1,直到识别出一个1而回到q0,因此除了空串,该NFA识别的字符串必须以1结尾。
19
~~~
20
对高级语言源程序进行编译(或解释)方式的翻译过程中,,词法分析采用有限自动机作为计算模型。有限自动机分为确定的有限自动机(DFA)和不确定的有限自动机 (NFA)。可将一个从NFA转换为等价的最小化DFA。
题中的NFA的功能是识别空串以及b不能连续出现(即每个b后至少含有1个a.) 的a、b字符串,若是非空串,则以a结尾。
选项A识别的是空串以及每个b后至少含有1个a的a、b字符串,若是非空串, 则以a结尾。
选项B识别空串以及b不能连续出现且以b结尾的a、b字符串。
选项C识别b不能连续出现且以b结尾的a、b字符串,不能识别空串。
选项D识别b不能连续出现且以a结尾的a、b字符串,不能识别空串。
20-25
21
对高级语言源程序进行编译(或解释)方式的翻译过程中,语法分析的任务是根据语言的语法规则,分析单词串是否构成短语和句子,即表达式、语句和程序等基本语言结构,同时检查和处理程序中的语法错误。
程序设计语言的绝大多数语法规则可以采用上下文无关文法进行描述。
语法分析方法有多种,根据产生语法树的方向,可分为自底向上和自顶向下两类。递归下降分析法
和预测分析法
是常用的自顶向下分析法。算符优先分析法和LR分析法
属于自底向上的语法分析方法。
22
~~~
23
自动机识别字符串的过程是:从初态出发,根据字符串的当前字符实现状态转移。如果存在从初态到终态的状态转移路径与字符串中的各个字符相匹配,那么就说该自动机可以识别该字符串。题中所给自动机的初态和终态都是编号为1的状态,从其状态图 可知,从状态1开始,识别出字符“a”时仍然转移到状态1,而识别出字符“b”时才离开状态1进入状态2,状态2仅对字符“a”有状态转移,且转回状态1。因此,该自动机识别的字符串仅包含a、b字符,但是字符“b”不能连续出现,连续出现“a”是可以的。
24
乔姆斯基(Chomsky)把文法分成四种类型,即0型、1型、2型和3型。
0型文法也称为短语文法,其能力相当于图灵机,任何0型语言都是递归可枚举的;反之,递归可枚举集也必定是一个0型语言。
1型文法也称为上下文有关文法,这种文法意味着对非终结符的替换必须考虑上下文。
2型文法就是上下文无关文法,非终结符的替换无需考虑上下文。
3型文法等价于正规式,因此也被称为正规文法或线性文法。
通用程序设计语言的大多数语法可由上下文无关文法表示。
25
形式语言理论中一种重要的变换文法,用来描述上下文无关语言,在乔姆斯基分层中称为2型文法。由于程序设计语言的语法基本上都是上下文无关文法,因此应用十分广泛。上下文无关文法拥有足够强的表达力来表示大多数程序设计语言的语法。
另一方面,上下文无关文法又足够简单,使得我们可以构造有效的分析算法来检验一个给定字串是否是由某个上下文无关文法产生的。
25-30
26
编译时a的值无法确定,表达式“c=b/a”符合C/C++语言的语法逻辑,编译时不会报错。运行时,代入a的值,发生错误
。
27
用文法表示语言的语法规则时,推导是产生语言句子的基本方式。以题H中的文法为例,推导出1010的过程为S→A0→S10→A010→1010,推导出0110的过程为S→A0→S10→B110→0110,对于0000、1111、1100、0011等则推导不出。因为由S先推导出A0后,再去推导A则必然产生一个与0相邻(在0的左边)的1,而由S先推导出B1,则下一步必然要推导出一个与1相邻(在1的左边)的0。这保证了当1出现时,马上就会出现0,或者反之,且0和1的距离很近。分析更多的例子发现,仅有“某些0和1个数相等的字符串”是正确的。
28
二叉树的先序遍历得到表达式的前缀书写形式;二叉树的中序遍历得到表达式的中缀书写形式;二叉树的后序遍历得到表达式的后缀书写形式。 其中,中缀形式是算术表达式的通常形式,只是没有括号。题目中明确表达式为a+(b-c)d,那么他的中缀书写形式为a+b-cd,也就是中序遍历为atb-cd,求出二叉树,再后序遍历求出后缀式,其后缀式为“abc-d+”。
29
语言中具有独立含义的最小语法单位是符号(单词),如标识符、无符号常数与界限符等。词法分析的任务是把构成源程序的字符串转换成单词符号序列。
有限自动机是一种识别装置的抽象概念,它能准确地识别正规集。有限自动机分为两类:确定的有限自动机(DFA)和不确定的有限自动机(NFA)。
30
L = {anbn|n>=l}中的字符串特点是a的个数与b的个数相同,且所有的a都在b之前,该集合不是正规集,不能用正规式表示。
正规集可用正规式描述,用有限自动机识别。
30-35
31
aabb表示的字符串特点是:若干个a之后跟若干个b,a和b都至少出现1次。 abb表示的字符串特点是:若干个a之后跟若干个b,a可以不出现,b至少出现1次。aab表示的字符串特点是:若干个a之后跟若干个b,a至少出现1次,b可以不出现。ab表示的字符串特点是:若干个a之后跟若干个b,a和b都可以不出现。语言L={ambn|m≥0,n≥1} 中,若干个a之后跟若干个b,a可以不出现,b至少出现1次。
32
~~~
33
对逻辑表达式可以进行短路计算,其依据是:a and b的含义是a和b同时为“真”, 则a and b为“真”,因此,若a为“假”,则无论b的值为“真”或“假”,a and b必然 为“假”;a or b的含义是a和b同时为“假”,则a or b为“假”,因此,若a为“真”, 则无论b的值为“真”或“假”,a or b必然为“真”。
在优先级和结合性规定下,对逻辑表达式“x and y or not z”求值时,应先计算“x and y”的值,若为“假”,才去计算“not z”的值。因此,若x的值为“假”,则“x and y” 的值为“假”,需要计算“not z”来确定表达式的值而不管y是“真”是“假”。当x的 值为“真”,则需要计算y的值:若y的值为“真”,则整个表达式的值为“真”(从而不需再计算“not z”);若y的值为“假”,则需要计算“not z”来确定表达式的值。
34
~~~
35
从有限自动机的初态到终态的路径上的标记形成其可识别的字符串。
对于题中的自动机,从A出发到达C结束的所有路径中必然包含BC这条弧(标记为1),同时到达B的弧上都标记了0,所以其识别的字符串必须以01结尾。
35-40
36
被有限自动机所识别是指从初态开始到终态结束,所输入的字符串能够按顺序地执行下去,若到某个状态不能往下走得到下一个字符,则认为不能识别。
在本题中,选项A能被识别。从初态A出发,不管经过多少个1和0之后,只能是处在A、B、C三种状态中的一种,所以在(0|1)*后,只能是处在A、B、C三种状态中的一种,不管是在那个状态,输入0后,都会处在状态B,然后输入1,都会转换到状态C,因此选项A能被该有限自动机所识别。
同样的道理,我们可以知道其它选项的正规式不能被识别。
37
软件开发小组的沟通路径受到小组组织形式和规模的影响。若任意小组成员之间均可能有沟通路径,则可用完全连通图来对开发小组的沟通路径建模,最多的沟通路径为完全连通图的边数,即n个成员的开发小组的沟通路径是n(n-1)/2,因此8个成员的开发小组的沟通路径有28条。
38
从有限自动机的初态到终态的路径上的标记形成其可识别的字符串。
对于题中的自动机,0000的识别路径为A—B—B—B—B,不能到达终态C,所以 0000不能被该自动机识别;1111的识别路径为A—A—A—A—A,不能到达终态C,所以1111也不能被该自动机识别;1010的识别路径为A—A—B—C—B,结束状态不是终态C,所以1010不能被该自动机识别;0101的识别路径为A—B—C—B—C,存在从初态到终态的识别路径,所以0101可以被该自动机识别。
39
有限自动机可识别一个字符串的含义是,从有限自动机的初态出发,存在一条到达终态的路径,其上的标记可构成该字符串。若从初态到终态不存在能构成指定字符串的路径,则称该字符串不能被该自动机识别。
对于“abab”,其识别路径为状态0→状态2→状态3→状态3,虽然到达终态,但是没有识别出最后的字符“b”。
对于“bbbb”,其识别路径为状态0→状态1→状态2→状态3,虽然到达终态,但是没有识别出最后 的字符“b”。
对于“abba”,其识别路径为状态0→状态2→状态3,虽然到达终态,但是没有识别出“ba”。
对于“aaaa”,其识别路径为状态0→状态2→状态1→状态3→状态3,存在从初态到终态的路径标记形成“aaa”,所以可识别。
40
非确定有限状态自动机与确定有限状态自动机的最大区别是它们的转移函数不同。确定有限状态自动机对每一个可能的输入只有一个状态的转移。非确定有限状态自动机对每一个可能的输入可以有多个状态转移,接受到输入时从这多个状态转移中非确定地选择一个。
在本题中给出的图M1中,我们可以看到当在状态A输入0时,它可以转移到它自己,也可以转移到状态B,所以M1是非确定的。而M2中不存在这样的情况,因此是确定的有限自动机。
40-45
41
“逻辑与运算”的优先级高于“逻辑或运算”。
“逻辑与运算”表达式“x∧Y”的短路求值逻辑是:若x为假,则可知“x∧Y”的值为假,无需 再对y求值,因此只有在x为真时继续对y求值。
“逻辑或运算”表达式“x∨y”的短路求值逻辑是:若x为真,则可知“x∨y”的值为真,无需再对y求值,因此只有在x为假时继续对y求值。
对于逻辑表达式“a∧b∨c∧(b ∨ x>0)”,从运算符的优先级方面考虑需先对“a∧b”求值,然后对“c∧(b∨ x>0)”求值,最后进行“∨”运算,因此后缀式为“ab∧cbx0>∨∧∨”。
42
闭包运算符“”将其运算对象进行若干次连接,因此0表示若干个0构成的串,而(10*1)*则表示偶数个1构成的串。
43
推导就是从文法的开始符号S出发,反复使用产生式,将产生式左部的非终结符替换为右部的文法符号序列(展开产生式用=>表示),直到产生一个终结符的序列时为止。从题中给出的分析树可得到如下的一个最左推导过程
S=>aAcB=>aAaBcB=>acaBcB =>acabcB=>acabcbScA=>acabcbBdcA=>acabcbdcA=>acabcbdcc,因此,acabcbdcc是该方法推导出的一个句子。其中用到的产生式如下:
S->aAcB S->Bd
A->AaB A->c
B->bScA B->b B->ε
从起始符号S出发也可以如下推导:S=>Bd=>εd=>d,即该文法推导出的句子也可以为d,因此选项A错误。
44
在正规式中,符号表示重复若干次(包括0次),因此正规式“中的表达式“(aa),,不能保证有偶数个a。同理,“(a (ba*)b)”和“(a|b)* (aa)”中对a的个数也没有限制,而在“(aba)*”中可以确保a的出现为偶数个。
45
一个文法的语言是该文法能产生的句子的集合。一个文法产生的句子是从文法开始符号出发推导出的所有终结符号串。
46
据表达式(a-b)(c+d),其后续遍历即其后缀表达式(逆波兰式)为ab-cd+。
知识点
正规式
状态转换图
前序遍历
1-5
1
程序语言的大多数语法现象可用乔姆斯基的上下文无关文法
描述。
2
后缀式(逆波兰式)是波兰逻辑学家卢卡西维奇发明的一种表示表达式的方法。这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。
借助栈可以方便地对后缀式进行求值
。方法为:先创建一个初始为空的栈,用来存放运算数。对后缀表达式求值时,从左至右扫描表达式,若遇到运算数,就将其入栈,若遇到运算符,就从栈顶弹出需要的运算数并进行运算,然后将结果压入栈顶,如此重复,直到表达式结束。若表达式无错误,则最后的运算结果就存放在找顶并且是栈中唯一的元素。
3
编译时a的值无法确定,表达式“c=b/a”符合C/C++语言的语法逻辑,编译时不会报错。运行时,代入a的值,发生错误
。
4
5
5-10
10-15
15-20
20-25
25-30
30-35
注:
~~~:无须给出答案
这篇关于7文法分析 软设刷题 软考 +的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!