编译原理——第二章

第二章   高级语言及其语法描述

一、程序语言的定义

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型文法,上下文无关文法)。知识主要可以运用到给出一种语言来如何用文法描述,给定一种文法,它定义了一个什么语言?利用文法写出句子的语法树等。知识不是特别难,但是是后续学习的基础,应当重视

猜你喜欢

转载自blog.csdn.net/qq_34149526/article/details/79616857