正则表达式和有限自动机
乔姆斯基和句法分析

乔姆斯基和句法分析乔姆斯基之于语言学和认知科学,就像图灵之于计算机科学。
没有这些“先知”,我们不知还要在黑暗中摸索多久。
这个说法不只是比喻性的:乔姆斯基的句法频谱后来被证明和几种自动机有着深刻的关联:乔姆斯基3型文法(正则表达式)等价于有限自动机,2型文法(上下文无关文法)等价于下压自动机,1型文法(上下文相关文法)等价于线性有界非确定图灵机,0型文法等价于图灵机。
乔姆斯基的句法研究导致了乔姆斯基在哲学上的理性主义立场,这与英美的经验主义主流不合拍。
其实乔姆斯基的理性主义与欧陆传统的理性主义并不完全一致,倒是和丘奇-图灵论题可互为佐证。
这话展开了讲太长,语言学和哲学系找不到课题的博士生可以试试这个。
乔姆斯基决定干语言学其实缘于他的政治兴趣。
他是结构主义语言学开山哈里斯(Zellig Harris)的学生,他们都是犹太人,有同样的政治主张。
大二时,乔姆斯基对学业困惑,准备退学,哈里斯劝他说:你干嘛不试试语言学呢,可先从数学和哲学入手。
哈里斯给了他一本自己尚未出版的《结构语言学方法》一书的草稿,乔姆斯基从此开了窍,走上了语言学之路。
传统的人文范儿的语言学家必是那些懂多种语言的人才。
但哈里斯把语言学从人文转变成科学,他在宾夕法尼亚大学(UPenn)建立了美国第一个语言学系。
乔姆斯基在宾大得了本科和硕士学位后,在那时还在宾大哲学系教书的古德曼(Nelson Goodman)的影响下,前往哈佛投奔当时美国哲学界的领袖蒯因(Quine),他在哈佛还被选为初级研究员(Fellow)。
哈佛的这个Fellow是给那些明日学术之星准备的,在乔姆斯基之前,王浩、库恩等都得过。
在哈佛期间,乔姆斯基发表了他的第一篇学术论文“句法分析系统”(Systems of Syntactic Analysis)。
值得一提的是,这篇文章并未发表在语言学杂志上,而是在数理逻辑最权威的《符号逻辑杂志》(JSL )上。
这本杂志由丘奇创办,从杂志创刊开始,丘奇就为JSL 写评论,一直写到他80岁高龄。
形式语言与自动机的应用于编程语言设计

形式语言与自动机的应用于编程语言设计概述:编程语言设计是计算机科学领域的重要研究方向之一,它关乎计算机语言的表达能力和机器执行的能力。
形式语言与自动机理论在编程语言设计中有着广泛的应用,通过对形式语言和自动机的理解和应用,可以提高编程语言的表达能力、确定性以及便利性。
一、形式语言理论:形式语言是一种严格定义的语言,其符号和规则均被正式化的定义。
形式语言理论主要研究形式语言的定义、性质和应用等方面。
1. 文法和句型:在形式语言中,文法是形式语言的基本组成部分,描述了形式语言的语法规则。
句型是可以由文法推导得到的具体字符串,它们可以是正确的语句或表达式。
2. 语言的分类:形式语言根据其生成规则和使用范围的不同,可分为正则语言、上下文无关语言、上下文相关语言和递归可枚举语言等。
不同类型的形式语言对应着不同类型的自动机。
二、自动机理论:自动机理论是研究自动机的定义、性质和应用等方面的学科。
自动机是一种抽象的计算模型,可以接受、处理和产生符合特定规则的串。
1. 有限状态自动机:有限状态自动机是最简单的自动机模型之一,它具有有限个状态和确定的状态转移规则。
有限状态自动机广泛应用于词法分析、语法分析和编译等领域。
2. 图灵机:图灵机是一种具有无限长带子的自动机模型,具有读写头和状态转移规则。
图灵机是计算机科学中最基本的理论模型之一,广泛应用于理论计算机科学。
三、自动机在编程语言设计中的应用:自动机理论为编程语言设计提供了理论基础和方法,它可以帮助设计师解决语言的表达能力、语法正确性和运行效率等问题。
1. 语法分析:自动机可以用于语法分析,从而验证和解析程序代码的语法结构。
常用的语法分析算法包括递归下降分析和LR分析等。
2. 词法分析:自动机可以用于词法分析,根据正则表达式和有限状态自动机的定义,设计出词法分析器,将源程序分割成一个个的词素。
3. 编译器设计:自动机可以用于编译器设计中的识别和优化过程,通过自动机的状态表示源程序的不同部分,实现编译器的解析和优化功能。
Introductiontothetheoryofcomputation课程设计

