【编译原理】02词法分析(1)

接上篇 :【编译原理】01引论


        词法分析是编译过程中将字符流转换成为符号流的一个工作阶段,是编译的第一步工作,其后续工作是语法分析。

        词法分析的输入是源代码; 词法分析的输出是符号流; 词法分析需要识别词法错误,即非法的符号、单词等等,但不识别语法错误。

1  词法分析器的作用

        源程序由单词组成,单词是最小的语义单位。

        词法分析器的功能:扫描源程序字符流 ,按照源语言的词法规则识别出各类单词符号,产生用于语法分析的记号序列。

        词法分析器的辅助功能:跳过源程序中的注释和空白,把错误信息和源程序联系起来(错误定位),宏预处理。

1.1词法分析器的工作方式

1.1.1、词法分析器与语法分析器的关系

        1.  词法分析器作为语法分析器的子程序

        2.  词法分析器作为独立的一遍

        3.  词法分析器与语法分析器作为协同程序

1.1.2、分离词法分析器的好处

        可以简化设计

        可以改进编译器的效率

        可以加强编译器的可移植性

2.1记号、模式与单词

        记号:是指某一类单词符号的种别编码,如标识符的记号为id,数的记号为num等。(机内表示)

        模式:是指某一类单词符号的构词规则,如标识符的模式是“由字母开头的字母数字串”。(构词规则)

        单词:是指某一类单词符号的一个特例,如position是标识符。(外部表示)

2.1.1 词法分析器的输出:记号

 记号的种类

        关键字:for, while, if等;

        标识符:position,rate等;

        常数:60

        特殊符号: 算符:+-*/等; 分隔符:分号,空格,引号等等;

记号的属性:

        词法分析器在识别出一个记号后,要把与之有关的信息作为它的属性保留下来,记号的属性是指记号的特征或特性。

        记号影响语法分析的决策,属性影响记号的翻译

        在词法分析阶段,对记号只能确定一种属性 (关键字:一字一种或全体一种; 标识符:一般统归一种,也可分为若干种 ;常数:一般统归一种,也可按类型分种; 运算符:一符一种或一类一种; 分界符:一般用一符一种)

2.1.2 输入的基本单位:单词

        一个被编译的源代码,以字符串的形式输入到词法分析器中,词法分析器的处理单位是“单词”。

         每一个单词对应于词法分析的最终输出 ;单词的不同的构成方式,将产生不同的记号及属性; 注意“单词”还包括程序中的各种特殊符号等。

2.1.3 识别单词的规则:模式

        如何判定一个单词的类型,以及该单词所对应的记号的相关属性,需要通过规则进行区别,这个规则就是模式。

        历史上存在过一些词法模式,对词法分析造成了很大的困难; 形式化描述的词法模式具有严谨、准确的特性; 当前,程序设计语言的词法模式通常使用正规表达式来进行描述;

 2.2 模式的形式化描述    

         字母表(alphabet): 字母表是符号的非空有穷集合,用∑表示

        字符串/符号串/串(String): 符号串是由字母表中的符号所组成的有穷序列

        符号串的长度 :符号串中包含符号的个数,串 s 的长度记为 |s|

        前缀(prefix)、后缀(suffix)、子串(substring)  

        语言(Language): 某个字母表上的符号串的集合

2.3  串和语言

2.3.1 语言的运算

        语言是符号串的集合,集合的运算有并、交、差等

        并运算 — 两个集合的并; 交运算 — 两个集合的交; 差运算 — 两个集合的差;

并运算例如:集合A={ab,cde}, B={0,1}   则  A∪B={ ab,cde,0,1 }

交例如:集合A={ab,cde} B={0,1} 则 AB={ ab1,ab0,cde0,cde1 }

        * 闭包(Kleene closure):0个或多个的连接 L* = L0∪L1∪L2∪L3∪…

        +闭包(Positive closure):1个或多个的连接 L+ = L1∪L2∪L3∪…

         L* = L+ ∪{ε}

 例:Σ={a,b}

Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…}

Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}

