编译原理——词法分析器的任务

词法分析器的任务

编译原理——词法分析器的任务
任务主要是负责字符流到记号流的转换
字符流: 其实就是我们要编译的语言,比如我们要编译C语言,它的代码比如:for(int i=0;i<5;i++) 这段代码对于编译器来说就是一串串的字符。所以字符流也根据不同的高级语言(c,c++)而变化
记号流: 经过词法分析器分析后生成的一串记号(也可以称为单词)的集合,这个记号是在编译器内事先定义好的数据结构,负责编码字符流。
举例: 编译原理——词法分析器的任务
这是一串c语言代码,我们现在要编译它,它对于我们编译器来说就是一串字符,比如i f 空格 括号 x > 5 括号 空格(这里隐藏了)…最后还有一个结束标识符EOF,这是c语言源文件用来标识文件结束的标志。
然后我们要在编译器中定义一个数据结构,也就是记号,用来编码接收到的符号流。
编译原理——词法分析器的任务
如图这是我们定义的记号的数据结构,一个枚举类型+一个结构体;结构体包含两个域,第一个是枚举型,记录我们将字符转换成记号后的单词(说白了就是把符号转化为单词,这单词存储在这个域中);第二个域是记录这个单词的值,例如我第一个域k单词是IF,那lexeme域值为0,如果是k是LPAREN(左阔话),那lexeme=1;
现在我们展示一下词法分析的具体过程,以if (x > 5)为例:扫描到字符i f后,这是我们定义过的一个单词,所以为他创立一个token结构体,既{k=IF,lexeme=0},扫到空格不处理,然后扫描到"(",我们会为他创立一个结构体{k=LPAREN,lexeme=1}。然后扫描到x,返回{k=ID,lexeme=2},之后依次下去,这个ID是指一切除if这类我们编译器定义过的非符号字符外的其他非符号字符。说白了就是你看if这个字符我们编译器定义过,认识,但是如果我们在C代码中扫到了if1,抱歉,我不认识,统统按ID处理。
下面我们展示一下词法分析后的结果,也就是记号流,注意我们这里展示的记号流所用到的结构体要比我们上面举例用的那个结构体要复杂
编译原理——词法分析器的任务
如图,if我们返回的就是IF;( 我们返回的就是LPAREN;x我们返回的是IDENT(x),上面说了,x编译器不认识,按ID处理,只不过这里改成了IDENT,一样的,我们把它按IDENT处理,不过要携带参数,这是我们上面示例的结构体中没写的,不过懂就行,他这里是扫到x,返回IDENT(x),那扫到if1,返回的也是IDENT(if1);后面的INT(5)也是扫面到整数时我们返回的一种方式。具体的细节可以暂时不用那么清楚,现在了解原理,后面设计时再细究。