文章目录
程序的两种执行方式
- 解释:边解释边执行,不产生目标语言程序
优点:易于差错
缺点:效率低,运行慢 - 编译:把某种语言的程序转换成另一种语言的程序,二者在逻辑上等价
优点:只需分析和翻译一次
缺点:运行中发现错误必须查找整个程序确定
Java先编译再以解释方式执行
编译的过程
- 词法分析
- 语法分析
- 语义分析与中间代码生成
- 优化
- 目标代码生成
词法分析
- 词法分析程序又称扫描程序(Scanner)。
– 任务:读源程序的字符流、识别单词(也称单词符号,或简称符
号),如标识符、关键字、常量、界限符等,并转换成内部形式。
– 输入:源程序中的字符流
– 输出:等长的内部形式,即属性字 - 在词法分析阶段工作所依循的是语言的词法规则。
- 描述词法规则的有效工具是正规式和有限自动机。
- 方法:状态图;DFA;NFA
语法分析
- 语法分析程序又称识别程序(Parser)。
– 任务:读入由词法分析程序识别出的符号,根据给定语法规则,识别出各个语法单位(如:短语、子句、语句、程序段、程序),并生成另一种内部表示。
– 输入:由词法分析程序识别出并转换的符号
– 输出:另一种内部表示,如语法分析树或其它中间表示。 - 语法规则通常用上下文无关文法描述。
- 方法:递归子程序法、LR分析法、算符优先分析法。
语句与控制结构
- 表达式:一个表达式是由运算量(亦称操作数,即数据引用或函数调用)和算符组成的。
对于大多数程序语言来说,表达式的形成规则可概括为:
(1)变量、常数是表达式;
(2)若E1、E2为表达式,θ为二元算符,则 E1 θ E2为表达式;
(3)若E为表达式, θ为一元算符,则θE为表达式;
(4)若E为表达式,则(E )是表达式。 - 语句
- 简单语句:不含其它语句成分的基本句。
- 说明语句:说明性语句旨在定义不同数据类型的变量或运算。
- 赋值语句:在赋值句中,赋值号‘:=’左右两边的变量名扮演着两种不同的角色。对赋值号右边的B我们需要的是它的值;对于左边的A我们需要的是它们的所代表的存储单元(的地址)。
- 控制语句
- 无条件转移语句: goto L
- 条件语句: if B then S
if B then S1 else S2 - 循环语句: while B do S
repeat S until B
for i:=E1 step E2 until E3 do S - 过程调用语句: call P( X1,X2,…,Xn)
- 返回语句: return(E)
- 输入输出语句
- Standard Input/output
- getchar()
- putchar()
- scanf()
- printf()
- File Access
- fopen()
- fclose()
- 过程调用语句
- 复合语句:句中有句的语句
- 简单语句:不含其它语句成分的基本句。
形式语言与自动机理论的发展
- 1956年,乔姆斯基(Chomsky)从产生语言的角度研究语言
- 文法 (由文法产生的符号串构成语言)
- 1951-1956年间,克林(Kleene)从识别语言的角度研究语言
- 自动机 (由自动机识别的符号串构成语言)
- 1959年,乔姆斯基不仅确定了文法和自动机分别从生成和识别的角度去表达语言,而且证明了文法与自动机的等价性。
文法
- 文法G是一个四元组G=(VN, VT, S, £),其中
VN :非终结符的有限集合
VT :终结符的有限集合, VN ∩ VT =Φ
S :开始符号且S∈ VN 。
£ :形式为 P→α的产生式的有限集合,
且P∈(VN∪VT)* VN (VN∪VT)* ,α∈ (VN∪VT)* - 文法G1 =({N}, {0, 1},N, {N→0N, N→1N, N→0, N→1})
其中:VN = {N},[非终结符的有限集合]
VT = {0, 1},[终结符的有限集合/字母表]
S = N,[起始符]
£ = {N→0N, N→1N, N→0, N→1} 。[产生式] - 如何由文法产生语言的句子?
基本思想:从识别符号开始,把当前产生的符号串中的非终结符号替换为相应产生式右部的符号串,直到最终全由终结符号组成。这种替换过程称为推导或产生句子的过程,每一步称为直接推导或直接产生。
最左(右)推导(规约)
- 若在推导关系中,每次最先替换最左(右)的非终结符,则称为最左(右)推导;
- 若在归约过程中,每次最先归约最左(右)的非终结符,则称为最左(右)归约。
- 例. 文法G[S]: S→AB A→A0|1B B→0|S1,请给出句子101001的最左和最右推导。
最左推导:S=>1BB=>10B=>10AB1=>101BB1=>101001
最右推导:S=>AAB1=>AA01=>A1B01=>A1001=>1B1001=>101001
句型、句子和语言
- 文法 G[E]: E→E+E│E*E│(E)│i
- 句型:假定G是一个文法,E是它的开始符号,如果E =*> α,则称α是文法G的一个句型。
- 例 (E+E), (i+E), (i+i), E 都是G[E]的句型。
- 句子:仅由终结符组成的句型称为句子。
- 例 (i×i+i), (i+i) 都是G[E]的句子。
- 语言:文法G所产生句子的全体,即:L(G) ={α|S =+> α,α∈VT*}
- 例,设有文法G1[S]: S →bA , A→aA | a,试求此文法所描述的语言。
L(G1)={ ban | n>=1} - 例.设文法G2[S] :S→ AB,A →aA|a,B →bB|b,该文法所描述的语言是什么?
L(G2)={ambn | m,n>=1 }
Chomsky文法体系分类
- 文法G=(VN, VT, S, £),£ :P→ α,其中P∈(VN∪VT)* VN (VN∪VT)* , α∈(VN∪VT)*属于Chomsky文法体系
- 该体系对产生式的形式做了一些规定,分为四类,即0型、1型、2型、3型文法
- 0型文法:无限制文法,短语文法
对应的语言:递归可枚举语言 - 1型文法:上下文有关文法(CSG:Context-sensitive Grammar)
长度:左边<=右边 - 2型文法:上下文无关文法(CFG:Context-free Grammar)
左侧只有非终结符 - 3型文法,也称正规文法
- 右线性文法(Right-linear Grammar):任何产生式为 A→ωB 或 A→ω,其中 A、B∈ VN, ω∈ VT*。
- 左线性文法(Left-linear Grammar):任何产生式为 A→Bω或 A→ω,其中 A、B∈ VN, ω∈ VT*。
- 等价于正规式
- 对应的语言:正规语言
- 对应的自动机:有限自动机(Finite Automaton)。
语法树
- 表示一个句型推导过程的图,是一棵倒立的树。
- 方法:把开始符号S做为语法树的根结点,对每一个直接推导画一次结点的扩展,该结点是直接推导中被替换的非终结符号,其所有儿子结点所组成的符号串是推导中所用产生式右部。直到推出句型或句子或无法再推导时结束。
- 例.文法 G[E]: E→E+T│T,T→T*F│F,F→(E)│i,句型E+F*i,推导:E => E+T => E+T*F => E+F*F => E+F*
二义性
- 如果一个文法的句子(句型)存在两棵语法树,那么,该句子是二义性的。
- 如果一个文法包含二义性的句子,则称这个文法是二义性的; 否则,该文法是无二义性的。
习题