飞纯技术
  • 主页
  • 相册
  • 关于我
KEEP IN TOUCH

Posts in category lex

how to write lex (11)

五07
2007
Leave a Comment Written by Filia.Tao

DFA最小化的详细算法
说明:下面的算法在空间复杂度上有一点小问题,我已经改用deque来实现.算法的基本思想是一致的.
下面的算法比使用deque的实现方式更通俗易懂,所以没有更新下面的描述了.

数据结构:

  • 一个MAP map<int,int> mapping 表示原来的状态编号对应到最小化以后的状态编号
    mapping[1] = 2 表示原来的状态1,对应到最小化后状态2中。
  • 一个min-DFA 状态列表sss。其中的元素为未最小化的DFA的状态的集合。
    上面的MAP中的最小化状态就用列表的下标表示。
  • 一个循环控制量count

算法:

  1. 把DFA的状态分成若干个集合。
    一个是非终态集合。终态集合中对应不同规则的终态放到不同集合中。
    把这些集合加入到sss中。count = sss.size();
  2. 初始化mapping
  3. 如果count > 0 从sss中取下一个集合,否则到6
  4. 遍历字母表判断是否可以分割这个集合。(关于是否可以分割的定义,书本上都有,这里就不写了)
    如果某一个字符可以分割这个集合.

    • 将分割后的来两个集合s1,s2加入到sss中,
    • 对连个集合中的状态更新mapping.
      对s1中的状态i,mapping[i] = sss.size() -2 ;
      对s2中的状态j, mapping[j] = sss.size()-1;
    • count = sss.size() – 当前集合的在sss中下标 -1
    • 退出字母表遍历

    如果任何字符都不能分割这个集合

    • 将当前集合加入到sss的末尾。
    • 对集合中的状态更新mapping.
      对当前集合中的状态i,mapping[i] = sss.size() -1 ;
    • count –
  5. 回到3
  6. 从mapping 中收集信息,建立min-DFA.(用mdfa 表示,原DFA用dfa表示)
    • 初态 mdfa.initialState = mapping[dfa.initialState]
    • 状态 foreach( i in dfa.states) mdfa.states.insert(mapping[i])
    • 转换
      foreach( t in dfa.transitions)
      mdfa.transitions.insert(triple(mapping[t->from],mapping[t->to],mapping[t->label]))
    • 终态和meta data
      foreach( s in dfa.finalStates)

      mdfa.finalStates.insert(mapping[dfa.finalStates])
      if (!mdfa.meta[mapping[s]] || mdfa.meta[mapping[s]] > dfa.meta[s])
      //这里体现了lex输入文件中先出现的规则优先的原则。mdfa.meta[mapping[s]] = dfa.mata[s]

Posted in compiler - Tagged compiler

how to write lex (10)

四25
2007
3 Comments Written by Filia.Tao

从风言疯语之IT罗盘 上的这篇文章中,看到一个在线生成思维导图的站点.
思维导图以前也玩过,不过没有深入. 主要是工具不顺手.
这个站点不得不赞一下,操作很简单.产生的导图也很美观.
用这个工具画了一个SeuLex的一个思维导图.
提供的IFrame方式的导出,用起来不方便.(也不符合XHMTL的标准). 还是用Pearl Crescent Page Saver Basic截图传上来吧. (也可以点这里查看网页版本) SeuLex的思维导图

Posted in compiler - Tagged complier, minmap, minpin, 思维导图

how to write lex (9)

四20
2007
4 Comments Written by Filia.Tao

我今天把代码优化到处理c语言,用2秒钟.(原来需要10s).
不过还是没法更flex 比,它的时间<1s.
随便写写开发过程中的几点体会,可能和lex本身没有太大的关系.

  • 尽量不要用string . C++ 的string做的效率不高.
  • 不要使用magic number . 可以定义称const int 的就定义成const int.
  • 宏是万恶之源.如果一定要用,名字取长一点.
  • 用好typedef
  • 单元测试很重要.
  • 学会用工具分析性能.
  • 正则表达式很奇妙
  • 中文的编码是负的.
Posted in C/C++, compiler - Tagged C/C++, compiler

how to write lex (8)

四16
2007
Leave a Comment Written by Filia.Tao

lex输入文件解析.
格式:

The general format of lex source shall be:

Definitions

%%

Rules

%%

UserSubroutines

