文章目录
一、程序语言的定义
程序语言是一个记号系统,主要有语法、语义和语用等三方面定义。
语法(Syntax) 定义语言的词法和语法的形式规则。
语义(Semantic) 定义语言的单词符号和语法单位的意义。
语用(Pragmatic) 定义程序设计技术和语言成分的使用方法,它使语言的基本概念与语言的外界联系起来。
1.语法
任何语言程序都可看成是一定字符集上的一个字符串(有限序列)。
一个语言的语法规则定义了程序的形式结构。
语法规则是指这样的一组规则,用它可以形成和产生一合式(合法)的程序。这些规则的一部分称为词法规则,另一部分称为语法规则(或产生规则)。
单词符号是语言中具有独立意义的最基本结构。
词法规则定义了程序中单词符号的形成规则。即字母表中的哪些字符可以构成一个合法的单词。
单词符号包括:常量、标识符、基本字、界符、运算符
描述词法规则的有效工具:正规式、正规文法、有限自动机
例如: 字符串 0.5 * x+c
单词符号: 0.5 x c * +
语法单位: 0.5*x+c
语法规则规定了如何从单词符号串中形成更大的结构(即语法单位)。它是语法单位的形成规则。
语法单位包括:表达式、语句、分程序、函数、过程、程序。
描述语法规则的有效工具:上下文无关文法、BNF(Backus Naur Form)
2.语义
语义规则是指这样的一组规则,使用它可以定义一个程序的意义。
描述语义规则的工具:基于属性文法的语法制导翻译方法
所谓程序,是描述一定数据的处理过程,即包括描述数据和对数据的运算两个功能。
程序的层次结构如下图:
二、高级语言的一般特性
1.高级语言的分类
从语言范型,程序设计语言分四类:
●强制式语言(Imperative Language) C, FORTRAN…
●应用式语言(Applicative Language) LISP…
●基于规则的语言(Rule-based Language)Prolog…
●面向对象语言(Object-Oriented
2.程序结构
一个高级语言程序通常由若干子程序段(过程、函数)构造。许多语言还引入了类、程序包等更高级的结构。
2.1 FORTRAN
一个Fortran程序由一个主程序和若干个辅程序段组成。
PROGRAM MAIN
……
END
SUBROUTINE SUB1
……
END
SUBROUTINE SUB1
……
END
2.2 Pascal
Pascal是一个允许子程序嵌套的语言。
Program EX
…… {说明部分}
procedure P1;
……
procedure p11;
……
begin
……
end;
begin
……
end;
Begin
…… {执行语句部分}
End.
2.3 Ada
在Ada语言中引入了程序包(Package),它可以把数据和操作代码封装在一起,支持数据抽象。一个程序包有两部分:
可见的规范说明:
定义程序包外面可以访问的对象。
程序包体:
定义程序包的实现细节。
2.4 JAVA
Java是一种面向对象的高级程序语言,它很重要的方面是类(Class)及继承(Inheritance)的概念。
同时支持多态性(Polymorphism)和动态绑定(Dynamic binding)等特性。
3.数据类型与操作
一个数据类型通常包括以下三个要素:
● 用于区别这种类型的数据对象的属性;
(类型名,作用域)
● 这种类型的数据对象可以具有的值;
( 取值范围 )
● 可以作用于这种类型的数据对象的操作。
(运算符)
一、初等数据类型: 数值数据、逻辑数据、字符数据、指针类型
二、复合数据类型: 数组、记录、字符串、表格、栈和队列
三、抽象数据类型
一个抽象数据类型包括:
(1)数据对象的一个集合;
(2)作用于这些数据对象的抽象运算的集合;
(3)类型对象的封装。
4.语句与控制结构
表达式:
表达式是由运算量和运算符组成的。运算量亦称操作数,即数据引用或函数调用;运算符有算术运算符、逻辑运算符、关系运算符等,运算符之间有规定的优先级和结合性。
表达式的形成规则:
(1)变量、常量是表达式;
(2)若E1,E2为表达式,是二元运算符,
则 E1 E2 也是表达式;
(3)若E为表达式,是一元运算符,则 E (或E )
也 是表达式;
(4) 若E为表达式,则 ( E )也是表达式。
语句:
1、赋值句
2、控制语句
无条件转移语句
条件语句
循环语句
过程(或函数)调用语句
返回语句
3、说明句
4、简单句和复合句
三、程序语言的语法描述
基本概念:
设∑是一个有穷字母表,它的每个元素称为一个符号。 ∑上的一个符号串是指由∑中的符号所构成的一个有穷序列。不包含任何符号的序列称为空字,记为ε 。
∑*表示∑上的所有符号串组成的集合。空字ε也包括在其中。
Φ 表示不含任何元素的空集 { } 。
●∑ * 的子集U和V的(连接)积定义为
UV = {αβ | α∈U & β∈V }
即集合UV中的符号串是由U和V的符号串连接而成的。
● V自身的n次积(连接)记为
V^n = VV …V
●规定V^0 = {ε}
V* = V^0 U V^1 U V^2 U V^3 U …
称 V* 是V的闭包。
● V + = VV* 称 V+是V的正则闭包。
例如 若 ∑ = { a , b }
则 ∑* = {ε,a,b,aa,ab,ba,bb,aaa , … }
1.上下文无关文法
文法是描述语言语法结构的形式规则,即语法规则。
语法规则必须是正确的,且易于理解。
上下文无关文法是这样一种文法,它所定义的语法范畴是完全独立于这种范畴所可能出现的环境的。
以后,凡“文法”一词若无特别说明,则均指上下文无关文法。
例如:英文的语法规则:
“→ ”表示“由…组成”或“定义为”。
有时,“→” 也用 “ ::= ”表示,后者为巴科斯范式(BNF),前者为其简化表示。
例如: 判断He gave me a book.是否为正确句子:
利用文法描述程序设计语言
文法为程序设计语言提供了精确、易懂的语法规则;
从文法出发,可以自动构造一个有效的语法分析器;
设计合理的文法使程序设计语言具有良好的结构;
基于文法描述的程序设计语言便于实现扩展。
归纳起来,一个上下文无关文法包括四个组成部分:
一组终结符号 如:me ,book,gave 等
一组非终结符号 如:<主语>,<谓语> 等
一个开始符号 如: <句子>
一组产生式 如:<间接宾语> → <代词>
<直接宾语> → <冠词> <名词>
上下文无关文法的定义:
形式上说,一个上下文无关文法G是一个四元式:
G=(VT,VN,S,P),其中: VT是一个非空有限集,它的每个元素为终结符号; VN是一个非空有限集,它的每个元素为非终结符号, 且VT∩VN= Φ
S 是一个非终结符号,称为开始符号;
P是产生式有限集合,形如P→α
其中:P ∈ VN, α∈(VT U VN)*。
注: 开始符号S是一个特殊的非终结符号,它至少必须在某个产生式的左部出现一次。
若产生式的左部相同,则可以合并:
例如:
P→ α1
P→ α2
…
P→ αn 可合并为:
P→α1|α2| … |αn 其中:每个αi 称为P的一个侯选式
“ →” 读为 “定义为”
“|” 读为 “或”
约定:
- 大写字母A、B、C……或汉语词组通常代表非终结符;
- 小写字母a、b、c……代表终结符;
- α、β、γ……代表(VT U VN)*
例如:下面是一个上下文无关文法。
G(E):
E → i | EAE
A → * | +
其中,E、A是非终结符,E是开始符号,i、+、* 是终结符
例如:算术表达式的定义
1.常量5、变量i是算术表达式;
2.若E1,E2是算术表达式,则 E1+E2, E1*E2, (E1)也是算术表达式。
用产生式来描述 G(E):
E → E + E
E → E﹡E
E → (E)
E → i
E → 5
即:E→ E+E | E * E | (E) | i | 5
一个上下文无关文法是如何定义一个语言呢?
从开始符号出发,反复连续使用产生式,对非终结符施行替换和展开,直到推导的字符串全由终结符组成(即句子),所有句子的集合即为该文法定义的语言。
例如:文法G(S):
S → AB
A → a | aA
B → b | Bb
则该文法定义的语言为:
L(G)={ a^m b^n | m , n > 0 }
例题 证明 i+5 是一个算术表达式
证明:
E => E+E ( 根据 E-> E+E)
=> i+E ( 根据 E-> i )
=> i+5 ( 根据 E-> 5 )
故 i+5 是算术表达式。
解释:=> 表示仅使用一次规则的一步推导。
术语:
最左推导和最右推导
最左推导: 是指任何一步 α=> β推导都是对 α 的最左非终结符进行替换的。
最右推导:是指任何一步 α=> β 推导都是对 β 的最右非终结符进行替换的。
例如:写出句型 (i + i * i) 的最左推导。
解:E=> (E) => (E+E) => (i+E)
=> (i+E * E) => (i+i * E) => (i+i*i)
2.语法分析树和二义性
语法分析树也可以描述一个句型的推导。
语法分析树的根由开始符号所标记。
随着推导的展开,当某个非终结符被它的某个候选式所替换时 ,就产生下一代新结点,候选式中自左自右的每个字符对应一个新结点。
在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末(叶子)自左自右排列起来就是一个句型。
文法的二义性
一棵语法树是一个句型的种种不同推导过程的共性抽象,是它们的代表。
一棵语法树完全等价于一个最左(右)推导。
在一个文法中,若存在某个句子有两个不同的最左推导,则称该文法是二义的。
或者说,
在一个文法中,若存在某个句子有两棵不同的语法树,则称该文法是二义的。
注 文法的二义性问题是不可判断的。
即,不存在一个算法,它能在有限步内判断一个文法是否是二义的。
约定:
作为描述程序语言的文法,有以下几点限制:
(1) 不能有任何产生式 : P -> P
(2) 每个非终结符P必须都有用处。即,必须存在含P的句型: S=>……=>α P β
且 P=>……=> γ ( γ∈VT*)
3.形式语言鸟瞰
Chomsky把文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别,在于对产生式的形式施加了不同的限制。从0型到3型依次增强,但它们表达语言的能力则依次减弱。
设G=(VT,VN,S,P)是0型文法,如果它的每个产生式:
α→β
其中: α ,β ∈( VT U VN )*
且α中至少含有一个符号A∈ VN,
0型文法又称为短语文法。
对0型文法施加第 i 条限制,就得到 i 型文法:
(1) |α| ≤ |β|,仅S→ε 除外但S不能出现在任何产生式右部。
(2) G的任何产生式为: P→ α
其中: P ∈ VN, α ∈(VT U VN) * 。
(3) G的任何产生式为: A→αB 或 A→α
其中: A,B ∈ VN, α∈VT*
1型文法又称为上下文有关文法。
2型文法又称为上下文无关文法。
3型文法又称为正则(规)文法(或 线性文法)。
(1) 若3型文法产生式的形式为:
A→αB 或 A→α 则称为右线性文法。
(2)若3型文法产生式的形式为:
A→Bα 或 A→α 则称为左线性文法。