第五章 程序设计语言基础知识(编译原理)
-
程序设计语言概述:程序设计语言的基本概念、程序设计语言的基本成本
-
语言处理程序基础:编译程序基本原理、文法分析、正规式、有限自动机
1.程序设计语言概述
-
程序设计语言是为了书写计算机程序而认为设计的符号语言,用于对计算过程进行描述、组织和推导。
-
低级语言:机器语言(计算机硬件只能识别0和1的指令序列),汇编语言。
-
高级语言:功能更强,抽象级别更高,与人们使用的自然语言比较接近。
-
解释和编译:都是将高级语言翻译成计算机硬件认可的机器语言加以执行。不同的是:
- 编译程序生成独立的可执行文件,直接运行,运行时无法控制源程序,效率高。(生成目标代码)
- 而解释程序不生成可执行文件,可以逐条解释执行,用于调试模式,可以控制源程序,因为还需要控制程序,因此执行速度慢,效率低。(不生成目标代码)
2.程序设计语言的基本成分
-
数据成分:指一种程序设计语言的数据和数据类型。数据分为常量、变量、全局量、局部量。数据类型有整型、字符型、双精度、单精度浮点型、布尔型。
-
运算成分:指明允许使用的运算符号及运算规则。包括算术运算、逻辑运算、关系运算、位运算等。
-
控制成分:指明语言允许表达的控制结构。包括顺序结构、选择结构、循环结构(初始化+循环体+循环条件)
-
传输成分:指明语言允许的数据传输方式。如赋值处理、数据的输入输出等。
-
函数:C程序由一个或多个函数组成。函数使用涉及三个概念:函数定义、函数声明、函数调用。
-
传值调用:将实参的值传递给形参,形参的改变不会导致调用点所传的实参的值改变。实参可以是合法的变量、常量和表达式。
-
传址调用:即引用调用,将实参的地址传递给形参,即相当于实参存储单元的地址引用,因此其值改变的同时就改变了实参的值。实参不能为常量,只能是合法的变量和表达式。
-
因此,在编程时,要改变参数值,就传址,不改变,就传值。
3.编译程序基本原理
- 编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言)。编译程序工作过程分为6个阶段:
- 词法分析:词法分析阶段是编译过程的第一个阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词” 符号。“单词”符号是程序设计语言的基本语法单位,如关键字(或称保留字)、标识符、常数、运算符和分隔符(如标点符号、左右符号)等。词法分析程序输出的“单词”常以二元组的方式输出,即单词种别和单词自身的值。
- 语法分析:语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”、“语句”和“程序”等。词法分析和语法分析在本质上都是对源程序的结构进行分析。
- 语义分析:是编译过程的一个逻辑阶段,语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。只有语法和语义分析都正确的源程序才能翻译成正确的目标代码。
- 中间代码和目标代码生成:中间代码是根据语义分析产生的,需要经过优化链接,最终生成可执行的目标代码,引入中间代码的目的是进行与机器无关的代码优化处理。常用的中间代码有后缀式(逆波兰式)、三元式(三地址码)、四元式和树等形式。
4.文法定义
- 终结符:最终结果,不能推导出其他元素。
- 非终结符:能够推导出其他元素。
- 产生式:即非终结符推导出终结符的公式。
- 闭包,一般考察闭包可以为0个的情况代入运算;
5.文法类型
6.正规式
正规式例题
上面这道例题,其中的丨表示“或”,*表示重复 [0,+∞)次。那么对于文法G[S]的分析如下:👇👇👇
第一空:👇👇👇
A选项:首先S→aA丨bB,可以推出aA;根据A→bS丨b,可以推出abS;根据S→aA丨bB,可以推出abaA;根据A→bS丨b,可以推出ababS;可以发现这样的正规式是一个以ab循环多次的字符串,即可以推出ababab。
B选项:首先S→aA丨bB,可以推出bB;根据B→aS丨a,可以推出baS;根据S→aA丨bB,可以推出babB;根据B→aS丨a,可以推出babaS;可以发现这样的正规式是一个以ba循环多次的字符串,即可以推出bababa。
C选项:首先S→aA丨bB,可以推出aA;根据A→bS丨b,可以推出abS;根据S→aA丨bB,可以推出abbB;根据B→aS丨a,可以推出abbaS;根据S→aA丨bB,可以推出abbaaA;根据A→bS丨b,可以推出abbaab。
D选项:首先S→aA丨bB,可以推出bB;根据B→aS丨a,可以推出baS;根据S→aA丨bB,可以推出babB;此时根据B→aS丨a,无法推出babb,因为B要么是aS、要么是a,不可能出现b这种情况,所以D选项是错误的!!!
第二空:意思是说这四个选项中哪一个可以将第一空中文法G[S]可以识别的三个选项都表示出来:👇👇👇
A选项:(a丨b)*,它可以将由a或b组成的任意串表达出来,也就是这样:a、ab、baa、babba这些都可以。那么它所表达的范围已经超出了文法G[S]可以识别的范围,它无法与文法G[S]保持等价,所以排除A选项。
B选项:(ab)*,它可以将由ab组成的串循环表示 [0,+∞) 次,也就是这样:ab、abab、abababab这些都可以。但是它无法表达第一空的B、C两个选项,因为它全部是以ab这样的形式表达的。所以排除B选项。
C选项:(ab丨ba)*,它可以生成任意数量的ab串或ba串,也就是这样:ababab、bababa或者abbaab这些都可以,它所表达的范围与文法G[S]完全等价!!!
D选项:(ab)(ba),它的意思是:先来若干个ab串、再来若干个ba串,也就是这样:ababab、bababa、ababbaba这些都可以,但是它无法表示第一空的C选项。所以排除D选项。
7.语法分析方法
- 自上而下语法分析:最左推导,从左到右。
- 递归下降思想:原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,是一种自上而下的语法分析方法。
- 自下而上语法分析:最右推导,从右到左。
- 移进-规约思想:设置一个栈,将输入符号逐个移进栈中,栈顶形成某产生式的右部时,就用左部去代替,称为归约。这个思想是通过右部来推导出左部,因此是自下而上语法分析的核心思想。