Definions:这个有两部分

  • lex 定义文件中使用的变量
    在%{ 和%}之间的内部的是C声明, 简单的将它们拷贝下来,发送最终输出文件的开头.
    另外的是lex的变量定义(以及其他一些东西,我们忽略)
    每一行是name  substitute  对.空格分割.name必须是一个合法的C变量名.
    在这里和规则定义部分将{name}替换成substitute.
    也就是说这里可能有嵌套的定义.
  • 规则定义部分
    这部分以%% 开始,以 %% 结束.
    分两列RE       ACTION
    两个之间的分割符为空格(或其他空字符比如\t)
    注意ACTION 可能出现多行的情况,一般情况下会还有{和}把ACTION包围起来.(不过lex规范没有定义这一点)
    对于RE中出现的空白字符,必须符合下面的条件

    • 整个表达式在双引号中
    • 空白字符出现在双引号或[]中
    • 每个空白字符有一个前导反斜杠

    正则表达式中可能出现{name}需要用第一部分定义的substitute  替换.
    然后我们把用两个数组分别记录RE和ACTION 就可以了.

  • 用户自定义的函数
    简单的将拷贝到输出文件就可以了.
Posted in compiler - Tagged compiler, re

how to write lex (7)

四15
2007
1 Comment Written by Filia.Tao

以前的几篇文章并没有和我们的任务紧密的联系起来,忽略了很多东西.
我们使用DFA来识别字符串,必须要知道输入字符串最终是匹配了lex 输入文件中哪个正则表达式,而不仅仅是是否匹配.
所以我们需要引入新的数据结构,来表示NFA中每一个终态对应的哪一个正则表达式.
我简单是使用一个MAP(哈希表)来表示这些信息.
这些信息在对NFA进行操作时,需要进行相应的转换.但实际上需要转换的有下面几个地方.

  • 状态重新编号
    改变MAP的key 即可
  • union
    合并两个MAP即可.
  • NFA -> DFA
    一个DFA状态对应一个NFA集合.
    这个集合中可能若干个NFA终态,取他们对应正则表达式编号的最小值作为DFA状态对应的正则表达式编号.
  • DFA 最小化
    类似上面的做法.一个min-DFA状态对应原来的DFA的多个状态.
Posted in compiler - Tagged compiler
« Older Entries

授权方式

Creative Commons License
本站作品采用
知识共享署名-非商业性使用-相同方式共享 3.0 许可协议
进行许可。

最近评论

  • carlos 发表在《yacc,ast and graphviz》
  • xiang 发表在《关于我》
  • healthy green tea 发表在《debian 同步系统时间》
  • Filia.Tao 发表在《Kinper – A Kindle Helper Service》
  • pensz 发表在《厦门行简单记录》

My Tweets

RSS My KnowHowSpot

标签

指令 汇编 算法 计算机科学 2008 amazon android ast boto C++ C/C++ compiler Computer design-pattern DFA Django ezengage Firefox github google GSoc http imagedownload iterator javascript jquery kindle kinper lex life Linux locationbar Mix opensource proxy python s3 S5Creator shanghai slide STL vector vista web Web开发

分类

  • ideas (2)
  • job (2)
  • life (2)
  • notes (1)
  • opensource (38)
    • Firefox (17)
    • GSoc (7)
    • Linux (13)
  • project (3)
  • 生活 (3)
  • 编程开发 (67)
    • C/C++ (4)
    • GAE (1)
    • http (2)
    • javascript (24)
    • python (20)
    • Web开发 (12)
    • 端口映射工具的实现 (6)
  • 计算机科学 (23)
    • compiler (17)
      • lex (11)
    • 算法 (5)
  • 随便写写 (67)

文章归档

Blogroll

  • 11′s SKY
  • 86's world
  • Filia’s Summer Of Code
  • limodou的学习记录
  • Loki
  • MyAllBlue
  • perol’s blog
  • Realazy
  • 一个藏袍
  • 人猿星球
  • 冰古Blog
  • 刀枪Blue
  • 懶懶喵日記
  • 桑林志
  • 白菜
  • 车东[Blog^2]
  • 释翼的天空
  • 阿文的自留地

开源网站

  • beagle
  • linuxsir
  • sourceforge
  • 中国Linux 公社
  • 啄木鸟社区

我的项目

  • ezEngage
  • KnowHowSpot

EvoLve theme by Theme4Press  •  Powered by WordPress 飞纯技术