02-词法分析
正则语言
定义:若存在一个 DFA/NFA 能够匹配所有这个语言的字符串,拒绝所有不属于这个语言的字符串,那么这个语言就是正则语言。
若 是正则语言,则以下也是正则语言
正则表达式
原始正则表达式
空集:
空串:
字符:
正则表达式进行以下运算后还是正则表达式
若两个正则表达式表示同一种语言,则它们是等价的。
正则表达式的运算定律
常见运算符
|
:或*
:0次,1次或多次+
:1次或多次?
:0次或1次
交换/结合律
零元/幺元
分配律
幂等律:
闭包:
( 拼接次是空串,拼接多次是空集)
正则语言 & 正则表达式
任何正则表达式都能表示正则语言:将正则表达式转换为 NFA
原始正则表达式是 NFA 的一个个“部件”
正则表达式的运算是 NFA 的“组装”
任何正则语言都能用正则表达式表示:通过正则表达式表示 DFA
将 DFA 的状态转移变为正则表达式的等式
消元,化简,得到正则表达式
词法分析的基础
为词位(lexeme)建立正则表达式,构造 DFA
将源代码作为输入
将 DFA 作为状态机,识别出源代码中的词位
Lexical Analysis 词法分析
正则表达式 -> NFA -> DFA -> 最小化 DFA
当达到 DFA 的终止状态时,输出 Token
当有多个 DFA 同时匹配时
根据优先级选择 或
选择最长的 Token
Pumping Lemma 泵引理
如果存在一个常数,使得对于所有长度大于的字符串,可以被分为三个部分,满足以下条件,那么是正则语言
对于任意,
证明思路:设状态数是,长度大于的字符串至少有个状态,至少有一个状态被访问两次,产生循环。
用于证明一个语言不是正则语言
,
选择,使得
但是
是正则语言吗?
设,,
不是正则语言
最后更新于