第03章_词法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

状态转换图实现示例
’*':
BEGIN GETCHAR; ($POWER, IF CHAR='*' THEN RETURN ($POWER,-); RETRACT; RETURN ($STAR,-); ($STAR, END;
',': RETURN ($COMMA,-); '(': RETURN ($LPAR,-); ')': RETURN ($RPAR,-); END OF CASE; ERROR; GOTO START;
状态转换图示例
几点重要限制——不必使用超前搜索
所有关键字都是保留字; 所有关键字都是保留字;用户不能用它们作自 己的标识符 关键字作为特殊的标识符来处理; 关键字作为特殊的标识符来处理;不用特殊的 状态图来识别,只要查保留字表。 状态图来识别,只要查保留字表。 如果关键字、标识符和常数(或标号) 如果关键字、标识符和常数(或标号)之间没有 确定的运算符或界符作间隔, 确定的运算符或界符作间隔,则必须使用一个 空白符作间隔。 空白符作间隔。
状态转换图实现示例
START: TOKEN:=''; /*置TOKEN为空串*/ GETCHAR; GETNBC; CASE CHAR OF 'A'..'Z':
BEGIN WHILE LETTER OR DIGIT DO BEGIN CONCAT;GETCHAR END; RETRACT; C:=RESERVE; ($ID, IF C=0 THEN RETURN ($ID,TOKEN) (C, ELSE RETURN (C,-) END;
Βιβλιοθήκη Baidu
状态转换图实现示例
全局变量与过程
1) CHAR 字符变量、存放最新读入的源程序 字符变量、 字符 字符数组, 2) TOKEN 字符数组,存放构成单词符号的 字符串 子程序过程, 3) GETCHAR 子程序过程,把下一个字符读 入到CHAR CHAR中 入到CHAR中 子程序过程,跳过空白符, 4) GETNBC 子程序过程,跳过空白符,直至 CHAR中读入一非空白符 CHAR中读入一非空白符 子程序, CHAR中的字符连接到 5) CONCAT 子程序,把CHAR中的字符连接到 TOKEN
3.1.1 词法分析器的功能和输出形式
输出的单词符号的表示形式:
(单词种别,单词符号的属性值)
单词种别通常用整数编码表示。 单词种别通常用整数编码表示。
若一个种别只有一个单词符号,则种别编码就代表 该单词符号。假定关键字、运算符和界符都是一符 一种。 若一个种别有多个单词符号,则对于每个单词符号, 给出种别编码和自身的值(属性)。
* 0 1 2


V = VV = V ∪ V ∪ …
* 1 2
+