Introduction to the Theory of Computation 课程设计一、课程介绍计算机科学中的基础课程之一是自动机理论,它是算法和编程语言设计的基础。
一种能够处理自动机模型的工具是正则表达式,可以用于文本搜索和验证输入的正确性。
本课程探讨自动机模型和正则表达式的基础,并向同学介绍扩展的自动机模型和编译器的数据结构。
本课程是一门面向计算机科学专业的本科课程,全球的计算机科学相关专业都包括这一课程。
本课程要求学生掌握正则表达式和自动机,以及它们在计算机科学中的应用。
二、主要内容本课程的主要内容包括:1. Automata(自动机)自动机是检测、接受和处理诸如自然语言、计算机程序和网络协议等输入的最常用模型之一。
本课程会介绍有限自动机和正则表达式的概念和应用,以及用于对自然语言进行识别和处理的有限状态机。
2. Regular Expressions(正则表达式)正则表达式是描述字符串模式的计算机语言,其主要用途是在文本编辑器和字符查找功能中进行字符串匹配和替换。
本课程会讨论正则表达式在输入验证机制和编译器设计中的应用。
3. Context-free grammars(上下文无关文法)上下文无关文法是描述计算机语言的形式语言之一,它为编译器和自然语言处理提供了重要的支持。
本课程会重点介绍上下文无关文法的一些优雅且适用的应用,例如利用本文中的语法使解析器更加高效、利用上下文无关文法构建编译器的结果优化策略。
4. Finite-State Transducers(有限状态转换器)有限状态转换器是自动机的扩展模型,主要用于在计算机科学中语言处理领域的翻译、翻译活动和语音识别等方面的开发。
本课程会介绍有限状态转换器的概念和应用。
5. Compiler Data Structures(编译器数据结构)编译器数据结构是与编译过程相关的数据结构,例如符号表、语法分析树和中间代码。
本课程会介绍编译器中常用的特定数据结构,例如词法分析器和解析器。
正规文法与有限自动机的相互转换.

