• 词法分词器-标识符转移图


    标识符转移图(变量)

    标识符的转移图

     

    记号流:编译器内部定义的数据结构,编码所识别出的词法单元

    Token 记号 

    nextToken() 读取标识符或者关键字 

    getChar()读取一个字符

    输入原代码到词法分析器返回记号流:

    步骤从0开始对应表中操作,假设记号表中已经记录了id这个标识符

    一: 假设读取第一个 字符为i

    0.第一步 I/O 读取一个字符例如 此字符必须要符合 标识符的定义 例如:(a-zA-Z 0-9 _)等标识符定义 符合后开始第二步操作 

     

    二: 假设读取第二个 字符为 d

    1. 第二部读取第二个字符 是否符合标识符(a-zA-Z 0-9 _)定义 符合和第一个字符拼接,对比符号表判断是否有此标识符定义(变量定义),如果有则第二步,如果没有则继续调用(图中1步)读取字符 重复1步操作

     

    2.返回记号

     

    从记号流中读取标识符流程并识别关键字:

    与此同时我们还需要识别关键字 以if为例

     

    上面还是我们之前识别标识符的转移图

     

    下面是能识别标识符和if关键字的转移图

     

    读取字符为 "i" 但是不符合1的条件[a-h j-z A-Z_],则直接到3的流程 存储好此字符,并读取下一个字符如果符合4的条件[f] 那么还需要读取一个字符判断是否为分隔符(例如 ifconfig 这种) 分隔符不一定只有一种有的是 ‘(’ 有的是 ’ ’ 空格符合后则是关键字还需要对比关键字表 ,否则还是跳转到1流程,判断是否为记号流

     

    其他关键字也如此

     

    关键字表算法:

    哈希表和完美哈希介绍: 

    LINK: http://www.cnblogs.com/gaochundong/p/hashtable_and_perfect_hashing.html 

  • 相关阅读:
    关于flume配置加载
    ListMultimap 容器
    HotSpotOverview.pdf
    芝麻西瓜
    念念不忘必有回响
    phpstrom代码格式化
    小总结
    Redis支持的数据类型
    如何通过phpstorm查看某一行代码的变更记录
    mysql自动添加时间
  • 原文地址:https://www.cnblogs.com/sybk/p/10004702.html
Copyright © 2020-2023  润新知