编译原理-词法分析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 刚开始从什么概念都没有到 ...
随机推荐
- Python SMTP邮件模块
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...
- EF 增删改
一.新增 UserInfo user = new UserInfo() { UserName = "jamsebing", UserPass = " }; db.User ...
- [Math & Algorithm] 拉格朗日乘数法
拉格朗日乘数法(Lagrange Multiplier Method)之前听数学老师授课的时候就是一知半解,现在越发感觉拉格朗日乘数法应用的广泛性,所以特意抽时间学习了麻省理工学院的在线数学课程.新学 ...
- 关于Javascript的使用参考
DOM编程>1.js重要的作用就是可以让用户可以与网页元素进行交互操作-->JS精华之所在 >2.DOM编程也是ajax的基础 >3.DOM(文档对象模型),是HTML与XML ...
- 第三次个人作业—“K米”评测
第一部分 调研,评测 评测 1.上手体验: 软件欢迎界面,色彩对比鲜明,前三图深色调,最后一条则充满了艳丽的色彩,让人对这个产品突然充满了期待. 软件界面加载速度慢,很多地方点击进去要等好久才能出现界 ...
- r-cnn学习(六):RPN及AnchorTargetLayer学习
RPN网络是faster与fast的主要区别,输入特征图,输出region proposals以及相应的分数. # ------------------------------------------ ...
- 安装配置LDAP遇到的问题
问题1:安装完启动ldap服务报错: ldap: unrecognized service? 原因在于新版的openldap将服务名改为了slapd,使用service slapd start即可启动 ...
- 在虚拟机下安装hadoop集成环境(centos7+hadoop-2.6.4+jdk-7u79)
[1]64为win7系统,用virtualbox建立linux虚拟机时,为什么没有64位的选项? 百度 [2]在virtualbox上安装centos7 [3]VirtualBox虚拟机网络环境解析和 ...
- IEnumerable和IQueryable和Linq的查询
IEnumerable和IEnumerable 1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据 ...
- ServletConfig 可以做啥
1.获得 servlet配置的servletname 2.获得servlet 配置的 getInitParameter("keyname") 3.获得servlet配置的 所有的 ...