正规文法与有限自动机的相互转换二零一五年十二月二十七日目录摘要 (1)关键词 (1)1课题综述 (1)1.1目的 (1)1.2设计内容 (1)1.3设计原则 (1)2系统分析 (2)2.1正规式 (2)2.2有限自动机(有穷自动机) (2)2.3NFA向DFA的转换 (3)2.4正规式与有限自动机之间的转换 (3)3系统设计 (4)3.1从正规文法到有限自动机 (4)3.11正规文法到有限自动机的等价性证明 (4)3.12 正规文法到有限自动机的构造方法 (5)3.2从有限自动机到正规文法 (6)3.21 有限自动机到正规文法的等价性证明 (6)3.22 有限自动机到正规文法的构造方法 (7)4 运行与测试 (7)总结 (9)参考文献 (9)附录 (10)摘要:正规文法包括左线性文法和右线性文法。
由于正规文法和正规表达式在描述语言的能力上是等价的,而正规表达式和有限自动机在描述语言的能力上也是等价的,因此,正规文法和有限自动机之间也存在着等价性。
通常,对于正规文法G和有限自动机M,G所定义的语言记作L(G),M所能识别的语言记作L(M),如果有L(G)=L(M),则称G和M是等价的。
关键词:正规文法;有限自动机;等价性;构造方法1课题综述1.1目的1.理解正规文法与有限自动机(FA)的本质联系;2.掌握正规文法与有限自动机之间相互转化的算法原理;3.学会使用Visual C++等编程工具实现正规文法与有限自动机之间的相互转化;1.2设计内容使用Visual C++/Visual C#等工具,设计软件MySoft_3,可以实现以下功能:1.根据用户输入的文本文件(*.txt)的名称,打开文件,并从文件中获取文法的产生式、非终结符、终结符、开始符等基本信息;2.判断该文法是否为正规文法,若是,则将其转化为有限自动机;3.根据用户输入的文本文件(*.txt)的名称,打开文件,并从文件中获取有限自动机的状态集、字母表、初态、终态集、转移函数等基本信息;4.判断该自动机是否合法,若合法,则将其转化为正规文法;1.3设计原则正规文法与有穷自动机有着特殊的关系,采用下面的规则可从正规文法G直接构造一个有穷自动机NFA M;使得L(M)=L(G):(1)M的字母表与G的终结符相同;(2)为G中的每一个非终结符生成M的一个状态,G的开始符S是开始状态;(3)增加一个新状态Z,作为NFA的终态;(4)对G中的形如A->tB的规则(其中T为终结符或,A为非终结符的产生式),构造M的一个转换函数f(A,t)=B;(5)对G中形如A->t的产生式,构造M的一个转换函数f(A,t)=Z。
编译原理2.2自动机理论

contents
目录
• 自动机概述 • 有限自动机 • 正则文法和正则表达式 • 确定有限自动机(DFA) • 非确定有限自动机(NFA)
01 自动机概述
定义与分类
定义
自动机是一个抽象的机器,用于模拟有限状态系统的行为。它由一组状态、一 组输入符号和一组转移函数组成,根据输入符号和当前状态来决定下一个状态。
正则文法与正则表达式的转换
正则文法转换为状态机
通过构造一个状态机来描述正则文法的语言,状态机中的每个状态对应一个产生式,状态之间的转移 对应于产生式的应用。
正则表达式转换为状态机
将正则表达式转换为状态机的方法包括确定化和非确定化两种。确定化是将一个不确定的状态机转换 为确定的状态机,非确定化是将一个确定的状态机转换为不确定的状态机。
工具辅助
使用自动机生成工具或编译器工具集中的工 具,如Lex或Yacc等,根据语言规范生成 DFA。
DFA的应用实例
词法分析
01
DFA可以用于实现词法分析器,将输入的字符串分割成一个个
单词或符号。
正则表达式匹配
02
DFA可以用于实现正则表达式匹配算法,判断一个字符串是否
符合正则表达式的模式。
语法分析
正则表达式的应用实例
1 2
文本匹配
正则表达式可以用来匹配文本中的特定模式,例 如查找字符串中的数字、邮箱地址等。
文本替换
正则表达式可以用来替换文本中的特定模式,例 如将字符串中的所有数字替换为特定字符。
3
文本解析
正则表达式可以用来解析文本中的结构化数据, 例如从CSV文件中提取数据。
04 确定有限自动机(DFA)
正则文法的性质
离散文学名词解释

