词法分析(9):什么是正则

0 阅读1分钟

本文是本人撰写的编译原理讲义。

本系列讲义适用于:被强迫学习编译原理前端,或者希望弄明白如何做科研的人

1. 补全最后的拼图

词法分析的项目终于结束了。好不容易终于提前下班。

接连几天被各种有限自动状态机FA、正规式、正则文法折磨得死去活来,终于休息的时候眼前还是浮现起了这三小只互相转化来转化去的样子,就像是三个小朋友在那里打闹一样。

就在主角被这个想象逗得哈哈大笑的时候,他突然发现,正则文法好像有点孤单,它可以转化成正规式和FA,但好像还没讨论过如何把他们转换回正则文法?

那不行。

1.1 正规式转正则文法

前面才弄出来正则文法转正规式,无非就是三条规则。那么,直接反过来弄不就好了?

正规式

正则文法

规则1(连接规则)

A=xy

A->xB
B->y

规则2(或规则)

A=x|y

A->x
A->y

规则3(闭包规则)

A=x*y

A->xA
A->y

1.2 FA转正则文法

既然我们都有了形式化定义抽象对象的方法,那给前面的正则文法也整一个:

正则文法里面的主要成分就是各种产生式(Productions),因此对于产生式的集合用P表示。

其次,这个产生式的成分有表示实际所用的符号,也有表示所处状态的符号。

由于表示所处状态的符号还能不断往后生成;而实义符号并没有这样的能力。

所以就把前面的叫做非终结符(Non-terminal symbol),后者就叫终结符(Terminal symbol)吧!(在后面讲到语法分析中将会有更加形象的表述。)

那么对于这两者所组成的集合,就可以分别叫:V_T,:V_N,以及两者的并集总符号表(集合)V=V_T ∪ V_N。

整理一下,就有一个完整的四元组G=(V_N, V_T, S, P),其中:

V_N是非终结符表(集合);
V_T是终结符表(集合);
S 表示开始符号,是V_N中的元素;
P 是所有的产生式集合

这么看着,V_T完全就是对应的Σ;S对应的是q₀;δ和P的产生式也几乎是一一对应的。

唯一的差异就是,P中那些无后的产生式,不需要以终态的形式展示出来罢了。

对于FA中的转换函数,NFA反正是能转成DFA的,而FA的转换函数形式无非就是f(S,a)=A这样的结构。

对于DFA中的接受态Z,只要在产生式集合中加一句A->ε就好了。

Emm,这么说来,DFA的状态集Q还直接对应上了非终结符表了呀!

好像不对,如果反过来万一原来的文法中没有A->ε这样的产生式,上面这句话就不成立了。

应该说,正则文法中的V_N是FA中状态集Q的子集。

Emm,这下舒服了。

2. 梦神

想明白这一切的主角再次安坐在沙发中,满意地看着脑海中的三小只在那里欢快地跳着圈圈舞。忽然,他们中间的空间像是开了一个洞,一下子把他拖进了一个神秘的空间。

好不容易适应了头晕目眩,一个熟悉到让他心痛的身影出现在眼前。

她穿着一身华丽的、白色与金色相间的长袍,宛如幻想故事中走出的女神。黑色的长发、温柔的眼眸、嘴角习惯性的微笑弧度……一切都和他记忆中的前女友一模一样。他的呼吸一滞,喉咙有些发干。

主角看到的正则女神瑞格娜(Regular)

女神微微一笑,先开口了:看你这表情,你应该是看到了某个熟人的外貌投影。不过我不是ta。概念神是没有外形的,我是正则之神 瑞格娜(regular),代表规则与秩序。你之所以看到我,是因为你完成了我的三大化身的互相转化,正则文法、正规式、有限状态自动机,它们互相不是对方,但每一个都是我——规则的化身。

规则和词法分析有什么关系??

瑞格娜:所谓词法,就是单词的法则。任何的单词,在书写的时候总是从一边到另一边,而不能突然写到已有字符串的中间。这就是线性文法,这就是规则的体现。

这么说来,S->aS|b确实是一直向右延伸的样子。如果想要向左延伸,就可以写作:S->Ab; A->Aa|a。

