第二章 高级语言及其语法描述
一、程序语言的定义
1、程序语言主要是由语法和语义两个方面定义。
2、任何语言程序都可以看作是一定字符集(称为字母表)上的一字符串(有限序列)。
3、单词符号是语言中具有独立意义的最基本结构。一般包括:各类型的常数,标识符,记本子,算符和界符等。
4、词法规则是指单词符号的形成规则。
5、语言的语法规则规定了如何从单词符号形成更大的结构(语法单位),换言之,语法规则是语法单位的形成规则。语法单位一般包括:表达式,语句,分程序,函数,过程和程序。
6、语言的语法规则和词法规则定义了程序的形式结构。
7、语言的语义是指这样的一组规则:使用它可以定义一个程序的意义。
8、大多数编译程序采用的基于属性文法的语义制导翻译方法。
9、程序设计语言:建立在有限字母集上的一个符号系统。
10、一个程序语言的基本功能是描述数据和对数据的运算。程序从本质上来说是描述一定数据的处理过程。
二、高级语言的一般特性
1、高级语言的分类
(1)、语言范畴:强制式语言(FORTRAN、C)、应用式语言(LISP、ML)、基于规则的语言(Prolog)、面向对象语言(Java)
(2)、编译时是否需要类型检查:静态类型语言(C/C++、Java)、动态类型语言(Python、PHP)
(3)、类型检查强弱:弱类型、强类型
(4)、是否支持过程的嵌套定义:支持(Pascal)、不支持(C/C++、Java)
2、数据类型
基本数据类型(int,double...)
构造数据类型(数组、指针...)
自定义数据类型(栈、队列、字符串...)
三、程序语言的语法描述
1、设∑是一个有穷字母表,它的每个元素称为一个符号。∑上的一个符号串是指由∑中的符号所构成的一个有穷序列。不包含任何符号的序列称为空字,记为ε。用∑*表示∑上的所有符号串的全体,包括ε。φ表示不含任何元素的空集。
2、集合V自身的n次(连接)积记为:Vⁿ=VV...V;规定Vº={ε}。令V*=Vº∪V¹∪V²...Vⁿ,称为V的闭包。
记V﹢=VV*,称为V的正则闭包。
3、上下文无关文法G
(1)、G定义:它所定义的语法范畴(语法单位)是完全独立于这种范畴可能出现的环境的。
(2)、G包括四个组成部分:一组终结符号(VT),一组非终结符号(VN),一个开始符号(S),一组产生式(P)。
VT:一般用小写字母或阿拉伯数字表示,非空有限集
VN:一般用大写字母表示,非空有限集 VN∩VT=φ
S:非终结符号
P:产生式集合(有限),形式:P—>a,P∈VN,a∈(VT∪VN)*。S必须在某个产生式的左部出现一次。
(3)、假定G是一个文法,S是它的开始符号。如果S=>a,则称a是一个句型。仅含终结符的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为L(G)。
L(G)={ a | S=+>a&a∈VT* }。
4、文法例子
(1)、考虑一个文法G1:S->bA A->aA|a 它定义了一个什么语言?
S=>bA=>ba
S=>bA=>baA=>baa……a 所以:L(G1) = { baⁿ | n>=1}
(2)、构造一个文法G使 L(G) = { aⁿⁿbⁿ | m,n>=1 }
a的个数和b相同,所以会同时产生。
S->aSb | ab。
5、最左推导:任何一步a=>b都是对a中的最左边非终结符进行替换。
6、如果文法G的一个句子存在两棵不同的最左语法分析树,则这个文法是二义的。
7、如果文法G的一个句子存在两棵不同的最右语法分析树,则这个文法是二义的。
8、乔姆斯基(Chomsky)将文法分为四类,即0型文法(强于1)、1型文法(强于2)、2型文法(强于3)、3型文法。
9、0型文法是短语文法,1型文法是上下文有关文法,上下文无关文法是2型文法,2型文法的描述能力最强,3型文法又称为正规文法。
四、知识应用
1、令文法G为: N->D | ND
D->0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
(1)G的语言L(G)是什么?
L ( G ) 1 是0~9 组成的数字串
(2)写出句子0127的最左和最右推导
最左推导: N =>ND =>NDD =>NDDD =>DDDD =>0DDD =>01DD=>012D=>0127
最右推导: N =>ND =>N7=>ND7=> N27=> ND27=> N127=> D127=>0127
2、写出一个文法使其语言为奇数集,且每个奇数不以0开头
G( S ) (判断一位奇数、两位奇数及多位奇数的组成)
S->J | AJ
J->1 |3| 5| 7| 9
O->2 |4 |6 |8 | J
T->0 | O
A->AT | O
3、令文法为: E->T | E + T | E - T
T->F | T * F | T / F
F->( E ) | i
给出 i + i + i、i + i * i 的语法树
i + i + i i + i * i
4、把下面文法改成无二义的
S-> SS | ( S ) | ( )
改正后: S->TS | T
T->( S ) | ( )
5、给出下列语言的相应文法
(1) L1 = { aⁿ bⁿ ci | n>=0 ,i >=1}
G( S ) S->AC
A->aAb | ab
C->cC | ε
(2)L2 = { aⁿ bⁿ aⁿⁿ bⁿⁿ | n,m>=0 }
G( S ) S->AB
A->aAb | ε
B->aBb | ε
五、总结
本章主要学习了什么是程序语言、高级语言的分类以及用语法来描述语言(主要是2型文法,上下文无关文法)。知识主要可以运用到给出一种语言来如何用文法描述,给定一种文法,它定义了一个什么语言?利用文法写出句子的语法树等。知识不是特别难,但是是后续学习的基础,应当重视。