编译原理-词法分析04-NFA & 代码实现
编译原理-词法分析04-NFA & 代码实现
0.术语
NFA
非确定性有穷自动机nondeterministic finite automation。
ε-转换ε-transition
是无需考虑输入串(且无需消耗任何字符)就有可能发声的转换,它可看作是一个空串的“匹配”。
转换表transition table
是一个 T(状态,字符) --> 状态 的函数。
通常用二维数组表示。
表驱动table driven
利用表格来引导算法的过程。是转换表的一般化抽象。
1.定义
NFA(确定性有穷自动机)M由字母表∑,状态集合S,转换函数T:Sx(∑∪{ε})→P(S)、初始状态_s0_∈S以及接受状态的集合A⊂S组成。由M接受的且写作L(M)被定义为字符c1c2...cn串的集合,其中每个ci∈∑∪{ε},存在状态s1=T(s0,c1),s1=T(s1,c2),...,sn=T(sn-1,cn),其中sn是A(即一个接受状态)的一个元素。
T转换函数:T的范围是S的幂集。
与DFA的区别:DFA中,T(Sn,ci) = Sn+1,而NFA中,T(Sn,ci) = {Sn+1,Sn+2,...},即同一个字符可以转换到多个不同的状态分支。
2.NFA图
3.表驱动
C注释的表格结构:
state\input character | / | * | other | Acceptable |
---|---|---|---|---|
1 | 2 | no | ||
2 | 3 | no | ||
3 | 3 | 4 | 3 | no |
4 | 5 | 4 | 3 | no |
5 | yes |
通常的伪代码描述为:
T:定义了转换表。
Advance:先行输入,尝试取下一个字符。
state = 1;
ch = readchar(); //读取一个字符
while (!Accept[state] && !error(state))
{
int newstate = T[state][ch]; //取得新的状态
if(Advance[state][ch]) //
{
ch = readchar();
}
state = newstate;
}
if(Accept[state]) //接受状态,则做点什么
{
...
}
总结:
表驱动的方式主要是针对DFA,对于NFA的,由于有很多条路径的选择,如果使用表驱动,则会涉及到回溯,这个会引起效率问题,一般的做法是将NFA转为DFA。
表驱动可能会造成稀疏矩阵,如果使用二维数组的话,有可能需要使用压缩算法等。当然,使用邻接表则忽略空间的浪费。
编译原理-词法分析04-NFA & 代码实现的更多相关文章
- 编译原理-词法分析05-正则表达式到DFA-01
编译原理-词法分析05-正则表达式到DFA 要经历 正则表达式 --> NFA --> DFA 的过程. 0. 术语 Thompson构造Thompson Construction 利用ε ...
- 编译原理词法分析 java简单实现
package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundEx ...
- 编译原理-词法分析03-DFA
0.术语 DFA Deterministic finite automation,确定性有穷自动机.一般用于翻译正则表达式. 状态state DFA中的圆圈,表示模式在识别过程中的位置. 转换tran ...
- Atitit.编译原理与概论
Atitit.编译原理与概论 编译原理 词法分析 Ast构建,语法分析 语意分析 6 数据结构 1. ▪ 记号 2. ▪ 语法树 3. ▪ 符号表 4. ▪ 常数表 5. ▪ 中间代码 1. ▪ 临 ...
- 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...
- 前端与编译原理 用js去运行js代码 js2run
# 前端与编译原理 用js去运行js代码 js2run 前端与编译原理似乎相隔甚远,各种热门的框架都学不过来,那能顾及到这么多底层呢,前端开发者们似乎对编译原理的影响仅仅是"抽象语法树&qu ...
- 编译原理-NFA构造DFA
本题摘自北邮的编译原理与技术. 首先,根据此图构造状态转换表 表中第一列第一行表示从第一个符号B通过任意个空转换能到达的节点,Ia表示由此行的状态数组({B,5,1}可以看作0状态)经过一个a可以到达 ...
- java动态编译 (java在线执行代码后端实现原理)(二)
在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...
- java动态编译 (java在线执行代码后端实现原理)
需求:要实现一个web网页中输入java代码,然后能知道编译结果以及执行结果 类似于菜鸟java在线工具的效果:https://c.runoob.com/compile/10 刚开始从什么概念都没有到 ...
随机推荐
- Dom4j把xml转换成Map(固定格式)
/** * 可解析list * * @param fileName * @return * @throws Exception */ @SuppressWarnings("unchecked ...
- code::blocks编译出错
问题描述: 在windows xp 上编译的cbp项目(已经生成.obj文件),放到fedora上无法顺利编译.(build) collect2:error: ld returned 1 exit s ...
- Container View 使用小技巧
一.传值,顺传 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { TVC *vc = segue.destin ...
- spring常见问题
问题1:提示说:cvc-elt.1: Cannot find the declaration of element 'beans' 解决方法:从网上搜了一些,有的说是因为网络原因访问不到xsd文件,因 ...
- extractor
package scrollable.excel.reader; import java.io.IOException; import java.io.InputStream; import java ...
- Nginx反向代理+keepalived
环境两台LB(nginx).两台web(nginx/apache都行) 安装httpd web01 [root@web01 /]# /etc/init.d/iptables stop iptables ...
- ASP.NET Core--授权过滤器
翻译如下: 目前,我们正在从事这方面工作. 我们欢迎您的加入,以帮助塑造范围和方法.您可以跟踪状态并在此提供的输入问题在GitHub上. 如果你想查看初稿并在此主题的大纲,请留下注意到在您的联系信息的 ...
- 多重网格法简介(Multi Grid)
原文链接 多重网格法是一种用于求解方程组的方法,可用于插值.解微分方程等. 从专业角度讲多重网格法实际上是一种多分辨率的算法,由于直接在高分辨率(用于求解的间隔小)上进行求解时对于低频部分收敛较慢,与 ...
- HTTP参数污染
HTTP Parameter Pollution简称HPP,所以有的人也称之为“HPP参数污染”. 一篇很不错关于HPP参数污染的文章:http://www.paigu.com/a/33478/235 ...
- mysql开启远程连接
修改my.ini 去掉 bind-address 127.0.0.1 或添加 bind-address 0.0.0.0 mysql -u root -p 进入mysql,执行 '; 然后 flush ...