学习编译原理Time01 ~ 词法分析
为了将一个程序从一种语言翻译成另一种语言,编译器必须首先把程序的各种成分拆开,并搞清其结构和含义,然后再用另一种方式把这些成分组合起来。编译器的前端执行分析,后端进行合成。
分析一般分为以下3种:
词法分析:将输入分解成一个个独立的词法符号,即“单词符号” ( token),简称单词。
语法分析:分析程序的短语结构。
语义分析:推算程序的含义。
词法分析器以字符流作为输入,生成一系列的名字、关键字和标点符号,同时抛弃单词之间的空白符和注释。程序中每一点都有可能出现空白符和注释;如果让语法分析器来处理它们就会使得语法分析过于复杂,这便是将词法分析从语法分析中分离出去的主要原因。
词法分析并不很复杂,但是我们却使用能力强大的形式化方法和工具来实现它,因为类似的形式化方法对语法分析研究很有帮助,并且类似的工具还可以应用于编译器以外的其他领域。
词法分析器是编译器中与源程序直接接触的部分,因此词法分析器可以做诸如
1). 去掉注释,自动生成文档(c语音中的//注释)
2). 提供错误位置(可以通过记录行号来提供),当字符流变成词法记号流以后,就没有了行的概念
3). 完成预处理,比如宏定义
词法分析的主要任务
从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示——单词符号(token)形式:
token:<种别码,属性值>
单词类型 | 种别 | 种别码 | |
1 | 关键词 | if、else、while、... | 一词一码 |
2 | 标识符 | 变量名、数组名、函数名、... | 多次一码 |
3 | 常量 | 整型、浮点型、字符型、.... | 一型一码 |
4 | 运算符 | 算术(+ - / * ++ --) 关系(> < == != >= <=) 逻辑(& | ~) | 一词一码 或 一型一码 |
5 | 界限符 | ; ( ) = { } ... | 一词一码 |
示例:词法分析后得到的token序列
输入:
while(value != 100){num++;}
输出(蓝字部分):
while <WHILE, - >
( <SLP , - >
value < IDN , value >
!= < NE , - >
100 < CONST , 100>
) < SRP , - >
{ < LP , - >
num < IDN, num >
++ < INC , - >
; < SEMI , - >
} < RP , - >
小浩笔记