1. 生成NFA
1.1. 基本数据结构
【state context】Lex源文件中用%x或%s定义的状态正文,一个state context包含多条规则。默认的state context为INITIAL,如果一个规则没有指定state context,则属于INITIAL。%s表示共享,如果一个规则没有指定state context,则会加入每个共享的state context。%x表示互斥,没有指定state context的规则不会加入互斥的state context。每个state context包含两个状态机,一个对应非顶行的规则集,另一个对应顶行的规则集。
【rule】Lex中的每个正则表达式,每个规则对应一个NFA状态机。
【machine】NFA的状态机,flex中没有明显的状态机对象,状态机隐含在状态的数据结构中。state context的状态机有一个起始状态,多个接受状态。rule的状态机有一个起始状态,一个接受状态。正在构造中的状态机,有一个头状态和一个尾状态,没有起始状态和接受状态。
【state】NAF状态机中的节点,属性如下:
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. 最终的状态机
起始状态 |
接受状态 |
复杂的状态变迁 |
一个rule的NFA |
rule1 |
rule2为空 |