离散文学名词解释离散文学是一种数学分支,经常与计算机科学和信息论有关,用于研究离散对象如符号字符串,单词和文本等的数学分析。
离散文学名词如下:1. 符号:在离散文学中,符号是一个基本概念。
符号可以是一个字母、汉字、数学符号或任何其他字符。
符号可以是有限的或无限的,但排序规则通常基于ASCII或Unicode等标准。
2. 串:在离散文学中,串是由符号构成的序列,可以是有限的或无限的。
串可以是单词、句子或整个文本。
在计算机科学中,串通常用来代表文本数据。
3. 语言:在离散文学中,语言是一个串的集合。
它描述了所有可能出现的串,可以是有限的或无限的。
语言可以是正则的、上下文无关的或可分类的。
在计算机科学中,语言通常用来定义编程语言或正则表达式等。
4. 自动机:在离散文学中,自动机是一种抽象的计算模型。
它可以接受或拒绝匹配给定语言的串。
自动机可以是有限状态自动机(FSM)、栈自动机(PDA)或线性有界自动机(LBA)。
每个自动机都有一个状态转换图,描述了如何从一个状态转移到另一个状态。
5. 正则表达式:在离散文学中,正则表达式是一种表示语言的通用符号。
它描述了语言中所有可能出现的串。
正则表达式可以用基本操作符如“*”、“+”、“|”等表示。
使用正则表达式,可以检查字符串是否符合特定的形式,例如电子邮件地址、电话号码等。
6. 图论:在离散文学中,图论是一种研究图的性质和结构的数学学科。
它可以用于研究自动机、字符串匹配等离散系统。
图论可以描述图中节点、边和路径等属性,如最短路径、最小生成树等。
7. 编码论:在离散文学中,编码论是一种研究数据传输和存储中如何优化信息传递的学科。
编码论可以用来研究压缩算法、错误纠正码等技术。
8. 算法:在离散文学中,算法是一种用于解决离散问题的计算过程。
算法可以描述自动机匹配、字符串搜索、编码解码等技术。
算法的目标是解决离散问题并最小化计算时间和空间需求。
9. 信息论:在离散文学中,信息论是一种研究信息传输和存储的理论。
正规式与有限自动机

