• 词法分析(一):状态转换图


    词法分析概述


    状态转换图

    状态转换图是一张有限有向图

    • 结点表示状态,结点用圆圈表示
    • 状态之间存在有向弧,弧上标记有字符字符集
      表示某一状态接受箭弧上的字符/字符集输入后到达另一状态
    • 一张状态转换图中的状态个数是有限的,其中有一个初态,至少有一个终态
      在这里插入图片描述
      如上图表示状态1为初态,状态3为终态,状态1接受字符a到达状态2,接受数字到达状态3
      终态用双圈表示

    状态转换图可用于识别 / 接受一定的字符串

    若存在一条从初态到某一终态的道路,记这条路上所有弧上的标记符连接成的字(即字符串 )为α,则称α被该状态转换图识别 / 接受

    在这里插入图片描述
    比如上面的状态转换图,可以用来识别以字母开头,可以存在数字的标识符(状态3的*号表示,不包含到状态3的弧上的字符)

    在这里插入图片描述
    可以识别整常数的状态图


    状态转换图在词法分析中的应用

    有某种简单的程序设计语言,单词表如下
    该语言所有合法的字都在该单词表内描述

    单词符号 种别编码 助记符 内码值
    DIM 1 $DIM
    IF 2 $IF
    DO 3 $DO
    STOP 4 $STOP
    END 5 $END
    标识符 6 $ID 内部字符串
    常数 7 $INT 标准二进制形式
    = 8 $ASSIGN
    + 9 $PLUS
    * 10 $STAR
    ** 11 $POWER
    , 12 $COMMA
    ( 13 $LPAR
    ) 14 $RPAR

    可为单词表设计如下状态转移图
    在这里插入图片描述
    状态2识别关键字和标识符
    状态4识别常数
    状态5~12识别操作符和括号
    状态13为出错状态
    那么,可以由此图对该语言的所有代码进行词法分析


    词法分析器的实现:状态转换图→程序

    使用循环和swith或if,我们很容易把上面的状态转移图实现为词法分析程序
    或者使用更巧妙的表驱动方式

    当前状态 字符 space letter digit = + * , ( ) 其他
    0 0 1 3 5 6 7 10 11 12 13
    1 0 1 3 5 6 7 10 11 12 13
    3 4 4 4 4 4 4 4 4 4 4
    7 8 8 8 8 8 9 8 8 8 8

    设该数组为state
    由当前状态cur_state和读取的字符ch
    我们可以查表得到下一个状态state[cur_state][ch]


    状态转换图与有限自动机

    有限自动机

    可以用状态转换图等价表示确定有限自动机(DFA) 或者 非确定有限自动机(NFA)


    2019/7/20

  • 相关阅读:
    nginx rewrite 伪静态重写学习笔记
    正则表达式相关知识
    rpm的含义
    find命令的使用
    chmod的运用方式
    [GO]数组的比较和赋值
    [GO]二维数组的介绍
    [GO]变量内存和变量地址
    [GO]给导入包起别名
    阿里云负载均衡SLB 七层https协议 nginx 获取真实IP
  • 原文地址:https://www.cnblogs.com/kafm/p/12721806.html
Copyright © 2020-2023  润新知