瑞格娜:是的,所以正则文法实际上分为左线性文法和右线性文法。它们的共同点是,产生式左边要么只有常符号串,要么下一个状态就只会出现在常符号串的前面或者后面。

你这么一说,好像我还真没有写过类似S->aAb这样的式子呢。

瑞格娜笑道:你说的这个已经超出我权能的范畴了。

想起以前一旦超出能力范围外就无所适从的一根筋前女友,男主喃喃道:你这跟我前女友太像了。

瑞格娜也不恼:本来就是她的投影嘛。之前还有人笑我作为规则过于一根筋呢,但我被创造出来的本意,就是希望可以让这个混乱的世界有一些人人认可的共识。当共识成为了规范,而当大部分人都遵守的话,大家都可以获益。

还是有点不明白,正则文法和正规式怎么就都是规则的化身了?甚至FA都归给你管了?

瑞格娜:正则文法的英文是Regular grammar。正规式的英文是Regular expression。很多语言上的问题,由于巴别塔的存在,会让原有的意思在传播的过程中发生变化,甚至是变异。至于FA嘛,是因为他只能一往无前心无旁骛地沿着设定好的规则往前走。

嗯?我还给正规式创造了英文名?我怎么不知道。话说真要是这个英文名的话,我觉得是不是该翻译成正则表达式会好点。

瑞格娜微微一笑:这个概念在你们地球的其他角落早就有人研究过了,等到你研究更复杂的东西的时候,可能你就真能成为那个拥有唯一冠名权的人吧。不过正则表达式这个名称,好像还真的有点意思,或者你可以试着用它去作为正规式落地版本的名称?

落地版本?

瑞格娜:就像是Linux内核和Linux系统,虽然都叫Linux,但前者对用户而言就只能算是理论,后者就是的实际产品。正规式中,只能用闭包*匹配非特定次数的重复,那就必然要加上这些实用性的升级,让它从理论模型转变为实际可用的产品。在语言中对他们这样他们两个就不会被使用者混淆了。

你还知道Linux?

瑞格娜:(嘴巴在动)…………

你在说什么??怎么没有声音了??

智能音响:嗯,我在呢,主人请给我下达指令吧!

我¥#¥……#¥#%你……!&%!#&个&%#^!#$¥音箱!。。。

趁着对梦境还有印象,赶紧拿起笔把那个最不想忘记的东西画了出来。

没几分钟,一个三曲枝式(圣三一)形状的徽记就出现了。(啊你在期待什么?)

这个徽记由三个清晰可辨、但又相互交织的部分组成:

1. 上方部分:包含一本打开的书,表示正则文法(Regular Grammar)。

2. 左下方部分:包含一个简单的有向图, 表示有限自动机(Finite Automata)。

3. 右下方部分:包含一个公式“(a|b)*”,表示正规式(Regular Expression)。

Emm,好像忘了什么真正重要的东西。。

盯着三曲枝的中心,他终于又想起了那张脸孔:是的,这三个工具的本质实际上是那个,被描述的巨大单词集合。这个集合该叫什么好呢?正规式。。。那就叫正规集吧!

智能音箱:说集不说吧,文明你我他。

谢谢你,智障音箱。话说回来,其余部分都有英文名了,看来正规集也该叫Regular Set了。

智能音箱:你是否在找Regular Language? 该概念把所有符合规则的单词都作为语言的一部分,从而把它们统称为正则语言。

谢谢你,智能音箱。

词法分析的圣三一

所以,在这个圣三一中,位于上方统管一切的,是表示思想的正则文法。

表示实施的,是左下角的FA,它是机器理解的直接材料,但是对人不甚友好。

而右下角,是降低思想和实践沟通门槛的工具——正规式。

三者互相不是对方,但都可以互相转化成为对方。因为他们的核心都是正则语言(也叫正规集)。

3. 新的风暴已经出现

话说回来,就像梦里那谁说的,正则文法里的式子限制太多了。如果我写成S->aSb|a这样就不是正则文法了,那这又该叫啥呢??

说话间,师傅的电话打来了。

“早点来公司,来大单了!之前的词法分析器客户很满意,待会儿要来公司商讨怎么开发后续的语法分析器!”