第二章 程序设计语言基础
概述
程序设计语言的分类
1.命令式和结构化程序设计语言:Fortran(公式翻译,用代码表示数学公式)、PASCAL、C语言等
面向对象的程序设计语言:Java、C++、C#等
函数式程序设计语言:lisp、scala等
逻辑型程序设计语言:Prolog
脚本语言:PHP、js、Python等
2.低级语言:面向机器的语言
高级语言:面向应用程序的语言
3.解释型语言:不产生目标程序、效率低、灵活性好、可移植性好
编译型语言:生成目标程序、效率高、可移植性差
语法分析阶段
源程序
词法分析
语法分析
语义分析
中间代码生成
代码优化
目标代码生成
目标代码
编译程序
1.词法分析阶段:输入源程序,对构成源程序的字符串进行扫描和分解, 识别出一个个的单词,删掉无用的信息,报告分析时的错误。
2.语法分析阶段:语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位。通过 语法分析确定整个输入串是否构成一个 语法上正确的程序。 分析句子结构
主谓宾是否错误
注意:词法分析和语法分析本质上都是对源程序的结构进行分析
3.语义分析阶段:来检查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用。 分析句子含义
羊吃草 不能说成 草吃羊
语义分析分为静态分析和动态分析两个部分。
静态语义分析使用语法制导翻译
4.生成中间代码阶段:不依赖具体计算机,表现形式如下:
(1)后缀式(逆波兰式)
(2)树型表示
(3)三元式:X = (a+b)* (c+d)
(4)四元式
出错处理:
(1)静态错误
a.语法错误 单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误
b.静态语义错误:运算符与运算对象类型不符
(2)动态错误
程序运行时出现:变量取0做除数;引用数组下标越界
文法:?
文法G定义为一个四元组(VN,VT,P,S),其中,VN为非中介符集合,VT终结符集合;P是产生式结合;S成为识别符或开始符号,也是一个非终结符,至少要在一个产生式的左边出现。
G[S]:
S -> aA|bB
A -> bS|b
B -> aS|a
0型文法:短语文法、图灵机、递归枚举
1型文法:上下文有关文法
2型文法:上下文无关文法(广泛使用于语法规则)
3型文法:正规式(词法分析)
有限自动机
确定的有限自动机DFA 该状态机在任何一个状态,基于输入的字符都能做成一个确定的状态转换。
不确定的有限自动机NFA 该状态机在任何一个状态,基于输入字符不能做成一个确定的状态转换。这里分为两种状态1.对于一个输入,他有两个状态可以转换。2.存在空的情况,即不输入任何字符,NFA可以从一个状态转换到另一个状态。
正规式
Ab:字符串ab构成的集合
a|b:字符串a、b构成的集合
a*:由0个或多个a构成的字符串集合
(a|b):所有字符a和b构成的字符串集合
a(a|b): 以a为首字母的a、b字符串的集合
(a|b)*abb: 以abb结尾的a、b字符串的集合