• 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析


     词法分析:

    • 主要功能:词法分析器从输入中读入字符,并将它们组成词法单元对象
    • 主要步骤:
      • 预读:使用一个变量peek来保存当前已读入的数字或字符的下一个输入字符,来对已读入的字符进行预判,如果当前已读入字符能够识别,则peek设置为空白符。当词法分析器返回一个词法单元时,变量peek要么保存了当前词法单元的词素后的那个字符,要么保存空白符。
      • 剔除空白和注释:
        •  图2-29中的伪代码在遇到空格、制表符或换行符时不断读取输入字符,从而跳过了空白部分。变量peek存放了下一个输入字符。在错误消息中加入行号和上下文有助于定位错误。这个代码使用变量line统计输入中的换行符个数。

      • 识别和计算常量:
        •  图2-30中的伪代码读取一个整数中的数位,并用变量v累计得到这个整数的值。

      • 识别关键字和标识符:
        •  图2-31中的伪代码使用get操作来查找保留字。这个伪代码从输入中读取一个以字母开头、由字母和数位组成的字符串s。我们假定读取的s尽可能地长,即只要词法分析器遇到字母或数位,它就不断从输入中读取字符。当它遇到的不是字母或数位,比如它遇到了空白符,已读取的词素就被复制到缓冲区b中。如果字符串表中已经有一个s的条目,它就返回由words.get得到的词法单元。这里s可能是一个关键字,在表words初始化的时候这个s就已经在表中了;它也可能是一个之前被加入到表中的标识符。如果不存在s对应的条目,那么由id和属性值s组成的词法单元被加入到字符串表中,并被返回。

    • 词法分析器:
      • 主流程:
        • 返回词法单元对象的函数scan
      • 各个对象:
        • 类Token:
          •  类Token有一个tag字段,用于做出语法分析决定
        • 子类Num和子类Word:
          • 子类Num增加了一个字段value,用于存放整数值

          •  子类Word增加了一个字段lexem,用于保存关键字和标识符的词素

      • Lexer:

    参考-《编译原理(第二版)》

  • 相关阅读:
    Junit单元测试
    点餐系统
    文件的横纵转换
    零碎知识--日积月累
    json校验
    程序员必须收藏的14个顶级开发社区!
    管理员权限
    Thinking In Java 读书笔记
    学生考试系统
    JeeSite开发笔记
  • 原文地址:https://www.cnblogs.com/fangzhiyou/p/12416860.html
Copyright © 2020-2023  润新知