词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作
词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
词法分析器一般以函数的形式存在,供
语法分析器调用。 完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。
简介
词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作
词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
词法分析器一般以函数的形式存在,供
语法分析器调用。
词法分析阶段是
编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入
源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用
Lex等工具自动生成。
词法分析是
编译程序的第一个阶段且是必要阶段;词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程序的常用途径:自动生成,手工生成.
编译
编译(compilation , compile) 1、利用
编译程序从源语言编写的
源程序产生
目标程序的过程。 2、用
编译程序产生
目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,
编译程序把人们熟悉的语言换成2进制的。
编译程序把一个
源程序翻译成
目标程序的工作过程分为五个阶段:
词法分析;
语法分析;语义检查和
中间代码生成;
代码优化;
目标代码生成。主要是进行
词法分析和
语法分析,又称为
源程序分析,分析过程中发现有语法错误,给出提示信息。
词法分析程序
组织输入、扫描、分析、输出;
接收字符串形式的源程序,按照源程序输入的次序依次扫描源程序,在扫描的同时根据语言的词法规则识别出具有独立意义的单词,并产生与源程序等价的属性字(Token)流 .
(1) 只要不修改接口,则词法分析器所作的修改不会影响整个编译器,且词法分析器易于维护;
(3) 可以采用有效的方法和工具进行处理。
词法分析程序的功能
完成词法分析任务的程序称为词法分析程序或词法
分析器或扫描器。
从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字。
单词
这里的单词是一个字符串,是构成
源代码的最小单位。从输入字符流中生成单词的过程叫作单词化(Tokenization),在这个过程中,
词法分析器还会对单词进行分类。
词法分析器通常不会关心单词之间的关系(属于
语法分析的范畴),举例来说:词法分析器能够将括号识别为单词,但并不保证括号是否匹配。
sum=3+2;将其单词化后可以得到下表内容:
单词经常
使用正则表达式进行定义,像lex一类的
词法分析器生成器就支持使用正则表达式。
语法分析器读取输入字符流、从中识别出语素、最后生成不同类型的单词。其间一旦发现无效单词,便会报错。
扫描器
词法分析的第一阶段即扫描器,通常基于
有限状态自动机。扫描器能够识别其所能处理的单词中可能包含的所有字符序列(单个这样的字符序列即前面所说的“语素”)。例如“整数”单词可以包含所有数字字符序列。很多情况下,根据第一个非空白
字符便可以推导出该单词的类型,于是便可逐个处理之后的字符,直到出现不属于该类型单词字符集中的字符(即最长一致原则)。
词法分析器的设计与实现
源词法分析器的设计与实现程序的输入与预处理:
输入缓冲区
成对且对半互补的输入缓冲区模式。
n: 取2的整次幂;每个半区的末尾设置标志“ eof ” 表示读入该半区的源程序的结束;
B:单词w开始指针; F:扫描w的指针;
两个缓冲区的输入模式
预处理程序: (作用)
1) 减少内存空间占用;
2) 减轻扫描器实质性处理的负担;
预处理程序主要任务: 1) 滤掉源程序中的非单词成分(如无用空格;换行符等);2) 其他的预处理工作:滤掉注释;宏替换;文件包含的嵌入;条件编译的嵌入.
单词生成器
单词生成器
单词化(Tokenization)即将输入字符串分割为单词、进而将单词进行分类的过程。生成的单词随后便被用来进行
语法分析。
例如对于如下字符串: The quick brown fox jumps over the lazy dog
计算机并不知道这是以空格分隔的九个英语单词,只知道这是普通的43个字符构成的字符串。可以通过一定的方法(这里即使用空格作为
分隔符)将语素(这里即英语单词)从输入字符串中分割出来。分割后的结果用XML可以表示如下:
The
quick
brown
fox
jumps
over
the
lazy
dog
然而,语素只是一类字符构成的字符串(字符序列),要构建单词,
语法分析器需要第二阶段的评估器(Evaluator)。评估器根据语素中的字符序列生成一个“值”,这个“值”和语素的类型便构成了可以送入
语法分析器的单词。一些诸如括号的语素并没有“值”,评估器函数便可以什么都不返回。整数、
标识符、字符串的评估器则要复杂的多。评估器有时会抑制语素,被抑制的语素(例如空白语素和注释语素)随后不会被送入
语法分析器。
net_worth_future = (assets - liabilities);
在进行
语法分析后可能生成以下单词流(空格被抑制):
OPEN_PARENTHESIS
MINUS
CLOSE_PARENTHESIS
SEMICOLON
尽管在某些情况下需要手工编写
词法分析器,一般情况下词法分析器都用自动化工具生成。