解读FLEX代码之生成NFA

本文详细介绍了Flex如何生成NFA,包括基本数据结构、最终状态机的构造、临时状态机的操作以及处理向前看问题的方法。每个状态机由状态组成,每个状态有特定属性,如firstst、finalst等。在生成NFA过程中,Flex会为每个规则创建一个NFA,最终组合成完整状态机。同时,文章讨论了如何处理空规则、顶行规则以及如何处理不确定长度的字符串匹配问题。
摘要由CSDN通过智能技术生成

1.   生成NFA

1.1. 基本数据结构

       state contextLex源文件中用%x%s定义的状态正文,一个state context包含多条规则。默认的state contextINITIAL,如果一个规则没有指定state context,则属于INITIAL%s表示共享,如果一个规则没有指定state context,则会加入每个共享的state context%x表示互斥,没有指定state context的规则不会加入互斥的state context。每个state context包含两个状态机,一个对应非顶行的规则集,另一个对应顶行的规则集。

       ruleLex中的每个正则表达式,每个规则对应一个NFA状态机。

       machineNFA的状态机,flex中没有明显的状态机对象,状态机隐含在状态的数据结构中。state context的状态机有一个起始状态,多个接受状态。rule的状态机有一个起始状态,一个接受状态。正在构造中的状态机,有一个头状态和一个尾状态,没有起始状态和接受状态。

       stateNAF状态机中的节点,属性如下:
       firstst
:该state所属machine的参数,该状态机的头状态,也是编号最小的状态。

       finalst:该state所属machine的参数,该状态机中编号最大的状态。

       lastst:该state所属machine的参数,该状态机的尾状态。

       transchar:从该状态出来的边上的字符,负数表示一个字符集合,正数表示一个字符,零表示ε。

       trans1:从该状态转移到的状态编号。

       trans2:从该状态转移到的状态编号,只有transchar为零时才有意义。

       accptnum:非接受状态该值为零,普通接受状态该值为rule的编号,向前看接受状态该值为rule的编号加YY_TRAILING_HEAD_MASK

       assoc_rule:该状态所属rule的编号。

       state_type:状态类型,区分普通状态和向前看状态。

 

       正在构造的状态机的特点:永远只有一个头状态、一个尾状态;状态机的头状态是编号最小的状态,状态机的编号是连续的,不跳过一个编号。

       状态的特点:transchar不为零时有且只有一条出边;transchar为零时,可以有一条、两条、或没有出边,接受状态没有出边。

1.2. 最终的状态机

起始状态

接受状态

复杂的状态变迁

一个ruleNFA

rule1

rule2为空

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值