第四章词法分析 词法分析的任务: 从左至右逐个字符地扫描源程序,产生 一个个的单词符号,把作为字符串的源程序 改造成为单词符号串的中间程序。 词法分析器/扫描器:执行词法分析的程序
词法分析的任务: 从左至右逐个字符地扫描源程序,产生 一个个的单词符号,把作为字符串的源程序 改造成为单词符号串的中间程序。 词法分析器/扫描器:执行词法分析的程序
词法分析器的功能如下图所示: 由程序语言定义的具有固定意 义的标识符。也可称为保留字 1、关键字 用来表示各种名字,如变量名、 2、 标识符一· 数组名、过程名等。它是不限 源程序 扫描器 的。 3、常数一·→ 布尔型、文字型等。 它是不限 scanner 的。 4、运算符一 ④异刊:知川、 不、T于 它是确定的。 界符:如逗号、分号、拈号、 5、界符 *,*/等。它是确定的
源 程 序 扫描器 scanner 1、关键字 词法分析器的功能如下图所示: 2、标识符 5、界符 4、运算符 3、常数 由程序语言定义的具有固定意 义的标识符。也可称为保留字 或基本字。例如:Pascal中的 begin,end,if等。 界符:如逗号、分号、括号、 /*,*/ 等。它是确定的。 运算符:如+、-、*、/ 等。 它是确定的。 常数的类型一般有整型、实型、 布尔型、文字型等。它是不限 的。 用来表示各种名字,如变量名、 数组名、过程名等。它是不限 的
4.1对词法分析器的要求 4.1.1词法分析器的功能和输出形式 词法分析器的功能:输入源程序,输出单词符号。 单词符号:一个程序语言的基本语法符号。分为以下5种。 1、关键字:由程序语言定义的具有固定意义的标识符。也 确定 可称为保留字或基本字。例如:Pascal中的pegin, end,if等。它是确定的。 2、 标识符:用来表示各种名字,如变量名、数组名、过程 不限 名等。它是不限的。 3、常数:常数的类型一般有整型、实型、布尔型、文字型 等。它是不限的。 4、 运算符:如+、一、*、/等。它是确定的。 5、界符:如逗号、分号、括号、/$,*/等。它是确定的
词法分析器的功能:输入源程序,输出单词符号。 单词符号:一个程序语言的基本语法符号。分为以下5种。 1、关键字:由程序语言定义的具有固定意义的标识符。也 可称为保留字或基本字。例如:Pascal中的begin, end,if等。它是确定的。 2、标识符:用来表示各种名字,如变量名、数组名、过程 名等。它是不限的。 3、常数:常数的类型一般有整型、实型、布尔型、文字型 等。它是不限的。 4、运算符:如+、-、*、/ 等。它是确定的。 5、界符:如逗号、分号、括号、/*,*/ 等。它是确定的。 确定 不限
单词符号的表示形式: 词法分析器所输出的单词符号常常表示成 三元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。 2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。 单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表 种的地址码,等等。 注意:一个语言的单词符号如何分种,分几种,怎样编码,是一个技术 问题。标识符一般同归为一种。常数则宜按类型(整、实、布尔)分。 关键字可以将其全体视为一种,也可一字一种。运算符可采用一符一种, 但也可把具有一定共性的视为一种。界符则一般采用一符一种。如何进 行分种主要取决于处理上的方便。 若是一符一种分种,单词自身值就不需要了。否则,要查符号表
单词符号的表示形式:词法分析器所输出的单词符号常常表示成 二元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。 2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。 单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表 种的地址码,等等。 注意:一个语言的单词符号如何分种,分几种,怎样编码,是一个技术 问题。标识符一般同归为一种。常数则宜按类型(整、实、布尔)分。 关键字可以将其全体视为一种,也可一字一种。运算符可采用一符一种, 但也可把具有一定共性的视为一种。界符则一般采用一符一种。如何进 行分种主要取决于处理上的方便。 若是一符一种分种,单词自身值就不需要了。否则,要查符号表
例4-1:151一F0 RTRAN编译程序的词法分析器在扫描输入串 IF(5·EQ·M0G0T0100后,它输出的单词符号串是: IP为关键字,种别编码34, 逻辑IF (34,_) ‘(’为界符,种别编码2,采 左括号 (2, 用一符一种的编码方式。 整常数 (20, ‘5’的二进制表示) 常数类型,种别编码20,单词自 等号为运算符,种别编码6, 等号 (6, M为标识符,种别编码26,单 标识符 (26, M') 司白自值为‘) 右括号 )’为界符,种别编码16, (16,_) G0T0为关键字,种别编码30, GOTO (30,_) 卫田耸鼬的信回古式 标号 (19, ‘100’的二进制表示 100为标号,种别编码19,单词 内部的值用100的二进制表示
例4-1:151-FORTRAN编译程序的词法分析器在扫描输入串 IF (5·EQ·M) GOTO 100 后,它输出的单词符号串是: 逻辑IF (34,_) 左括号 (2,_) 整常数 (20,‘5’的二进制表示) 等号 (6,_) 标识符 (26,‘M’) 右括号 (16,_) GOTO (30,_) 标号 (19,‘100’的二进制表示) IF为关键字,种别编码34, 采用一符一种的编码方式。 常数类型,种别编码20,单词自 身的值为‘5’的二进制表示。 ‘(’为界符,种别编码2,采 用一符一种的编码方式。 等号为运算符,种别编码6, M采用一符一种的编码方式。 为标识符,种别编码26,单 词自身值为‘M’。 ‘)’为界符,种别编码16, 采用一符一种的编码方式。 GOTO为关键字,种别编码30, 采用一符一种的编码方式。 100为标号,种别编码19,单词 内部的值用100的二进制表示
例4-2:下述C+代码段:whi1e(i>=j)i 一一; 经词法分析器处理以后,它将被转换为如下的单词符号串 while,) ((,) (id,指向i的符号表指针) (>=,-) (id,指向j的符号表指针) (),-) (id,指向i的符号表指针) (--, (;
例4-2 :下述C++代码段:while ( i >= j ) i - -; 经词法分析器处理以后,它将被转换为如下的单词符号串 ( while ,_ ) ( ( ,_ ) ( id ,指向i的符号表指针 ) ( >= ,_ ) ( id ,指向j的符号表指针 ) ( ) ,_ ) ( id ,指向i的符号表指针 ) ( - - ,_ ) ( ; ,_ )
4.1.2词法分析与语法分析的关系 1、把词法分析 析中脱离出来的优点: •使编译程序的结 外存 清晰和条理化。 ·词法分析和语法 同,词法分析可以使用正则文法自动构造 scanner简单, 源 单 •有利于提清 语法 程 符号 scanner 源程序 ·可以改善分析的细节 迟王丁 T后法分析配儿个scanner, 把不同 的输入变成一种内部表示。 2、把词法分析佐斗油立 的一遍 scanner当作一 sC2ner作为谭灌析 把scanner当作子程序。 scanner作为一遍
1、把词法分析从语法分析中脱离出来的优点: •使编译程序的结构更加简洁、清晰和条理化。 •词法分析和语法分析方法不同,词法分析可以使用正则文法自动构造 scanner简单。 •有利于提高语法分析的效率。 •可以改善词法分析的细节,甚至于一个语法分析配几个scanner,把不同 的输入变成一种内部表示。 2、把词法分析作为独立的一遍 •scanner当作一遍。 •把scanner当作子程序。 外存 scanner 语法分析 源 程 序 单 词 符 号 scanner作为一遍 语法 分析 scanner 源程序 scanner作为子程序
4.1.3词法 器的设计 设计前提: 输入 ● 把scanne 预处理 输入缓冲区 立的季程! 词法分析器的任务为输出单词符。 子程序 预处理部 扫描缓冲区 ·必要性,编辑性字符如空白符、回车符等,除了出现在文字和 扫描器 数中以外,在别处出现都没有意义。 件 扫 险无用字符。 语法分析器 器 ·实现西 预处埋子程序。 图4.1词法分析器
设计前提: • 把scanner作为一个独立的子程序; • 词法分析器的任务为输出单词符号。 •必要性:编辑性字符如空白符、回车符等,除了出现在文字和 常数中以外,在别处出现都没有意义。 •功 能: 剔除无用字符。 •实 现: 预处理子程序。 输入 列表 预处理 子程序 扫描器 扫描缓冲区 输入缓冲区 单词符号 图4.1 词法分析器 语法分析器 预 处 理 部 分 扫 描 器
若 扫描缓冲区的结构: 缓冲区大小:120个字符。 采用两个指示器:起点指示器、搜索指示器。 两个互补区。 T0100 IF (5.EQ.M)GO T0100 IF (5.EQ.M)GO 起点指示器搜索指读指示器搜索指示器 搜索指示器 输入缓神屡 起点指示器 120个字符 两个互补输入缓冲区
若识别输入语句 IF (5.EQ.M) GOTO 100,若缓冲区情况如下所示: IF (5.EQ.M) GO 起点指示器 搜索指示器 输入缓冲区 TO 100 IF (5.EQ.M) GO 起点指示器 搜索指示器 输入缓冲区 TO 100 IF (5.EQ.M) GO 搜索指示器 起点指示器 两 个 互 补 输 入 缓 冲 区 120个字符 扫描缓冲区的结构: • 缓冲区大小:120个字符。 • 采用两个指示器:起点指示器、搜索指示器。 • 两个互补区
2。单词符号的识别 超前搜索 单词符号识别的简单方法:超前搜索。 关键字识别: 例如:在标准FORTRAN中 1、D099K=1,10 其中的D0、 2、IF(5.EQ.MW)I=10 IF为关键字 3、D099K=1.10 其中的D0、 IF为标识符 4、IF(5)=55 的一部分
单词符号识别的简单方法:超前搜索。 关键字识别: 例如:在标准FORTRAN中 1、DO99K = 1,10 2、IF(5.EQ.M)I = 10 3、DO99K = 1.10 4、IF(5) = 55 其中的DO、 IF为关键字 其中的DO、 IF为标识符 的一部分