从图31(a)字符串中识别出单词,并依次输出为 (begin, (标识符、 length在符号表的入口指针) (标识符, length在符号表的入口指针) (常数,1在常数表的入口指针) (if (标识符, length在符号表的入口指针) (常数,20在常数表的入口指针) (then (read, (标识符, nextel在符号表的入口指针) end
11 从图3.1(a)字符串中识别出单词,并依次输出为: (begin, ——) (标识符、length在符号表的入口指针) (:=, ——) (标识符,length在符号表的入口指针) (+, ——) (常数,1在常数表的入口指针) (;, ——) (if, ——) (标识符,length在符号表的入口指针) (<, ——) (常数,20在常数表的入口指针) (then, ——) (read, ——) ( ( , ——) (标识符,nextch在符号表的入口指针) ( ) , ——) (end, ——) (;, ——)
3.输入预处理 从输入串识别单词并给出单词的中间码,是词法 分析器的主要工作,它可以从输入缓冲区中读字符 并识别。但在多数情况下,先对输入串作预处理: 剔除注释和多余的空白符和制表换行符等编辑性字 符,记录新读入字符行的行号,以便在发现错误时, 报告错误所在程序行,这些处理由预处理程序来完 成,这样词法分析就会既简单又清晰。因此我们另 设一个扫描缓冲区,当词法分析需要时,预处理程 序就从输入缓冲区中读字符并作预处理,将经处理 的字符装满扫描缓冲区,而词法分析器就从扫描缓 冲区中读字符并识别。因此输入预处理通常称为扫 描器。 12
12 3. 输入预处理 从输入串识别单词并给出单词的中间码,是词法 分析器的主要工作,它可以从输入缓冲区中读字符 并识别。但在多数情况下,先对输入串作预处理: 剔除注释和多余的空白符和制表换行符等编辑性字 符,记录新读入字符行的行号,以便在发现错误时, 报告错误所在程序行,这些处理由预处理程序来完 成,这样词法分析就会既简单又清晰。因此我们另 设一个扫描缓冲区,当词法分析需要时,预处理程 序就从输入缓冲区中读字符并作预处理,将经处理 的字符装满扫描缓冲区,而词法分析器就从扫描缓 冲区中读字符并识别。因此输入预处理通常称为扫 描器
4、词法错误 非法字符(字母表以外的)和非法常数可在词法 分析时被发现,除此之外没有什么词法错误是 在词法分析时发现的,往往要推迟到语法分析 时才发现,例如,把i写成f,则词法分析作 为标识符处理。 le ngth,中间多了空白,词法分析将le和ngth 作两个标识符处理,由此而造成的后果,将在 其他分析过程中才反映出来。 13
13 4. 词法错误 非法字符(字母表以外的) 和非法常数可在词法 分析时被发现,除此之外没有什么词法错误是 在词法分析时发现的,往往要推迟到语法分析 时才发现,例如,把if写成fi,则词法分析作 为标识符处理。 le ngth,中间多了空白,词法分析将le和ngth 作两个标识符处理,由此而造成的后果,将在 其他分析过程中才反映出来
5.词法分析器的建立方法 传统上使用汇编语言写词法分析器,但这 并不容易,通常用系统程序设计语言来写一个 词法分析器,但它不如用生成工具Lex产生词 法分析器方便,虽然如此,用汇编语言写词法 分析器仍有它可取之处,因为它的分析速度最 快。 在规模上,词法分析器相对于编译程序来说可 以说是不值一提的,但是编译有相当一部分时 间是花在词法分析上的,因此提高词法分析的 分析速度是值得重视的,为此将讨论一些有用 的技术。 14
14 5. 词法分析器的建立方法 传统上使用汇编语言写词法分析器,但这 并不容易,通常用系统程序设计语言来写一个 词法分析器,但它不如用生成工具Lex产生词 法分析器方便,虽然如此,用汇编语言写词法 分析器仍有它可取之处,因为它的分析速度最 快。 在规模上,词法分析器相对于编译程序来说可 以说是不值一提的,但是编译有相当一部分时 间是花在词法分析上的,因此提高词法分析的 分析速度是值得重视的,为此将讨论一些有用 的技术
扫描缓冲区 个长度为2N的扫描缓冲区,分为长度为N的左右两 个半区,缓冲区设置两个指针,开始指针和向前指 针 forward。开始时两个指针均指向下一个待分析单 词符号的第一个字符,然后向前指针向前扫描,直 到该单词符号恰被识别时止,这时向前指针恰在被 识别单词符号的下一个字符,因此两指针间的字符 串便为已识别的单词符号。识别完后,开始指针移 至向前指针位置,准备下个单词符号的识别,如图 33所栏工一 开始指针向前指针 图33由左右两半区组成的扫描缓冲区 15
15 二、扫描缓冲区 一个长度为2N的扫描缓冲区,分为长度为N的左右两 个半区,缓冲区设置两个指针,开始指针和向前指 针forward。开始时两个指针均指向下一个待分析单 词符号的第一个字符,然后向前指针向前扫描,直 到该单词符号恰被识别时止,这时向前指针恰在被 识别单词符号的下一个字符,因此两指针间的字符 串便为已识别的单词符号。识别完后,开始指针移 至向前指针位置,准备下个单词符号的识别,如图 3.3所示…。t h e n r e a d ( n e x t c h ) … 开始指针 向前指针 图3.3 由左右两半区组成的扫描缓冲区