Skip to content
HIT-CSLabHIT-CSLabHIT-CSLab
主页
关于
计算机系统
  • 软件构造
    • 第1篇
      • 第2篇
        • 第3篇
          • 第4篇
            • 第5篇
              • 老师上课给的例子
                • 可能的处理过程

                第5篇

                author iconGengcalendar icon2022年6月9日category icon
                • 软件构造
                tag icon
                • Git
                timer icon大约 2 分钟

                此页内容
                • 老师上课给的例子
                • 可能的处理过程

                # 第5篇

                在本篇随笔中,我们主要介绍:

                • 对于正则表达式的处理

                本篇随笔同步于博客园:{暂未同步}

                # 老师上课给的例子

                在上课的时候,老师给出来了一个正则表达式文法,见下:

                url ::= 'http://' hostname (':' port)? '/'
                hostname ::= word '.' hostname | word '.' word
                port ::= [0-9]+
                word ::= [a-z]+
                
                1
                2
                3
                4

                接着老师用这套文法去识别了一个字符串:http://didit.csail.mit.edu:4949/,过程如下图所示:

                上课例子

                老师说,Java在解析这个串的过程中,用到了栈结构,这让我联想到了形式语言与自动机这门课程中所讲述的文法转PDA相关知识,于是将我想的一个可能的处理过程列在下面。

                # 可能的处理过程

                1.根节点为url,此时还没有对字符串进行任何处理。

                第1步

                2.将url弹出,并将url对应的规则弹入。此时注意到,栈顶的https://字符串刚好可以和欲匹配字符串的开头匹配。

                第2步

                3.将https://弹出,此时对于欲匹配字符串来说,我们已经匹配了开头的https://了,接下来匹配剩余的部分就好。

                第3步

                4.将栈顶的hostname弹出,将其规则word '.' hostname压入栈。此时注意到,欲匹配字符串的剩余部分的开头,即didit,是可以和目前栈顶word相匹配的。

                第4步

                5.弹出word。此时注意到,欲匹配字符串的剩余部分的开头,即.,是可以和目前栈顶.相匹配的。

                第5步

                6.弹出.。

                第6步

                7.重复4~6步,可以将欲匹配字符串中的csail.也给匹配掉

                第7步

                8.将栈顶的hostname弹出,将其规则word '.' word压入栈。此时注意到,欲匹配字符串的剩余部分的开头,即mit,是可以和目前栈顶word相匹配的。

                第8步

                9.弹出word。此时注意到,欲匹配字符串的剩余部分的开头,即.,是可以和目前栈顶.相匹配的。

                第9步

                10.弹出.。此时注意到,欲匹配字符串的剩余部分的开头,即edu,是可以和目前栈顶word相匹配的。

                第10步

                11.弹出edu。此时注意到,欲匹配字符串的剩余部分的开头,即:4949,是可以和目前栈顶(':' port)?相匹配的。

                第11步

                12.弹出(':' port)?。此时注意到,欲匹配字符串的剩余部分的开头,即/,是可以和目前栈顶'/'相匹配的。

                第12步

                13.弹出'/'。此时欲匹配字符串已经匹配完了,恰好栈中刚好全空,因而匹配成功。

                第13步

                上一页
                第4篇
                念念不忘,必有回响
                Copyright © 2022 Geng