软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)

8.1 程序设计语言与语言处理程序基础前言

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
比较重要的:正规式几乎每次考,表达式偶尔考,传值与传址出现频率比较高。

8.2 编译过程

在计算机中,对于高级语言程序的处理,有两种方式:一种以解释的方式进行,第二种以编译的方式进行。
解释:通俗来说,敲一行代码一回车,他就将后台的相关事情进行操作了,有问题就直接告诉你。
编译:整段的程序都编好,执行编译运行的时候,才做出相应的可执行程序进行执行。

主要了解编译的基本流程。
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)

8.3 文法的定义以及语法推导树

8.3.1 文法定义

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)

8.3.2 文法类型

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
3型文法是目前探讨最多的。

8.3.3 语法推导树

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
可以用来进行语法规则的推导,通过推导树,可以了解到一些语法能够表达的串,构造的一些句型是什么样子的。
例题分析:在例题所示文法当中软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
,会有终结符,{a,b}这种就是终结符,一般以小写字母来代表;{S,A}是非终结符,非终结符意思是这种符号是可以推出其他符号的;然后会有S,S是起始符,而P就是里面的一些产生式。产生式包括软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
。其实就是推导式,S推导出a、A、S、|、a;说明这一个推导式是两个推导式的合并体,意思就是S可以推导出aAS,这是一个式子;还有一个式子是S可以推导出a;像S就是一个非终结符,因为它可以推导出别的元素来。但是a就不是非终结符,而是终结符,因为a不能推导出别人来。
A也可以推导出别的元素,因为A也是非终结符。
下面就是语法推导树;
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
S可以推导出a、A、S; S→aAS 这一个推导式表达成树就是下图情况。
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
由于A可以进步推导出 SbA,语法树变成下图这样的了,其中S还可以推导出a来;
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
所以,可以通过一个语法树来分析出这一种语法它的推导情况是怎样的,这是语法树和推导的基本过程。

8.4 有限自动机与正规式(考查重点)

8.4.1 有限自动机

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
首先,我们来简单认识有限自动机,因为衍生出来的正规式和有限自动机它们本身就存在着互相转化的关系。

有限状态自动机可以形象的来表达状态间的转换。
如何表达,我们来看,S是开始,f是结束,一般标识出了S是开始,然后以双层圈代表的,往往就是结束;
从S状态输入一个0可以到B;从S输入一个1可以到A;从A输入一个0可以到f;这就是它们状态转换的函数和图的对应关系。

一般考查,给你一个图,问你用这个图,能不能解析出10、01、001这种串。如何判断,就是看能不能到起点找到一条到终点的路,然后这条路上的状态连起来的串,就是我们要求的串,能不能够达到这样的目的。

8.4.2 正规式

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
正规式是对刚才有限自动机的另外一种表达形式。它是如何表达的,咱们以一个实例来看待。
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
“|”表达一种“或”关系,比如 (a | b) 这么一个简单式子,能够解析出a,也能解析出b。
( a | b ) 代表循环多次,* 是从0到无穷大。所以( a | b ) *可以表达的串可以是空串。
*是0,一次也不出现;可以表达a、aa、ba、bb、甚至于很多个b,这样的表达式都可以表达。

例题分析:
第(1)空
分析A选项:ababab能不能够识别?从S可以推导aA,A又可以进一步推导出bS,所以可以等量代换得出abS,S进一步又可以推出aA,A进一步推出bs,所以又来了一个循环,就变成了ababS,接下来S又可以推导出aA,此时,注意,前面的5个字母都相等了,如果最后一个能够解析成b,就大功告成。所以A的解析成终结符b,就得到了A选项的情况。所以A选项这种文法是可以识别的。
分析B选项:bababa我们用到的推导式就是bB,然后由大写的B又进一步推导aS, 那就是baS,既然可以生成一个baS,那么也可以生成babaS,在下一步bababS,然后最后的B可以解析成a。所以B选项也可以。
同理分析得C选项也可以。
D选项不行,因为babba中,第一个ba肯定没问题,即baS,再来一个b,也没问题,由于后面还有字母,所以在对S进行解析时候,我们只能够解析成bB,此时,最后一个B可以解析陈aS或者a,但不能够解析成为以b开头的串。所以这一个串是没有办法解析出来的。所以第一空选D。
第(2)空
用代入法,看第二空中备选答案的文法,能将第一空中的A、B、C这几个选项中的字符都能表达出来。
看第二空备选选项哪一个能够够满足A、B、C三个选项中的串都给表达出来了。就可能是正确答案,可能是,不是一定是;因为可以用其他的正规式也把A、B、C这几个串也给表达出来,但范围也会更广一些,那也也不匹配;所以,一般情况会把它代入,如果某一个选项不能够把第一空的A、B、C选项的各种情况全部表达出来,就可以排除掉。

分析A选项:( a | b ) *说明只要是a和b组成的任意一串,它都能够表达出来,包括第一空中的D选项这种文法G[S]没办法表示出来的,第二空的A选项也能够表达出来。
所以A选项的范围要比文法G[S]要大一些,无法和G[S]文法保持等价关系。

分析B选项:B选项可以表达ababab,B选项可以表达任意长度的ab串。但无法生成ba串。B排除。

分析C选项:可以生成ab的串,也可以生成ba的串。正确答案。

分析D选项:首先是若干个ab的串,再来若干个ba的串,无法和G[S]文法完成等价。

8.5 有限自动机例题

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
过程分析:从A状态通过输入选项值到达C,如果可以,则自动机可识别。

8.6 表达式

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
表达需要学习到的内容主要利用到树的遍历,来求前缀表示和后缀表达式,因为中缀表达式就是正规的表达方式。
右上角的树中序遍历的结果就是中缀表达式,前序遍历得到的结果就是前缀表达式,后序遍历得到的结果就是后缀表达式。
例题分析:要将表达式的树给构造出来,构造树的时候注意标点符号的问题。
小括号一定要注意,因为小括号决定了计算的先后顺序;图中表达式,是要先进行(a-b)和(c+5)操作,再把两者乘起来。
一旦将这棵树构造出来,后缀表达式就很好写了,就是遍历这棵树;后缀表达式就是后序遍历,左右根的形式。括号不要构造到树中去,但是括号是可以体现出来的。

8.7 函数调用(传值与传址)(常考)

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
我们再进行函数调用的时候有两种方式,一种方式是传值调用;第二种方式是传址调用,传值和传址会有不同的结果。
传值情况:
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
形参:如左图,在swap(int x , int y)中,int x,int y 就是形参。
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
实参:函数调用时候传入的a、b的值就是实参。
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
输出结果:4、3;3、4

过程分析:a赋值为3,b赋值为4,在调用swap(int x , int y)函数时,传入值是x=3,y=4,执行完交换函数后,x的打印值为4,y的打印值为3;
但是因为是值传递,在执行完swap(int x , int y)函数之后,a的值仍为3,b的值仍为4。

传值过程中:形参和实参对应各自独立的存储空间。传值过程,会将实参值复制一份赋给形参。
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
传址情况:
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)
传址情况:实参a的地址赋给了形参x,实参b的地址赋给了形参y;x,y是两个指针,这两个指针并没有存具体的值,而是指向了a变量和b变量的存储空间。当把x和y这两个指针对应的值交换时,原来的a和b的值也会跟着交换,发生改变。

8.8 各种程序语言特点

软件设计师【软考中级】复习笔记 —— 第八章(程序设计语言与语言处理程序基础)