综合性的例子: L = {A,B,C,…,Z,a,b,c,…,z}  D = {0,1,…,9}

求:1. L ∪ D     2. LD    3. L4   4. L*     5. L(L ∪ D)*    6. D+

2.4  文法和语言的定义

        语言的有穷表示有两个途经: 生成方式 (文法):语言中的每个句子可以用严格定义的规则来构造。识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”,(要么永远继续下去。)

        文法 G 定义为四元组(VT,VN,S,P):

        VT :终结符(terminals)集,其中的元素一般用小写字母或数字表示(a,b,c…0,1..),代表语言中不可再分的基本符号,如汉语中的汉字、C语言中的标识符。

        VN :非终结符(nonterminals)集,其中的元素一般用大写字母表示(A,B,C…),或者用尖括号括起,代表语法单位,如汉语中的语句、段落,C语言中的语句、表达式、函数等。

        S 是一个特殊的非终结符号,称为开始符号(start symbol) S 至少要在一条产生式中作为左部出现。

        P是一个产生式(production)的集合 产生式(重写规则、生成式):形如α→β的(α,β)有序对,且α∈V+,β∈V* ,其中 V = (VT∪VN) α称为产生式的左部,不能为空ε β称为产生式的右部,可以为空ε(如:A → ε )。

例1:文法 G = (VT,VN,S,P)               

VN = { S }                  

VT ={ 0, 1 }               

P = { S→0S1,  S→01 }

左部相同的产生式可以写在一起,如:  S →0S1 | 01

3  正规表达式

3.1单词符号的描述

        正规表达式是一个表示字符串格式的模式(pattern)。

        可以用来描述单词符号的结构。

        正规式(r)匹配的串集称为正规集(Regular Set),这是一个正规语言,记为L(r)

        正规式的运算( | 、连接、*、+)   —— 字符串集合(语言)的运算

        正规式运算的优先级关系(*和+、连接、| ),可以省略(和) 例如(a)|((b)*(c))—— a|b*c

          正规式的等价:不同算术表达式可以表示同一个数,如3+5、5+3、2+6等均表示8。不同正规式也可以表示同一个正规集,即正规式与正规集之间是多对一的关系。若正规式P和Q表示了同一个正规集,则称P和Q是等价的,记为P=Q。

例1 设字母表∑={a,b,c},则∑上的部分正规式和正规集如下:

正规式     对应正规集  

a,b,c     {a},{b},{c}

a|b , b|a     {a}∪{b}={a,b}

a(a|b)*     {a,aa,ab,aba,abb...},a为首的ab字符串

∑*        {ε,a,b,c,aa,abc,...}                            

例2 令 L(x)={a,b},L(y)={c,d},     

则 L(x|y)={a,b,c,d}  , L(y|x)={a,b,c,d}

 正规式的代数性质:

正规式的命名:    di→ri  其中di为正规式ri的名字

简化正规式描述

(a) 正闭包 :     r+ = rr* = r*r,r* = r+|ε

(b) 可缺省  :      r?=r|ε

(c) 字符组 :      枚举:   [abc],它等价于a|b|c      分段:   [0-9a-z]

(d) 非字符组  :      若 ∑={a, b, c, d, e, f, g},      则 L([^abc]) = { d, e, f, g

例1、以01结尾的二进制数串 :(0|1)*01 

例2、能被5整除的十进制整数: digit → [1-9]   digits → digit(digit|0)  *  digits(5|0)|0         

例3、不包含子串011的由01组成的符号串: 1*(01|0)* 

 例4、每个a后面至少紧随两个b的ab串 :  (abb|b)*

例5、C的形如/*…*/的注释,其中…不包含*/的字符串:  /*([^*]|*[^/])**/ 

 例6、合法的日期表示有如下三种形式,请给出描述日期的正规式。  

年.月.日,如1992.08.12  

日  月  年,如12  08 1992  

月/日/年,如08/12/1992


上篇:【编译原理】01引论

下篇:【编译原理】02词法分析(2) 

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值