学习编译原理Time01 ~ 词法分析

共 2197字,需浏览 5分钟

 ·

2021-04-12 22:16

    为了将一个程序从一种语言翻译成另一种语言,编译器必须首先把程序的各种成分拆开,并搞清其结构和含义,然后再用另一种方式把这些成分组合起来。编译器的前端执行分析,后端进行合成

    分析一般分为以下3种:

  1. 词法分析:将输入分解成一个个独立的词法符号,即“单词符号” ( token),简称单词。

  2. 语法分析:分析程序的短语结构。

  3. 语义分析:推算程序的含义。

    

    词法分析器以字符流作为输入,生成一系列的名字、关键字和标点符号,同时抛弃单词之间的空白符和注释。程序中每一点都有可能出现空白符和注释;如果让语法分析器来处理它们就会使得语法分析过于复杂,这便是将词法分析从语法分析中分离出去的主要原因。

      词法分析并不很复杂,但是我们却使用能力强大的形式化方法和工具来实现它,因为类似的形式化方法对语法分析研究很有帮助,并且类似的工具还可以应用于编译器以外的其他领域。



词法分析器是编译器中与源程序直接接触的部分,因此词法分析器可以做诸如
1). 去掉注释,自动生成文档(c语音中的//注释)
2). 提供错误位置(可以通过记录行号来提供),当字符流变成词法记号流以后,就没有了行的概念
3). 完成预处理,比如宏定义



词法分析的主要任务

    从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示——单词符号(token)形式:

    token:<种别码,属性值>


单词类型
种别种别码
1
关键词
if、else、while、...
一词一码
2
标识符
变量名、数组名、函数名、...
多次一码
3常量
整型、浮点型、字符型、....
一型一码


4


运算符

算术(+ - / * ++ --)

关系(> < == != >= <=)

逻辑(& | ~)

一词一码

       或

一型一码

5
界限符
; ( ) = { } ...一词一码


示例:词法分析后得到的token序列

输入:

    while(value != 100){num++;}


输出(蓝字部分):

  1. while  <WHILE,    -     >

  2.         <SLP ,    -        > 

  3. value  < IDN ,  value  > 

  4.     !=   < NE ,     -        >

  5.   100   < CONST ,  100>

  6.      )     < SRP ,      -    >

  7.     {      < LP ,        -    >

  8.  num   < IDN,   num  >

  9.    ++    < INC ,     -    >

  10.     ;       < SEMI ,   -    > 

  11.     }       < RP ,       -    >    






记录
点点滴滴的笔记
欢迎关注,共同学习


小浩笔记

浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报