zoukankan      html  css  js  c++  java
  • 编译原理之词法分析(大三生活第21天,度过了一段萎靡的时光)

      终于挣扎回到了博客。因为一些烦心事而影响到了自己,深感不安与羞愧。明天在此博开更。

    -------------------编译原理之词法分析-------------------------

      在之前的一篇博文上有说过,编译器接受一串字符流(即源程序代码),然后进行词法分析,雨大分析,语义分析,然后生成中间代码,最后生成目标代码。

      今天就要说编译器的第一个步骤,词法分析。词法分析(lexical analysis)也可称为扫描(scaning)。词法分析器(lexical anylizer)读入源程序代码,并且将他们组成有意义的词素(lexeme)序列,对于每个词素,词法分析器产生一个词法单元(token),即最后会输出一个词法单元序列。token如下形式:<token-name,attribute-value>。第一个分量token-name是一个由词法分析步骤使用的抽象符号,第二个分量attribute-value指向符号表中关于这个词法单元的条目。

      先了解一下编译器符号表:

        1、编译过程中编译程序不断汇集和反复查证出现在源程序中各种名字的属性和特征信息等有关信息。

          这些信息通常记录在一张或几张符号表中。

        2、符号表的每一项有两部分:

          一部分是名字(标识符);一部分是名字属性(标识符的有关信息)。

        3、编译过程中,每当扫描器(词法分析器)识别出一个名字后,编译程序就查阅符号表,看其是否在符号表中。

          如果它是一个新名字就将它填进表里。

          它的有关信息将在词法分析和语法-语义分析过程中陆续填入表中。

       4、符号表是边填边用。

     在整个编译期间,对于符号表的操作大致可归纳为五类:

       1、对给定名字,查询此名是否已在表中;

       2、往表中填入一个新名字;

       3、对给定名字,访问它的某些信息;

       4、对给定名字,往表中填写或更新它的某些信息;

       5、删除一个或一组无用的项。

       (参考 http://blog.chinaunix.net/uid-27004869-id-3330093.html ,如果想了解详细,可参考 http://metc.gdut.edu.cn/compile/nandian/n-9.htm)

      再来看一下这一段代码:

    int a, b, c;
    a = b + c * 60;

      在这段代码下,词法分析器首先会自动忽略空白字符,如space,tab,换行符,然后将a看做一个词素,=符号看做一个词素,b看做一个词素,以此类推,组成一个词素序列。

      然后,对应的,每个词素生成一个词法单元,如词素a生成词法单元<id,1>,1表示a在符号表中条目的位置。id是表示标识符,因为a是变量名,id就是它的标识符,b和c的标识符也是id。所以b,c的词法单元分别为<id,2>,<id,3>。但数字60的标识符是number,所以词法单元为<number,60>,但一般来说可以简写为<60>。而符号+,=,* 因为没有属性,只需保留名字(一般用词素本身作为名字),所以可以简单表示为<+><=><*>。所以,标识符id对应的符号表大概结构如下:

      (名字右边记录的是类型,值,地址等属性)

      所以最后词法分析器输出的词法单元序列为:<id,1><+><id,2><+><id,3><*><60>

      到这里,词法分析简单的了解就结束了。下面我们具体了解它的实现方法。

    --------------词法分析之正则表达式--------------

     如果要正确得识别一个词素,比如if代表的是变量i和变量f,还是if?判断词素有很多种方式。利用正则表达式就是一个。如果对正则表达式不了解的同学可以看一下这个这个网页,http://deerchao.net/tutorials/regex/regex.htm , 十分详细。

  • 相关阅读:
    应用js改变问章字体大小
    在北京实习的日子
    php算法
    SQL Server 查询处理中的各个阶段(SQL执行顺序)
    130 个你需要了解的 vim 命令
    分享一个检测用户是否用手机(Mobile)访问网站的 PHP 类
    使用apache自带日志分割模块rotatelogs,分割日志
    centos下lvs配置
    分享codeigniter框架,在zend studio 环境下的代码提示
    vi 常用命令
  • 原文地址:https://www.cnblogs.com/yuanxiaohui-blog/p/4870533.html
Copyright © 2011-2022 走看看