精华内容
下载资源
问答
  • 大学课程中编译原理课程的正则表达式章节中关于正则表达式的理解和应用,使用Java GUI进行编写,主要包括了各种主要的正则匹配和正则使用
  • 精品文档 正则表达式 Regular expressions 也称为 REs 或 regexes 或 regex patterns 本质上是一个微 小的且高度专业化的编程语言它被嵌入到 Python 中并通过 re 模块提供给程序猿使用使用正则表 达式你需要指定一些...
  • 做词法分析器正则表达式的题,有没有什么技巧啊。怎么我每次写正则表达式,不是思考少了情况,要么就是写的答案 离正确的太远。好迷茫
  • 在lex程序中,如何写一个正则表达式过滤掉注释并统计行数 注释形式如下: /* .......*/ 注意这种注释可能分成多行! 求大神
  • 编译原理课的大作业 包含三个小实验 在一个cpp文件里 正则表达式转换为nfa nfa转换为dfa dfa最小化 个人原创代码
  • Java 程序设计: 为 UnLinker.java 文件中的 UnLinker 类实现成员函数 String clean(String text)。 函数 clean 的功能是:屏蔽字符串参数 text 中的网页链接信息,并返回屏蔽后的结果; 如果无需屏蔽,则返回原来的...
  • 编译原理-确定有穷自动机(DFA)化简(最小化) 预备 最简化的DFA:这个DFA没有多余状态、也没有两个相互等价的状态。一个DFA可以通过消除无用状态、合并等价状态而转换成一个与之等价的最小状态的有穷自动机。 无用...

    1. 编译原理-确定有穷自动机(DFA)化简(最小化)

    预备

    最简化的DFA:这个DFA没有多余状态、也没有两个相互等价的状态。一个DFA可以通过消除无用状态、合并等价状态而转换成一个与之等价的最小状态的有穷自动机。
    无用状态:从自动机开始状态出发,任何输入串也发到达的那个状态,或者这个状态没有通路可达终态。
    等价转态:两个状态,识别相同的串,结果都同为正确或错误,这两个状态就是等价的。
    区别状态:不是等价状态。

    化简DFA

    分割法:

    把一个DFA(不含多余状态)的状态分割成一些不相交的子集,并且任意两个子集之间的状态都是可区别状态,同一子集内部的状态都是等价状态。

    步骤(按分割法)

    • I0 = 非状态元素构成的集合,I1 = 终态元素构成的集合
    • 经过多次划分后,要保证,任意一个Ik中的元素通过move(Ik,某个字符)的结果都同属于一个Iz,这时候划分完成。否则把状态不同的单独划分出去。
    • 重复上一步,直至没有新的I子集增加。
    • 从子集中任选一个代替整体,画出最简DFA。

    例1. 将下图DFA M最小化

    在这里插入图片描述

    分割成I0,I1

    I0 = {1,2,3,4} ; 非终态
    
    I1 = {5,6,7} ; 终态
    

    检验I0中元素的等价性,不等价就分割

    move(1,a) = 6 ∈I1
    
    move(1,b) = 3 ∈I0
    
    move(2,a) = 7 ∈I1
    
    move(2,b) = 3 ∈I0
    
    move(3,a) = 1 ∈I0
    
    move(3,b) = 5 ∈I1
    
    move(4,a) = 4 ∈I0
    
    move(4,b) = 6 ∈I1
    
    可以发现,{1,2}是等价的,{3,4}是等价的
    

    所以现在分割成了:I2 = {1,2}, I1 = {5,6,7}, I3 = {3,4}

    检测I2中元素的等价性,不等价就分割

    move(1,a) = 6 ∈I1
    
    move(1,b) = 3 ∈I3
    
    move(2,a) = 7 ∈I1
    
    move(2,b) = 3 ∈I3
    
    可以发现,是等价的,不用分割
    

    检测I3中元素的等价性,不等价就分割

    move(3,a) = 1 ∈I2
    
    move(3,b) = 5 ∈I1
    
    move(4,a) = 4 ∈I3
    
    move(4,b) = 6 ∈I1
    可以发现,不是等价的,分割成{3},{4}
    

    所以现在分割成了:I2 = {1,2}, I1 = {5,6,7}, I4 = {3}, I5 = {4}

    检测I1中元素的等价性,不等价就分割

    move(5,a)  = 7 ∈ I1
    move(5,b)  = 3 ∈ I4
    
    move(6,a)  = 4 ∈ I5
    move(6,b)  = 1 ∈ I2
    
    move(7,a)  = 4 ∈ I5
    move(7,b)  = 2 ∈ I2
    
    可以发现,不是等价的,分割成{6,7}, {5}
    

    所以现在分割成了:I2 = {1,2}, I4 = {3}, I5 = {4}, I6 = {5},I7 = {6,7}

    检测后发现,不可再分割,所以最终分割结果就是:I2 = {1,2}, I4 = {3}, I5 = {4}, I6 = {5},I7 = {6,7}

    画转态转换图:从集合中选取一个代表就可以
    在这里插入图片描述

    例题2 编译原理作业题

    构造一个DFA,它接受Σ = {0,1}上能被5整除的二进制数。另老师还要求写出能被5整除的二进制串的正规式。

    解析:

    首先分析题目可知,一个数除以5,其余数(十进制)只能是0,1,2,3,4五种,因此我们以0,1,2,3,4分别表示这五种状态。因为要求得能被5整除的数,0 mod 5=0满足要求,故状态0既为初始状态,又为终结状态。

    接着,考虑二进制数在其串后增添0或1时,状态的转化情况。在二进制串后添1位,即可理解为将先前的串值乘以二再加上所添的数值。那么,串尾添数后新的数值模5的余数便可以计算出来。即可以得到添0或1后的新的状态。

    下面根据分析列出状态转换表:

    状态 添0 添1
    0 0 1
    1 2 3
    2 4 0
    3 1 2
    4 3 4

    根据状态转换表,可以绘制出DFA如下图所示:

    的

    再根据上面的DFA可以得出正规式如下:

    {1 [ ((00|1)(01)*01*0)* (0|11) (01)* ] 1}* 0*

    展开全文
  • 最近学习编译原理,要用到正则表达式。本次要学习怎样用java正则表达式正则表达式:可以用来搜索、编辑、处理文本。简书:类库介绍是一个用正则表达式所订制的方式来对字符串进行匹配工作的泛型包。其主要包括三个...

    544a3c4c6f34b714945342c1861b522a.png

    最近学习编译原理,要用到正则表达式。本次要学习怎样用java正则表达式。正则表达式:可以用来搜索、编辑、处理文本。

    简书:

    类库

    介绍

    是一个用正则表达式所订制的方式来对字符串进行匹配工作的泛型包。其主要包括三个类:

    Pattern类(编译)

    Matcher类(解释与匹配)

    PatternSyntaxException类(异常)

    总的流程需要是这种:首先Pattern实例定制了一个正则表达式经编译后的方式,然后一个Matcher实例在这个Pattern实例的方式下进行字符串的匹配工作。下面将逐一击破!根据实际的事例来预测吧!假设目前我有这串文字:

    "我的QQ是:123456我的电话是:10010我的学号是:2016210000"

    现在我想使电脑帮我提取以上的所有数字,那能怎么办?如果没学过正则表达式,提取是非常复杂的!结尾告诉你怎么做!先来学学java的正则表达式的相关变量。

    1.Pattern.split(CharSequence input)用于字符串分割我想电脑自动给我借助数字分割各个别这里应该使用到正则表达式代表的含义是:匹配字符串的每个地方的所有数字首先,可以借助方法建立一个正则表达式对象,然后借助分割。

    可以看出通过数字分割出三个部分(不管你是哪个数字)2.Pattern.matches(String regex,CharSequence input)用于匹配到一次即中止,如果匹配了全部字符串返回true,否则返回false

    可以看出匹配完返回true,没匹配完返回false。3.Pattern.matcher(CharSequence input)Pattern只能做简单的匹配操作,要想得到更强的匹配操作,得结合matcher类

    Patternp=Pattern.compile(reg);

    Matcherm=p.matcher(text);

    通过以上方法可以形成出matcher类4. matcher下的方式①matches()对整个字符进行匹配,只有整个匹配才返回true

    Patternp=Pattern.compile("\\d+");

    Matcherm=p.matcher("22bb23");

    System.out.println(m.matches());

    //false

    Matcherm2=p.matcher("2223");

    System.out.println(m2.matches());

    //true

    ②lookingAt() 对上面的字符进行匹配,只有匹配到的字符串在上面才返回true

    1a9bcf29c03b2a86cd74cb6c5e993b36.png

    Patternp=Pattern.compile("\\d+");

    Matcherm=p.matcher("22bb23");

    System.out.println(m.lookingAt());

    //true

    Matcherm2=p.matcher("aa2223");

    System.out.println(m2.lookingAt());

    //false

    ③find() 对数组串匹配java 正则表达式 版本号,找到就返回true,找不到就返回false(只遍历到第一个)

    Patternp=Pattern.compile("\\d+");

    Matcherm=p.matcher("22bb23");

    System.out.println(m.find());

    //true

    Matcherm2=p.matcher("aa2223");

    System.out.println(m2.find());

    //true

    Matcherm3=p.matcher("aa2223bb");

    System.out.println(m3.find());

    //true

    Matcherm4=p.matcher("aabb");

    System.out.println(m4.find());

    //false

    当matches、lookingAt、find执行匹配后,就可以运用下面三种得到最具体的信息。④start()返回匹配到子字符串中的初始位置

    Patternp=Pattern.compile("\\d+");

    Matcherm=p.matcher("aa22bb23");

    System.out.println(m.find());

    397a26a416286db2ed2089fc315a9dc9.png

    //返回true

    System.out.println("position:"+m.start());

    //索引到的初始位置为2

    ⑤end()返回匹配到子字符串的最后一个位置

    Patternp=Pattern.compile("\\d+");

    Matcherm=p.matcher("aa22bb23");

    System.out.println(m.find());

    //返回true

    System.out.println("position:"+m.end());

    //索引到的结束位置为4

    ⑥group()返回匹配到的子字符串

    Patternp=Pattern.compile("\\d+");

    Matcherm=p.matcher("aa22bb23");

    System.out.println(m.find());

    //返回true

    System.out.println("text:"+m.group());

    //子字符串为22

    注意:这些方式的调用是有先后排序!这里再介绍一个 groupCount()方法,返回表达式有多少组。不是匹配到的组,是表达式匹配的组,有多少括号就有多少组。

    Patternp=Pattern.compile("([a-z]+)(\\d+)");

    Matcherm=p.matcher("a2223a");

    System.out.println("groupCount1:"+m.groupCount());

    //返回2

    Patternp2=Pattern.compile("(\\d+)");

    Matcherm2=p2.matcher("a2223a");

    System.out.println("groupCount2:"+m2.groupCount());

    3710fb7b695fa0490e9eeabad65ab615.gif

    //返回1

    Patternp3=Pattern.compile("(([a-z]+)(\\d+))");

    Matcherm3=p3.matcher("a2223a");

    System.out.println("groupCount3:"+m3.groupCount());

    //返回3

    其实start()、end()、group()均有重构方法start(int i),end(int i),group(int i) 专用于分组操作start(int i)

    Patternp=Pattern.compile("([a-z]+)(\\d+)");

    Matcherm=p.matcher("123aa2223ccc123dd");

    intcount=;

    while(m.find()) {

    count++;

    System.out.println("第"+count+"次的start:"+m.start());

    //匹配到的文本的索引

    System.out.println("第"+count+"次的start(0):"+m.start());

    //默认为匹配到整个文本的索引

    System.out.println("第"+count+"次的start(1):"+m.start(1));

    //默认为匹配到的文本的第一组的索引

    System.out.println("第"+count+"次的start(2):"+m.start(2));

    //默认为匹配到的文本的第二组的索引

    }

    end(int i)与start一样就不写了group(int i)

    Patternp=Pattern.compile("([a-z]+)(\\d+)");

    Matcherm=p.matcher("a2223ccc123");

    intcount=;

    while(m.find()) {

    c6bddeaa823e84eb9756f5195e63fd28.png

    count++;

    System.out.println("第"+count+"次的group:"+m.group());

    //默认为匹配到的文本

    System.out.println("第"+count+"次的group(0):"+m.group());

    //默认为匹配到的整个文本

    System.out.println("第"+count+"次的group(1):"+m.group(1));

    //默认为匹配到的文本的第一组

    System.out.println("第"+count+"次的group(2):"+m.group(2));

    //默认为匹配到的文本的第二组

    }

    由以上的结果可以看出重构函数的i指的是表达式的组号,i为0默认为全局java 正则表达式 版本号,i为1为第一个,后面同理。使用知道完以上的函数,回到前面,要实现提取一串文字的所有数字可以如何用呢?

    Stringreg="\\d+";

    Stringtext="我的QQ是:123456我的电话是:10010我的学号是:2016210000";

    Patternp=Pattern.compile(reg);

    String[]str=p.split(text);

    Matcherm=p.matcher(text);

    intindex=;//标记

    while(m.find()) {

    System.out.print(str[index]);

    System.out.println(m.group());

    index++;

    }

    让我们来说说结果!

    结合以上的分割函数,通过数字分割,得到文字,然后再借助匹配函数,找到字符串里的所有数字,依次输出。我也可以直接获得数字放进一个数组,这样我就存储起来了。当然这是很基础的,我可以添加多几个正则表达式,可以匹配标准具体的邮件,手机号,QQ号等。

    参考链接:

    - not end -

    (我的学习笔记)

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-135744-1.html

    展开全文
  • 编译原理正则表达式

    千次阅读 2011-09-08 16:57:54
    关于正则表达式,作为软件工程师应该比较熟悉了。所谓正则表达式,就是表示字符串的格式。正则表达式r完全由它所匹配的串集来定义。这个集合称为由正则表达式生成的语言,写作L(r)。此处的语言只是表示“串的集合”...
     
    

    关于正则表达式,作为软件工程师应该比较熟悉了。所谓正则表达式,就是表示字符串的格式。正则表达式r完全由它所匹配的串集来定义。这个集合称为由正则表达式生成的语言,写作L(r)。此处的语言只是表示“串的集合”,它与程序设计语言并无特殊关系。

     

    基本的正则表达式

      正则表达式运算

        有3种基本运算:

        1. 从各选择对象中选择,用元字符|表示。比如: a|b

        2. 连结,由并置表示。比如: ab

        3. 重复或“闭包”,由元字符*表示。比如: a*

     

      运算的优先和括号的使用

        例如: a|(b(c*))

     

      正则表达式的名字

        这样为较长的正则表达式提供了一个简化的名字。例如:

        定义 digit = 0|1|2|...|9

        则序列(0|1|2|...|9) (0|1|2|...|9)*可被写作digit digit*

     

    正则表达式的拓展

      1. 一个或多个重复用元字符+表示。

      2. 任意字符用元字符.表示。

      3. 字符范围。例如[a-z]表示所有的小写字母。

      4. 不在给定集合的任意字符用元字符~表示。例如: ~(a|b|c)

      5. 可选的子表达式。

     

    通用程序设计中记号的正则表达式

      1. 数。

        nat = [0-9]+

        signedNat = (+|-)? nat

        number = signedNat ("." nat ) ? (E signedNat)?

      2. 保留字和标识符

        reserved = if | while | do | ...

        letter = [a - zA - Z]

        digit = [0 - 9]

        identifier = letter (letter | digit)*

      3. 注释

    展开全文
  • 正则文法与正则表达式的相互转化前言一、正则表达式二、正则文法1.引入库2.读入数据三、转换规则四、转换例子总结 前言 正则文法作为对单词的描述的一种方式。 除正则文法外,正则表达式也可以描述单词,正则文法和...


    前言

    在词法分析过程中,如果将每类单词都看作一种语言,则大多数单词词法可以用正则文法来描述。 除了正则文法外,正则表达式也可以相应的用来描述单词,正则文法和正则表达式的能力相同,且可以互相转化。正则表达式比正则文法更直观,有时首选正则表达式来表示正则语言。


    一、正则文法

    1.定义

    正则文法在这篇文章(编译原理-文法的定义与分类)中有所讲解,在此处再稍微讲述一遍:

    1. 正则文法G = (V,T,P,S)中,对∀α —> β∈P,α β均具有形式A —> w或A —> wB(A —> w或A —> Bw),其中A,B∈V,w∈T+。
    2. 正则文法描述T上的正则语言。

    2.例子

    例子:词法分析中标识符的文法:

    例子


    二、正则表达式

    1.定义

    定义:设∑是一个字母表,则∑上的正则表达式及其所表示的正则语言可递归地定义如下:
    ⑴ Ø是∑上的一个正则表达式,它表示空集;
    ⑵ ε是∑上的一个正则表达式,它表示语言{ε};
    ⑶ 对于∀a(a∈∑),a是∑上的一个正则表达式,它表示的正则语言是{a};
    ⑷ 假设r和s都是∑上的正则表达式,它们表示的语言分别为L®和L(s),则:

    1. ( r )也是∑上的正则表达式,它表示的语言为L( r );
    2. (r|s)也是∑上的正则表达式,它表示的语言为L( r )∪L(s);(并操作)
    3. (r•s)也是∑上的正则表达式,它表示的语言为L( r )L(s);(连接操作)
    4. (r*)也是∑上的正则表达式,它表示的语言为(L( r ))*;(克林闭包操作)

    ⑸ 使用上述规则构造的表达式是∑上的正则表达式。

    2.例子

    例子:词法分析中标识符的正则表达式表达:

    在这里插入图片描述


    三、转换规则

    1.正则文法转换为正则表达式

    在这里插入图片描述
    具体转换步骤为:

    1. 根据正则文法G构造正则表达式联立方程组。
      假设正则文法G是右线性的,其每个产生式的右部只含有一个终结符,则有如下方程式构造规则:
      在这里插入图片描述

    2. 解联立方程组,求等价的正则表达式r。
      用代入消元法逐个消去方程组中除开始符号S外的其他变量,最后即可得到关于开始符号S的解。
      代入消元规则如下:
      在这里插入图片描述

    3. 求得结果。
      如果最后得到的关于S的方程式为如下形式,
      S=α1|α2|…|αh
      则将方程式右边所有其中仍然含有语法变量的αi(1≤i≤n)删除,得到的结果就是与G等价的正则表达式。
      如果任意的αi(1≤i≤n)均含有语法变量,则Ø就是与G等价的正则表达式。

    2.正则表达式转换为正则文法

    给定正则表达式r,按如下方法构造正则定义式,并逐步将其转换成正则文法。
    引入开始符号S,从如下正则定义式开始:
    S—>r
    按如下规则将S—>r分解为新的正则定义式,在分解过程中根据需要引入新的语法变量。

    在这里插入图片描述


    四、转换例子

    1.正则文法转换为正则表达式

    在这里插入图片描述
    过程:
    在这里插入图片描述

    2.正则表达式转换为正则文法

    例1.标识符定义的转换:
    (1).引入 S
    (2).S→ (|)*
    (3).分解为
    S→ A
    A→(|)A|ε

    例2.(a|b)*a(a|b)(a|b)

    转换成正则文法:
    (1).S->Aa|Ab
    (2).A->Ba|Bb
    (3).B->Ca
    (4).C->Ca|Cb|ε


    总结

    正则表达式与正则文法等价:
    对任意一个正则文法,存在一个定义同一语言的正则表达式;
    对任意一个正则表达式,存在一个定义同一语言的正则文法。

    展开全文
  • 编译原理正则表达式转NFA

    千次阅读 2020-03-03 20:26:03
    词法分析程序实现流程 2.1 正则表达式的识别—— 2.3 正则表达式转换为NFA ——2.5 NFA到DFA转换——2.8 最小化DFA——2.9 词法分析过程
  • 要学习之前首先要了解一下正则表达式的概念: 正则表达式与正规集 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个“规则字符串”用来...
  • 一个或多个:+ 字符集范围:a|b|c 或者[a-z] 零个或一个:? 零个或多个:* 一个或多个:+ 转载于:https://www.cnblogs.com/puffmoff/p/8378100.html
  • 关于正则表达式,作为软件工程师应该比较熟悉了。所谓正则表达式,就是表示字符串的格式。正则表达式r完全由它所匹配的串集来定义。这个集合称为由正则表达式生成的语言,写作L(r)。此处的语言只是表示“串的集合”...
  • 编译原理--正则文法与正则表达式

    千次阅读 多人点赞 2019-04-01 06:59:04
    对任何正则文法G,存在定义同一语言的正则表达式r 对任何正则表达式r,存在生成同一语言的正则文法G 正则文法到正则表达式的转换 将正则文法中的每个非终结符表示成关于它的一个正则表达式方程,获得一个联立方程...
  • 2.3.1正则表达式 2.3.2正则表达式 2.3.3正则表达式
  • 正则表达式编译原理

    2012-05-08 11:14:38
    正则表达式编译原理
  • 输入一个正则表达式,输出一个NFA。 我的做法:输入一个字符串表示正则,输出则是把输出到一个.dot文件中并将dot文件编译成pdf,fedora需要sudo yum install dot,然后evince XXX.pdf就可以查看生成的NFA了。 具体...
  • 编译原理之将正则表达式变为有穷自动机 从正则表达式变为NFA 首先先看看简单的基本的正则表达式是如何对应的相关的NFA的 字母表中的符号a对应的NFA r = r1r2对应的NFA r = r1|r2对应的NFA r = (r1)*...
  • 编译原理正则表达式

    万次阅读 多人点赞 2012-07-21 21:49:07
    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习... 《编译原理》第三章习题 我们的教材是那本经典的“龙书”:《Compiler: Principles, Techniques, and Tools》 灰
  • 有关文章目录、环境搭建和一些说明请看第一篇:CS143:编译原理 | 环境搭建HelloWorld从PA2开始,CS143的编程作业正式进入写编译器环节。经过四次作业,最终将实现编译器的主要部分。本文实现Lexical Analyzer,也...
  • 概念 正则表达式 是一种用来描述正则语言的更紧凑的表示方法 比如某个语言L = {a}{a, b} * ( {ε} ∪ ( { ....正则表达式可以由较小的正则表达式按照特定规则 递归 地构建 , 每个正则表达式r 定义一个语言,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 777
精华内容 310
关键字:

编译原理正则表达式