编译原理笔记-词法分析-1

701 阅读3分钟

正则表达式

引:

语言L=\lbrace a \rbrace\lbrace a,b \rbrace^*(\lbrace \varepsilon\rbrace\bigcup(\lbrace .,\_\rbrace\lbrace a,b\rbrace\lbrace a,b\rbrace ^ *))

上述语言为:以字母a开头,然后连接一个任意长度的ab字符串,接下来若连接空串则表示该句子已经结束;若接下来连接的不是空串则可以连接点( . )或者下划线(_)再连接一个长度大于等于1的ab字符串。


正则表达式(Regular Expression, RE)是一种用来描述正则语言的更紧凑的表示方式,如:

r=a(a\mid b)^*(\varepsilon\mid(.\mid \_)(a\mid b)(a\mid b) ^ *)

定义

  • \varepsilon是一个RE,L(\varepsilon)=\lbrace \varepsilon\rbrace
  • 如果a\in \sum,则a 也是一个RE,L(a)=\lbrace a\rbrace
  • 若r和s都是RE,其表示的语言为L(r)L(s),则有:
    • r\mid s也是一个RE,L(r\mid s)=L(r)\bigcup L(s)
    • rs也是一个RE,L(rs)=L(r)L(s)
    • r^*也是一个RE,L(r ^ *)=(L(r ^ *))
    • (r)也是一个RE,L((r))=L(r)
  • 运算的优先级为 1、( * ) 2、(连接) 3、( | )

可以用正则表达式定义的语言叫做正则语言(regular language)或正则集合(regular set)


正则表达式遵循代数定律

正则定义(给RE起名)

C语言标识符例 :

digit\rightarrow 0\mid 1\mid 2\mid ...\mid 9

letter\_\rightarrow A\mid B\mid...\mid Z\mid a\mid ...\mid z\mid \_

id\rightarrow letter\_(letter\_\mid digit)^*

即标识符:a231, _233, abs4_, ...

有穷自动机(Finit Automata, FA)

FA的表示:转换图

  • FA的状态用节点,即圆圈表示。
  • 初始状态 ( 开始状态 ):只有一个,用 start 表示。
  • 终止状态 ( 接受状态 ):可以有多个,用双圈表示。
  • FA的输入用带标记的有向边表示。
    fa表示
    图1

FA定义(接收)的语言:

输入的串可以使FA从初始状态转换到某个终止状态(因为终止状态可以有多个),这样的串就是被该FA接收了。引用上图1举例:

设输入串为:abbaabb

则从左至右依次看输入串,输入a时依然是0态,再输入b也是0态,再输入b又是0态,然后是a也是0态,接着的a是1态(因为由图1来看,两个连续输入为a才会由0进入1态),然后的b和b依次进入2和3态,其中3是终止状态,在这个串中,使得有穷状态机从初始装态转换到了终止状态,就称该串被该FA接收了

当然这样的串不止一个,而所有满足接收条件的串的集合(M)称为是该FA定义(或接收)的语言,记为L(M)

FA的模型:

  • 输入带(input tape):用来存放输入字符串
  • 读头(head):从左向右依次读取符号,且只读,不可往返
  • 有穷控制器(finit control):其中有有穷个状态数,依据当前输入的符号(读头指向)和当前状态来控制是否转入下一状态

一个典型例子:电梯控制,它是如何通过有穷自动机实现的?(未明白待解决)

最长子串匹配原则(Longest String Matching Principle

当输入串的多个前缀与一个或多个模式相匹配,总是选择最长的前缀进行匹配(自己的理解,当有穷自动机中有多个终止状态,而一个串刚好满足多个终止状态,则与距离start最长的终止状态来匹配)。如:

当输入的串为 1<=2 时,会匹配<=,而不是<。如何用程序实现呢? (暂)