正规式与有限自动机正规式与有限自动机之间的转换1)有限自动机转换为正规式对于S上的NFAA/,可以构造一个S上的正规式/?,使得切⑷。
拓广状态转换图的概念,令每条弧可用一个正规式作标记。
为S上的NFA Af构造相应的正规式及,分为如下两步。
(1)在M的状态转换图中加两个节点,一个x节点,一个y节点。
从x节点到NFAM 的初始状态节点引一条弧并用e标记,从NFAM的所有终态节点到y节点引一条弧并用e 标记。
形成一个与A/等价的MS AT只有一个初态jc和一个终态少。
(2)按下面的方法逐步消去中除x和;;的所有节点。
在消除节点的过程中,用正规式来标记弧,最后节点jc和;;之间弧上的标记就是所求的正规式。
消除节点的规则如图2-12所示。
2)正规式转换为有限自动机同样地,对于S上的每个正规式/?,可以构造一个S上的NFAAf,使得L(A0=Z(及)。
(1)对于正规式i,可用图>13所示的拓广状态图表示。
R o(1)通过对正规式/?进行分裂并加入新的节点,逐步把图转变成每条弧上的标记是E上的一个字符或e,转换规则如图2-14所示。
最后所得的图即为一个NFAM,JC为初态节点,少为终态节点。
显然,L(A0=I(及)。
【试题2-24】2011年11月真题48下图所示为一个有限自动机(其中,A是初态、C是终态),该自动机识别的语言可用正规式(48)表示。
A. (0|1)*01B. 1*0*10*1C. 1*(0)*01D. 1*(0|10)*1*分析:在正规式中,符号*表示重复若干次(包括0次),符号|表示“或”。
在状态A,可以输入1或0,如果输入1还可以回到状态A,如果输入0直接到达状态B;在状态B,可以输入0或1,如果输入0则还回到状态B,而输入1,则进入到状态C;在状态C可以输入0或1,输入0到达状态B,输入1到达状态A,但由于C是终态,自动机可识别的语言是由0、1构成的字符串的集合,但该集合必须以01结果,因此选项A正确。
lect3-lexical-2(3)

北京大学信息科学技术学院2015年春季学期《编译技术》第3章词法分析(2)Lexical Analysis【对应教材 3.3- 3.5】取下一个Token符号表语法分析器词法分析器上节内容回顾☐词法分析器的作用Token(词法单元)源程序☐词法单元的描述方法⏹ 字母表、符号串和语言⏹正则集合、正则表达式和正则定义Review Questions☐写一个正则表达式,表示所有能被5整除的十进制数。
☐写一个正则表达式,表示所有能被5整除的不包含前导0的十进制数。
☐写一个正则表达式,表示所有能被5整除的二进制数。
☐词法分析器的作用☐词法单元的规约⏹串和语言;正则表达式、正则定义☐词法单元的识别☐词法分析器生成工具—LEX☐有限自动机(Finite Automata)☐正则表达式到有限自动机☐词法分析器生成工具的设计☐一般有两种方式:⏹借助状态转换图(有限自动机的图形表示)手工构造词法分析器。
⏹通过LEX自动生成词法分析器。
正则表达式⇒ NFA⇒ DFA⇒ minDFA⇒词法分析器☐状态转换图(transition diagram)⏹状态(state):表示在识别词素时可能出现的情况状态看作是已处理部分的总结某些状态为接受状态或最终状态,表明已找到词素加上*的接受状态表示最后读入的符号不在词素中 ☐开始状态(初始状态):用“开始”边表示⏹边(edge):从一个状态指向另一个状态;边的标号是一个或多个符号当前符号为s,下一个输入符号为a,就沿着从s离开,标号为a的边到达下一个状态= 2r 1> 3<other *开始40 =>5 return(relop, EQ)= other 768 *eturn(relop, LE) return(relop, NE) return(relop, LT)return(relop, GE) return(relop, GT)letter或digit开始letter other *11 return(getToken(), installId( ))9 10number → digit+ (.digit+)? (E (+ | -)? digit+)?digit Edigitdigitdigit开始12 digit13.14digit15E+/-16digit17 18other other other*19开始20delim21other*22delimdelim → blank | tab | newline ws → delim +北京大学信息科学技术学院手动编写词法分析程序:以relop 为例TOKEN getRelop ( ){ TOKEN retToken = new ( RELOP ) ;while ( 1 ) { /* 反复读入字符,直到return 或 遇到错误 */switch (state) {case 0 : c = nextChar ( ) ;if ( c == ' < ' ) state = 1 ; else if ( c == ' = ' ) state = 5 ; else if ( c == ' > ' ) state = 6 ; else fail ( ) ; /* 非关系算符 */ break ;case 1 : …… …… 2 =return(relop, LE) case 8 : retract ( ); retToken.attribute = GT; return (retToken); 开始1> < other3 return(relop, NE)4 * return(relop, LT)} 0= } >5 return(relop, EQ)} 2015年春季学期 《编译技术》课程= 6 other 7 return(relop, GE)8* return(relop 1, G 1T)首先通过正则表达式来描述词法单元的模式 基本目标:判断一个串s是否属于一个正则表达式R表示的语言s∈L(R)在现实中,还要能够连续识别多个不同类别的词法单元if (a == b) …(1)分别为每一类词法单元写出正则表达式R i(2)构造一个正则表达式R来匹配所有的词法单元R = R1 | R2 | … | R k(3)设输入为x1x2…x n, 对1≤i≤n,检查是否x1…x i∈L(R)(4)如果匹配成功,则存在j,使得x1…x i∈L(R j)(5)把x1…x i从输入中移走,继续执行(3)如何确定匹配的长度?有可能多个前缀都可以产生匹配解决办法:匹配最长可能的串选择哪个正则表达式来匹配?有可能多个正则表达式都可以匹配解决办法:排在前面的正则表达式优先匹配如果所有正则表达式都不能匹配怎么办?怎么报错?解决办法:可以构造一个ERROR正则表达式,放到所有表达式在后面,用来报告错误信息14Quiz:选择题使用如下的词法描述,在识别字符串“dictatorial” 的过程中会如何进行分割?dict (1)dictator (2)[a-z]* (3)dictatorial (4)a)4b)3c) 1, 3d) 2, 3内容提要词法分析器的作用词法单元的规约串和语言;正则表达式、正则定义 词法单元的识别☐词法分析器生成工具—LEX 有限自动机(Finite Automata)正则表达式到有限自动机词法分析器生成工具的设计Lex 简介Lex 是一种词法分析程序的自动构造工具。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二部分正规语言和有限自动机语言往往是无限集,但描述的方法往往是有限的,一种方法是描述如何通过字符串操作由简单的字符串产生整个语言,或者描述如何通过集合操作由简单语言产生复杂语言。
另一种方法是描述识别字符串是否属于某个语言的机制,也就是描述一个算法过程。
本书考察的最简单的语言类是正规语言,正规语言能够通过应用有限次的某个标准操作从一元语言产生。
正规语言能够被有限自动机识别,有限自动机是空间严格受限的简单机器。
在第二部分,我们还考察正规语言的另外一些特点:1)导出将一种语言的描述翻译成另一种语言的描述的算法;2)使用形式化方法描述语言;3)正规语言在实际中的应用。
3 正则表达式和有限自动机3.1 正则语言和正则表达式注意:regular language和regular expression有时也翻译成正规语言和正规表达式。
正则语言可以从非常简单的表达式得到,初始语言的字符串为空或单字母,仅使用合并、连接和K leene连接运算,因此正则语言可用一个清楚的表达式描述,通常用小括号()代替大括号{},+代替⋃,称为正则表达式。
下面是一些定义在字母表{0, 1}上的正则表达式,通过这些例子,能够感受到书写正则表达式的一些规律。
语言相应的正则表达式{Λ} Λ{0} 0{001}或{0}{0}{1} 001{0, 1}或{0}⋃{1} 0+1{0, 10}或{0}⋃{10} 0+10{1, Λ}{001} (1+Λ)001{110}*{0, 1} (110)*(0+1){1}*{10} 1*10{10, 111, 11010}* (10+111+11010)*{0, 10}*({11}*⋃{001, Λ}) (0+10)*((11)*+001+Λ)我们认为正则表达式表示的是相应语言的“最典型的字符串”,比如,1*10表示一个字符串,它以10结束,前面可以有任意多个数目的1。
我们在前面将正则语言描述成:在最简单的语言上仅仅使用三种运算合并、连接、Kleene 连接所得到的语言。
这种描述预示了正则语言的递归定义(参见2.4节)。
下面递归定义不仅定义了语言,而且定义了正则表达式。
定义3.1 字母表∑上正则语言类R,及其相应的正则表达式定义如下:1.空集φ(即空语言)是正则语言,表达式是φ。
2.{Λ}仅有空串的语言是正则语言,表达式是Λ。
3.每个a∈∑,{a}是正则语言,表达式是a。
4.如果L1和L2是正则语言,表达式是r1和r2,则(a)L1⋃L2是正则语言,表达式是r1+r2。
(b)L1L2是正则语言,表达式是r1r2。
(c)L1*是正则语言,表达式是r1*。
只有应用上面4条规则产生的语言才是字母表∑上的正则语言。
对上面的解释做些解释。
为了保持一致性和连贯性,空语言被认为是正则语言。
后面许多地方将提到这样的说法:对于每个…,都对应一个正则语言。
如果空语言不属于正则语言,那么每个这样的说法还需要排除空语言这种特殊情况,带来不简洁的说法。
为了书写简洁,省去大量的括号,我们规定正则表达式中运算符的优先级次序是K leene*、连接、合并。
同时我们借用一些代数表达式的符号,如指数幂等。
原表达式简洁表达式(rr) r2(a+((b*)c)) a+b*c((r*)r) r+同样借助代数学的记号,两个表示不同语言的正则表达式可以使用符号≠,比如:(a + b)* ≠ a + b*我们还可以借用符号=来化简正则表达式,如正则表达式的化简1*(1+Λ) = 1*1*1* = 1*0* + 1* = 1* + 0*(0*1*)* = (0+1)*(0+1)*01(0+1)*+1*0*=(0+1)*其中一些化简用到的规则可以从集合运算规则得到,但另有一些是字符串运算特有的,目前我们还没有发现这种化简的系统的方法(或形式化方法),但上面的例子预示了化简的巨大作用。
比如最后一行的例子,两个看似很复杂的语言,它们的并集却很简单。
问题:存不存在化简正则表达式的形式化方法(既是否存在化简正则表达式的通用算法)?是否存在最简洁的正则表达式?朱洪来信:我的印象中,它是NP-完全的问题。
Please look at Garey and Johnson's book: computer and intractibility.例子3.1 语言L⊆{0, 1}*,由所有长度为偶数的字符串组成,(由于0是偶数,因此空串Λ属于L),问:L是否是正则语言?如果是,L对应的正则表达式是什么?解答:任何一个偶数长度的字符串都由多个(或0个)长度为2的字符串连接而成,而字母表{0, 1}上的长度为2的字符串只可能是4个:00、01、10、11,因此L可定义如下:L={00, 01, 10, 11}*它的正则表达式是:(00+01+10+11)*或((0+1)(0+1))*。
例子3.2 L是定义在字母表{0, 1}上的包含奇数个1的字符串组成的语言,问L的正则表达式是什么?解答:显然L中的字符串至少有一个1,因此一定有这样的前缀0i10j,其后则有偶数个(或0个)1,因此可分解成多组10m10n的形式。
由此得到L的正则表达式:包含奇数个1的字符串组成的语言错误的表达式有:(10*10*)*10*例子3.3 L是字母表{0, 1}上所有长度小于等于6的字符串组成的语言,问L的正则表达式?解答:由于L中的元素是有限的,最简单的方法是枚举法:Λ+0+1+00+01+…+111110+111111而表示长度为n的字符串组成的语言的表达式是:(0+1)(0+1)…(0+1)=(0+1)n因此一些简洁的表达式如下:所有长度小于等于6的字符串组成的语言Λ+(0+1)+(0+1)(0+1)+…+(0+1)(0+1)(0+1) (0+1)(0+1)(0+1)Λ+(0+1)+(0+1)2+…+(0+1)6(Λ+0+1)6例子3.4 L={x以1结束且不包含子串00 | x∈{0, 1}*},问L的正则表达式?解答:字符串不包含00,则说明其中的每个0不能后接0,而且0不能是串尾字母,因此每个0后面必定是1,既符合条件的字符串包含大量的01片断,其间是许多1,因此初步得到的表达式是:(1+01)*但空串不符合条件,修正得到:(1+01)*(1+01)=(1+01)+注意:(1+01)*1不对,漏掉了01情况。
例子3.5 C语言的标志符的组成的语言的正则表达式。
解答:C语言的标志符由3种符号组成:英文字母、数字和下划线。
而且第一个字符只能是字母或下划线。
因此:(a+b+…+z+A+B+…+Z+_)( a+b+…+z+A+B+…+Z+0+1+…+9+_)*我们令l是表示字母的集合,d是表示数字的集合,即:l = a+b+…+z+A+B+…+Zd = 0+1+…+9则上式的简洁表达式是:(l+_)(l+d+_)*例子3.6 (暂空)3.2 识别语言所需要的空间语言的识别(或字符串的识别,recognize)问题是一个成员资格判定问题,即判定一个任意给定的字符串是否属于某个语言。
为了以后讨论问题的方便,给出一些约定。
首先限制成从左至右的一次扫描(这简化了整个识别过程中应该记住的信息总量的讨论,也利于根据每步记住的信息量多少对语言分类),其次判别对象是一个特定的字符串。
除了扫描完成后,给出最后的判别(是或否),在每一步也给出假设判别,当前的假设判别反映了已扫描的前缀的情况。
最后的判别可以看成最后的、最新的假设判别。
先看看人是怎么完成识别任务,然后设计自动机完成这项任务。
问题是,为了给出假设判别,我们应该记住多少前缀信息。
这里有两种极端的情况:1)记住所有的前缀2)什么也不记忆。
在某些情况下,我们确实可以什么也不记,如判别语言φ和∑*,前者我们忽略每步输入,一律回答“否”;后者则一律回答“是”。
但多数情况下,我们必须记住一些信息,应该记住的不是字符串本身,而是字符串表达的判别信息。
称为有限自动机的原因是所需的空间是有限的。
比如分别输入两个字符串x和y,得到不同的答案。
这说明我们一定记住了一些不同的信息当分别输入x和y时,否则我们无法区别这两个字符串,因此通常情况下,为了识别某个语言,我们必须记住一些信息,而记住这些信息则需要一定的空间。
例子3.7 语言L定义在字母表{0, 1}上,由以10结尾的字符串组成。
分析:显然判定(decision)一个字符串是否属于语言L,只需要考察该字符串的最后两个字符,因此在字符串输入识别过程中,只需要记住当前最后的两个字符,而之前的所有字符可以忽略。
字母表{0, 1}上的两个字符组成的字符串只有4种,因此本例所需空间为4个单位,当然后面会看到还可进一步减少记住的信息,从而节省空间。
例子3.8语言L定义在字母表{0, 1}上,由包含偶数个0和奇数个1的字符串组成。
分析:显然,整个输入过程中,不需要记住输入的字符串的具体内容,一种方法是记住当前输入的0和1的个数,更简单的方法是记住当前输入的0和1的个数的奇偶性,而这只有4种可能,因此本例的判定过程所需空间是4个单位。
(参见图3-1,77页)例子3.9 语言L={x以1结束且不包含子串00 | x∈{0, 1}*}(参见例子3.4)分析:假设在当前输入的字符串中发现了00子串,则我们只需要记住这个事实,不管前面已经读过和后面将输入的字符串是什么,能够肯定该字符串不属于L,不妨将这种情况记为N。
再考虑另两种情况,情况0是最后一个字符是0,情况1是最后一个字符是1。
出现情况0时,如果又看到一个0,则转到情况N,而情况0和情况1时看到1都转到情况1,情况1时看到0转到情况0。
这三种情况能够判定所有非空的字符串了,为了判定空字符串,还需要增加一个特殊的情况。
显然所有的情况都专注于记住最后一个字符,和是否出现或有可能出现00子串。
本例需要的空间是4个单位,参见图3-1。
将例子3.8和3.9的讨论用一个图(图3-1)来总结,它像一个流程图,或展示了我们上面判定过程的算法。
图中每个圆表示一种情况,是我们需要记住的关键信息,因此圆的多少表示了记住信息的多少,也表示了判定过程中需要的总的空间的多少。
每个图中有一个起始的圆(由一个没有源的箭头指示),输入的字符串从起始圆开始,沿着箭头流动(转移)到下一个圆,每一次流动消耗一个字符,当字符消耗完(即读完所有字符),所停在的圆揭示了输入字符串与图表示的语言的关系,如果圆是双圈,则说明该字符串被接受,或属于这个语言,否则不属于这个语言。
有了这样的图后,任何人或机器不用理解图中每个节点的具体含义,只要按照上面描述的机械的步骤动作,就能完成字符串的判定工作,因此刻画了一种“抽象机”,我们不关心这种机器的实现细节,比如它的驱动动力来自什么,它表示接受的具体信号是什么?我们关心的是它所揭示的一种形式化的过程(或算法),我们称它为自动机。