Atitit 发帖机系列(7) 词法分析的方法attilax大总结)
Atitit 发帖机系列(7) 词法分析的方法attilax大总结)
1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa1
1.2. switchcase或者ifelse 最原始方法1
1.4. 使用NFA、DFA构建FSM( 专业方法,难度大) DFA实际上就是高级版的状态表2
1.5.1. 为正规式设计NFA 由正规式构造FA——Thompson法2
界面与后端通讯需要传递dsl,需要做词法分析。。
1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa
简单点儿说,词法分析就是进行正则表达式匹配。词法分析程序就是根据要匹配的正则表达式生成它的NFA或者DFA,再将待匹配的字符串放到这些NFA或者DFA中进行处理,从而分析出输入字符串是否匹配给定的正则表达式
词法分析器的任务是按照一定模式从源程序中识别出记号(token).
我们使用正规式描述这一模式,并通过有限自动机进行识别.
因为NFA对状态转移不加限制在实际应用中带来很多问题, 通常我们将NFA转换为等价的DFA. 这里所谓的自动机等价是指它们识别同样的正规集.
1.2. switchcase或者ifelse 最原始方法
这无意是最直观的方式,使用一堆条件判断,会编程的人都可以做到,对简单小巧的状态机来说最合适,但是毫无疑问,这样的方式比较原始,对庞大的状态机难以维护。
但checkStateChange()和performStateChange()这两个函数本身依然会在面对很复杂的状态机时,内部逻辑变得异常臃肿,甚至可能是难以实现。
在很长一段时期内,使用switch语 句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。但 之后随着状态机应用的逐渐深入,构造出来的状态 机越来越复杂,这种方法也开始面临各种严峻的考验,其中最令人头痛的是如果状态机中的状态非常多,或者状 态之间的转换关系异常复杂,那么简单地使用switch语句构造出来的状态机将是不可维护的。
1.3. . 状态表 比较实用
1.4. 使用NFA、DFA构建FSM( 专业方法,难度大) DFA实际上就是高级版的状态表
使用DFA的方法完成的可配置词法分析器的性能是相当好
一般来说,比较高性能的DFA的实现是一张二维的表。行代表字符,列代表DFA 的状态,单元格代表该状态经输入某个字符之后进行转移的目标状态。此外还有一张表用来记录哪些状态对应哪些规则的结束状态
1.5. 构建词法分析器一般需要几个步骤:
00001.
用正规式描述记号的模式
00002.
00003.
1.5.1. 为正规式设计NFA 由正规式构造FA——Thompson法
00004.
00005.
将NFA转换为等价的DFA, 这一步称为确定化
00006.
00007.
优化DFA使其状态数最少, 这一步称为最小化
00008.
1.6. 优先递归 替换循环
递归可读性更好。。
1.7. 状态转移表
|
cur_dbquo_stat |
当前状态 |
当前字符 |
要即将转换到的下一状态 |
|
|
\ |
||||
|
“ dbQuo_start |
‘ |
<none> |
||
|
Not sQuo start Not dbQuo_start |
‘ |
sQuo start |
||
|
sQuo start |
‘ |
sQuo end |
||
|
Dbquo end or <non> Not Dbquo start |
“ |
Dbquo start |
||
|
Dbquo start |
“ |
Dbquo end |
||
|
Non sQuo dbquo start |
, |
|||
字符串优先使用单引号,方便输入。。
meth(\"select from tab where a='abc'\",'str2',\'s3\')
引号需要单独的状态表示
参考资料
atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结 - attilax的专栏 - 博客频道 - CSDN.NET.html
词法分析实战 - booirror的博客 - 博客频道 - CSDN.NET.html
现代编译原理--第一章(词法分析) - BlackWalnut - 博客园.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
--Atiend
Atitit 发帖机系列(7) 词法分析的方法attilax大总结)的更多相关文章
- Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明)
Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明) v5 增加对sql单引号的内部支持.可以作为string 结构调整,使用递归法重构循环发..放弃循环发. V4 java dsl词 ...
- Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案
Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案 安装主要解决一个问题,就是resin的内容启动路径以及端口..这里是使用的端口8077 主 ...
- Atitit 发帖机实现(1)-----UsrQBm2008 页面上下文规范
Atitit 发帖机实现(1)-----UsrQBm2008 页面上下文规范 1.1. 网站绝对路径,页面绝对路径1 1.2. Java的javax.servlet.ServletContext1 ...
- Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结
Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结 1.1. 根据gui的类型使用不同的gui调用api1 1.2. Script化1 1.3. ...
- Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化
Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web serv ...
- Atitit 发帖机实现(2)---usrQBN2243 文本解析到对象协议规范
Atitit 发帖机实现(2)---usrQBN2243 文本解析到对象协议规范 文本内容 ###注释 标题:标题标题标题标题标题1 人数:5 月薪:2000-3000 内容: 内容内容内 容内容内容 ...
- Atitit 最近资料文章列表r9 r8 月份 attilax总结
Atitit 最近资料文章列表r9 r8 月份 attilax总结 atitit tag标签标示规范 attilax总结 v2 r922.docx 2017-09-28 02:04 阅读(27) ...
- Atitit 自动化gui 与 发帖机 技术
Atitit 自动化gui 与 发帖机 技术 1.1. Gui tech1 1.2. 自动化软件测试1 1.3. selenium attilax1 1.4. 图形脚本语言Sikuli1 1.5. ...
- Atitit. Atiposter 发帖机 新特性 poster new feature v7 q39
Atitit. Atiposter 发帖机 新特性 poster new feature v7 q39 V8 重构iocutilV4,use def iocFact...jettyUtil V ...
随机推荐
- JavaScript-在当前显示区范围内实现点不到的小方块
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- java 数据导入到exc ,并下载
package com.lizi.admin.controller.platform.excel; import java.util.List;import java.util.Map; import ...
- ERDAS文件格式:IGE、IMG、RRD、AUX
ERDAS如果需要打开大于2GB的文件,ERDAS需要把文件转换成IMG格式.这时候,ERDAS自动生成三个文件,分别是IMG.IGE和RRD文件,其中:1.IGE:是数据文件,实际用来存储栅格数据: ...
- Python和C扩展实现方法
一.Python和C扩展 cPython是C编写的,python的扩展可以用C来写,也便于移植到C++. 编写的Python扩展,需要编译成一个.so的共享库. Python程序中. 官方文档:htt ...
- 【DP】组合数字
Password Attacker 题意就是给 M 个关键字,组合成 N 字符长度的结果,每一个关键字都必须在 N 位的字符中出现,有多少种可能结果. 范围 1 ≤ M ≤ N ≤ 100. 举例假设 ...
- 学习django之正则表达式re模块
re(regular expression)模块 正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容. 一.re ...
- JSON 基础解释.
JSON.(JavaScript Object Notation) JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本 ...
- linux启动流程
看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...
- Nutch2+Hbase环境部署和基本使用
由于项目想借助Nutch来做网络爬虫,所以一番研究,发现网上文档比较散,学习的很艰难,因此总结了一些,放上来与大家交流. 1 环境部署 Nutch有1.x系列和2.x系列,主要区别是2.x ...
- 【Java】深深跪了,OJ题目Java与C运行效率对比(附带清华北大OJ内存计算的对比)
看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. -------------------------------------- 这是切割线 ----------- ...