没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一. 概念
正则表达式
使用 来解析输入文件,将输入文件的规则区中的正则表达式转换为 图
典型的 状态图可见下面的示例
到 的计算过程:
从 图中得到每个对应 状态的 状态集合 (每次转换一步)
求 的 闭包,得到一个新的 状态集合
根据 求出一个对应的 状态,对应的节点集合为
重复步骤 ,直至所有的转换都已完成(已无新的 状态集合),整个构造过程是动态
的, 状态集合是动态计算得到,一旦有新的 状态集合求出,对应的 状态也对
应增加
等价类
等价类()指的是将输入字符根据规则需要分类,例如下面的例子 总数为
;而 等价类()则是用于模型机的(),是一种更抽象
的分类,如下面的例子 总数为
转换表和转换算法
转换矩阵
根据上面 计算结果以及所有的等价类,求出从一个 状态转换到另一 状态的转
换矩阵,两个转换状态的转换边(转换条件)为
状态集合和转换矩阵可见下面的示例
和 !
和 ! 用于减少转换表项的空间,及加速查找和转换过程;
两种表项均为双向链表
和 ! 表项可见下面的示例
四个一维数组
"#
$%
&
" 快速转换算法
/* mk1tbl - create table entries for a state (or state fragment) which
* has only one out-transition
*/
void mk1tbl( state, sym, onenxt, onedef )
int state, sym, onenxt, onedef;
{
if ( firstfree < sym )
firstfree = sym;
while ( chk[firstfree] != 0 )
if ( ++firstfree >= current_max_xpairs )
expand_nxt_chk();
base[state] = firstfree - sym;
def[state] = onedef;
chk[firstfree] = state;
nxt[firstfree] = onenxt;
if ( firstfree > tblend )
{
tblend = firstfree++;
if ( firstfree >= current_max_xpairs )
expand_nxt_chk();
}
}
或者:
base[statenum] = tblbase;
def[statenum] = deflink;
for (i = minec; i <= maxec; ++i)
if (state[i] != SAME_TRANS)
if (state[i] != 0 || deflink != JAMSTATE) {
nxt[tblbase + i] = state[i];
chk[tblbase + i] = statenum;
}
if (baseaddr == firstfree)
/* Find next free slot in tables. */
for (++firstfree; chk[firstfree] != 0; ++firstfree) ;
tblend = MAX (tblend, tbllast);
从 以 上 的 算 法 中 可 以 看 到 firstfree= base[state]+sym ( sym 代 表 EC 或 者 meta-
EC),因此 chk[firstfree] = chk[base[state]+sym] = state 如果成立,则表示
存在这个转换表项,就将 nxt[firstfree] = nxt[base[state]+sym] = onenxt 的值
赋给 next(下一表项)
二. 一个例子:
文件内容:
''
# !()*+,-'.*/00&12
345346758 !()*9-'.*/00&12
3675: !()*;-'.*/00&12
*<* !()*=>?-'.*/00&12
*8* !()*=>?-'.*/00&12
*<8*)18*8<* !()*= 9=-'.*/00&12
''
")!@/$!88!@1
A
00&)12
B
00C!)1
A
!!2
B
输出的各类表项:
D-.!.!.EF&,.G&!.!.G&..G&HG&&
剩余11页未读,继续阅读
资源评论
昔年2017
- 粉丝: 6
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功