2007年1月20日、编译原理第二课

来源:互联网 发布:海康威视二次开发java 编辑:程序博客网 时间:2024/06/10 05:08

    别人都说编译原理难学,经过今天的学习,的确是感觉这门课的确是有点难学,困难的地方无疑是在于原理性的东西全是用数学知识去描述,还好大学的东西还记忆一点,对于今天学的东西虽然读了几次才对原理有了一些了解。
    今天看的是编译原理第二课:词法分析,可以理解为对源程序的扫描,起主要目的就是将源程序读作字符文件并将其分为若干个记号,就和现实中的自然语言一样,首先将英语文章的所有字母读成一个一个单词,每个单词都有标号或空格分开,然后在对每个单词的意思认识的基础上对句子的语法上分析。扫描程序在扫描过程中的格式说明和识别方法主要是正则表示法与有穷自动机。下来详细说明:

    1、基本正则表示法,对于基本正则表示法的定义书上是这么给的:
    a、基本正则表示法由一个单字符a,以及元字符e,或空字符,对于每种形式都有L(a)={a}
    b、r|s格式表达式:其中r、s均是正则表达式。这种情况下:L(r|s )=L(r)  L(s)
    c、rs格式表达式:其中r、s均是正则表达式。这种情况下:L(rs )=L(r)L(s)
    d、r*格式表达式:其中r为正则表达式。则L(r*)=L(r)*
    e、括号只是调整优先级的不影响语言。
   通过书上给的定义并不能对正则表示法有一个概括的定义,只能从逻辑上去理解,不过可以对比以前web开发的情况,正则表示法无非是描述字符串集的字符串,如以A开头的并以a结尾的字符串可以用正则表示为[A,*a],在扫描程序工作阶段,可以使用正则表示法来识别标识符、关键字、算术表达式等等。

    2、有穷自动机,是描述特定类型算法的数学方法。定义:
    DFA定义:-一个确定的有穷自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z)其中
  ① K是一个有穷集,它的每个元素称为一个状态;
  ② Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号字母表;
  ③ f是转换函数,是K×Σ→K上的映射,即,如 f(ki,a)=kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;
  ④ S ∈ K是唯一的一个初态;
  ⑤ Z K是一个终态集,终态也称可接受状态或结束状态。

    一个DFA可以表示成一个状态图(或称状态转换图)。假定DFA M含有m个状态,n个输入字符,那么这个状态图含有m个结点,每个结点最多有n个弧射出,整个图含有唯一一个初态结点和若干个终态结点,初态结点冠以双箭头"=>"或标以"-",终态结点用双圈表示或标以"+",若 f(ki,a)=kj,则从状态结点ki到状态结点kj画标记为a的弧;
DFA 的状态图表示

    (NFA)不确定的有穷自动机定义与确定的有穷自动机大致相同,仅仅是在 Σ集合中增加了元字符集合,也就是说扩展了转换函数,这样每个字符都会多了几个状态,也就是说在串中真正被接受的是除了元字符集合e之外的所有。说明DFA 是NFA的特例

    由于对离散数学已经忘记的差不多了。对于自动机理论已经忘记的干干净净的了。所以目前只能根据书上说的定义去理解,自己的脑子里还没有形成自己的认识体系。所以对如何把正则表达式转化为DFA就没有详细看了。因为看的脑子都是乱的。不过现在至少多正则表达式和有穷自动机有大体上的认识了。刚才下了一本离散数学的书。打算每天看一课编译,然后再看离散争取把编译原理第一遍看完的同时能够把离散数学也复习完,至少在对编译原理进行第二遍学习的时候能够看懂、看明白。

原创粉丝点击