编译原理_P1002

.  词法分析

1.1  词法记号及属性

词法记号、模式、词法单元

记号名       词法单元列举         模式的非形式描述

if         if            字符i,f

for        for              字符f,o,r

relation      <,<=,=,...         <或<=或=或...

id        sum,count,D5      由字母开头的字母数字串

number      3.1,10,2.8 E12      任何数值常数

literal       “seg.error”        引号“和”之间任意不含引号本身的字符串

历史上词法定义中的一些问题

---- 忽略空格带来的困难

  DO 8 I = 3.75   等同于  DO8I=3.75

  DO 8 I = 3,75

---- 关键字不保留

  IF THEN THEN THEN=ELSE; ELSE ...

---- 关键字、保留字和标准标识符的区别

  保留字是语言预先确定了含义的词法单元

  标准标识符也是预先确定了含义的标识符,但程序可以重新声明它的含义

词法记号的属性

position = initial + rate * 60 的记号和属性值:

<id,指向符号表中position条目的指针>

<assign_op>

<id,指向符号表中initial条目的指针>

<add_op>

<id,指向符号表中rate条目的指针>

<mul_op>

 <number,整数值60>

词法错误

---- 词法分析器对源程序采取非常局部的观点

---- 例:难以发现下面的错误

  fi(a == f(x))....

---- 在实数是“数字串.数字串”格式写,可以发现下面的错误

  123.x

---- 紧急方式的错误恢复

  删掉当前若干个字符,直到能读出正确的记号

---- 错误修补

  进行增、删、替换和交换字符的尝试

1.2  词法记号的描述与识别

串和语言

---- 字母表:符号的有限集合,例如:Σ = {0,1}

---- 串:符号的有穷序列,例如:0100,ε

 ---- 语言:字母表上的一个串集

  {ε,0,00,000,...},{ε},Φ

 ---- 句子:属于语言的串

串的运算

---- 连接(积) xy, se = es = s

---- 幂  s0为e,si为si-1s(i>0)

语言的运算

---- 并运算:L∪M = {s|s∈L或s∈M}

---- 连接:LM={st|s∈L且t∈M}

----幂运算:L0是{e},Li是Li-1L

---- 闭包:L*=L0∪L1∪L2∪...

---- 正闭包:L+=L1∪L2∪...

正规式:

  正规式用来表示简单的语言,叫做正规集

正规式        定义的语言        备注

e          {e}

a          {a}            a∈Σ

(r)|(s)        L(r)∪L(s)         r和s是正规式

(r)(s)        L(r)∪L(s)         r和s是正规式

(r)*         (L(r))*          r是正规式

(r)         L(r)            r是正规式

((a)(b)*)|(c)可以写成ab*|c,如果按照定义了优先级可以按照这种形式写出。

其他例子:

---- a|b    {a,b}

----- (a|b)(a|b)  {aa,ab,ba,bb}

----- aa|ab|ba|bb  {aa,ab,ba,bb}

---- a*    由字母a构成的所有串集

---- (a|b)*  有a和b构成的所有串集

*表示重复若干次

正规定义

---- 对正规式的命名,使表示简介

?---可以有可以没有,+表示可选择。

ws,white space ,若干个空白符

转换图

 1.3  有限自动机

不确定的有限自动机NFA

1.4  确定的有限自动机DFA

NFA到DFA的变化

一种算法示意如下:

例题:

 

猜你喜欢

转载自www.cnblogs.com/noah0532/p/8974347.html