称V+是V的正规闭包。 的正规闭包。
3.3.1 正规式与正规集
正规式也称正则表达式,正规表达式 (regular expression)是说明单词的模式 (pattern)的一种重要的表示法(记号), 是定义正规集的数学工具。我们用以描述 单词符号。 一个字集合是正规集当且仅当它能用正规 式表示。
X 1 Y 3 2
3.2.3 状态转换图
一个状态转换图可用于识别(或接受)一定 的字符串。
字母或数字 1 字母 2 其他 * 3 1 数字 数字 其他 *
2
3
识别标识符的状态转换图
识别整常数的状态转换图 识别整常数的状态转换图 整常数
状态转换图示例
助忆符:直接用编码 表示不便于记忆,因 此用助忆符来表示编 码
3.2.3 状态转换图
状态转换图是一张有限方向图。
结点代表状态,用圆圈表示。 结点代表状态,用圆圈表示。 状态之间用箭弧连结,箭弧上的标记(字符 字符)代 状态之间用箭弧连结,箭弧上的标记 字符 代 表射出结点 表射出结点状态下可能出现的输入字符或字符 类。 一张转换图只包含有限个状态, 一张转换图只包含有限个状态,其中有一个为 初态,至少要有一个终态。 初态,至少要有一个终态。
DO99K=1,10 要写成 DO 99 K=1,10
3.2.4 状态转换图的实现
思想:每个状态结对应一小段程序。 做法:
1)对不含回路的分叉结,可用一个CASE语 1)对不含回路的分叉结,可用一个CASE语 对不含回路的分叉结 CASE 句或一组IF THEN-ELSE语句实现 IF句或一组IF-THEN-ELSE语句实现 2)对含回路的状态结 可对应一段由WHILE 对含回路的状态结, 2)对含回路的状态结,可对应一段由WHILE 结构和IF IF语句构成的程序 结构和IF语句构成的程序 3)终态结表示识别出某种单词符号 因此, 终态结表示识别出某种单词符号, 3)终态结表示识别出某种单词符号,因此, (C, 其中, 对应语句为 RETURN (C,VAL) 其中,C为 单词种别,VAL为单词自身值 单词种别,VAL为单词自身值
3.1.1 词法分析器的功能和输出形式
例 FORTRAN程序
I=1, DO 15 I=1,100 输出单词符号: 输出单词符号: (3, DO (3,-) (19, 15’的二进制 的二进制) 标号 (19, ‘15 的二进制) (26, 标识符 (26, ‘I’) ) (40, 赋值号 (40,-) (7, 的二进制) 整常数 (7, ‘1’的二进制) 的二进制 逗号, (12, 逗号, (12,-) (7, 100’的二进制 的二进制) 整常数 (7, ‘100 的二进制)
状态转换图实现示例
全局变量与过程
布尔函数,判断CHAR CHAR中字符是否为字 6) LETTER 布尔函数,判断CHAR中字符是否为字 母 布尔函数,判断CHAR CHAR中字符是否为数字 7) DIGIT 布尔函数,判断CHAR中字符是否为数字 整型函数,对于TOKEN TOKEN中的字符串查 8) RESERVE 整型函数,对于TOKEN中的字符串查 找保留字表,若它是保留字则给出它的编码, 找保留字表,若它是保留字则给出它的编码,否 则回送0 则回送0 子程序, 9) RETRACT 子程序,把搜索指针回调一个字符位 置 函数, TOKEN中的字符串翻译 中的字符串翻译成 10) DTB 函数,把TOKEN中的字符串翻译成二进制 码
3.3 正规表达式与有限自动机
几个概念:
考虑一个有穷字母表∑ 考虑一个有穷字母表∑字符集 有穷字母表
其中每一个元素称为一个字符 ∑上的字(也叫字符串)是指由∑中的字符所构 成的一个有穷序列 不包含任何字符的序列称为空字,记为ε 用∑*表示∑上的所有字的全体,包含空字ε
例如: ={a, b}, 例如: 设 ∑={a, b},则
3.3.1 正规式与正规集
定义(正规式和它所表示的正规集): 设字母表为Σ,辅助字母表Σ`={Φ,ε,,•,∗, (,)}。
都是Σ上的正规式, 1、 ε和Φ都是Σ上的正规式,它们所表示的正规集分别 为 { ε } 和{ } ; 任何a 上的一个正规式, 2、任何a∈ Σ,a是Σ上的一个正规式,它所表示的正规 集为{a} {a}; 集为{a}; 假定e 都是Σ上的正规式, 3、假定e1和e2都是Σ上的正规式,它们所表示的正规集 分别为L(e 那么, 分别为L(e1)和L(e2),那么,(e1),e1 e2,e1•e2,e1∗也都 是正规式,它们所表示的正规集分别为L(e 是正规式,它们所表示的正规集分别为L(e1), L(e1)∪L(e2),L(e1)L(e2)和(L(e1))∗。 仅由有限次使用上述三步骤而定义的表达式才是Σ 4、仅由有限次使用上述三步骤而定义的表达式才是Σ 上的正规式,仅由这些正规式所表示的集合才是Σ 上的正规式,仅由这些正规式所表示的集合才是Σ上的 正规集。 正规集。
状态转换图实现示例
'0'..'9':
BEGIN WHILE DIGIT DO BEGIN CONCAT;GETCHAR END; RETRACT; ($INT, RETURN ($INT,DBT) END;
'=': RETURN ($ASSIGN,-); '+': RETURN ($PLUS,-);
单词符号 种别编码 DIM 1 IF 2 DO 3 STOP 4 END 5 标识符 6 常数(数) 7 = 8 _ 9 * 10 ** 11 , 12 ( 13 ) 14 助忆符 内码值 $DIM $IF $DO $STOP $END 内部字符串 $ID $INT 标准二进制形式 $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR -
2 标识符识别:
字母开头的字母数字串, 字母开头的字母数字串,后跟界符或算符
3 常数识别:
识别出算术常数并将其转变为二进制内码表示。 识别出算术常数并将其转变为二进制内码表示。 有些也要超前搜索。 有些也要超前搜索。如:5.EQ.M 与 5.E08
4 算符和界符的识别
把多个字符符合而成的算符和界符拼合成一个 单一单词符号。: 。:= **, 单一单词符号。:=, **, .EQ.
词法分析是编译的基础 词法分析器(Lexical Analyzer) 又称扫描器 (Scanner):执行词法分析的程序
3.1.1 词法分析器的功能和输出形式
功能:输入源程序、输出单词符号
单词符号的种类: 单词符号的种类:
关键字:如 begin,if, while, … 标识符:表示各种名字。如变量名、数组名和过程 名 常数:各种类型的常数 运算符:+,-,*,/,… 界符:逗号、分号、括号和空白
3.1.2 词法分析器作为一个独立子程序
词法分析程序和语法分析程序的关系
作为子程序的词法分析器
3.2 词法分析器的设计
词法分析器的结构
预处理 子程序 扫描器
单词符号
输入 输入缓冲区
列表
扫描缓冲区
3.2.1 输入、预处理 输入、
输入串放在输入缓冲区中。 预处理子程序:剔除无用地空白、跳格、 回车和换行等编辑性字符;区分标号区、 连接续行和给出句末符等 扫描缓冲区
标识符单列一种;标识符自身的值表示成按机器字节划分 的内部码。 常数按类型分种;常数的值则表示成标准的二进制形式。
3.1.1 词法分析器的功能和输出形式
例 FORTRAN程序
IF (5.EQ.M) GOTO 100 输出单词符号: 输出单词符号: 逻辑IF (34,-) 逻辑IF (34, (2, 左括号 (2,-) (7, 的二进制) 整常数 (7, ‘5’的二进制) 的二进制 (6, 等号 (6,-) (26, 标识符 (26, ‘M’) ) 右括号 (16,-) (16, (30, GOTO (30,-) (19, 100’的二进制 的二进制) 标号 (19, ‘100 的二进制)
第三章 词法分析
内容
词法分析器的要求 词法分析的设计 正规表达式 有限自动机 词法分析器的自动产生
3.1 对于词法分析器的要求
任务:
从左至右逐个字符地对源程序进行扫描, 从左至右逐个字符地对源程序进行扫描,产生 一个个的单词符号, 一个个的单词符号,把作为字符串的源程序改 造成为单词符号串的中间程序
Σ = {ε , a, b, aa, ab, ba, bb, aaa,...}
*
♦∑*的子集U和V的连接(积)定义为
UV = {αβ | α ∈ U , β ∈ V }
V = VV …V
n
V自身的 n次积记为 自身的 次积记为 •
n
规定V0={ε},令 规定 ε,
V =V ∪ V ∪ V ∪ … 称V*是V的闭包; 的闭包;
↑ 起点 指示器 ↑ 搜索 指示器
3.2.2 单词符号的识别:超前搜索 单词符号的识别:
1 关键字识别:
例如: 例如:
1 DO99K=1,10 2 IF(5.EQ.M)GOTO 55 3 DO99K=1.10 4 IF(5)=55
需要超前搜索才能确定哪些是关键字
3.2.2 单词符号的识别:超前搜索 单词符号的识别:
3.1.2 词法分析器作为一个独立子程序
词法分析是作为一个独立的阶段,是否应 当将其处理为一遍呢?
作为独立阶段的优点:结构简洁、 作为独立阶段的优点:结构简洁、清晰和条理 有利于集中考虑词法分析一些枝节问题。 化,有利于集中考虑词法分析一些枝节问题。 不作为一遍:将其处理为一个子程序。 不作为一遍:将其处理为一个子程序。
相关文档
最新文档