亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#詞法分析器之詞法分析的使用詳解

2020-01-24 03:23:31
字體:
來源:轉載
供稿:網友

雖然文章的標題是詞法分析,但首先還是要從編譯原理說開來。編譯原理應該很多人都聽說過,雖然不一定會有多么了解。

簡單的說,編譯原理就是研究如何進行編譯――也就如何從代碼(*.cs 文件)轉換為計算機可以執行的程序(*.exe 文件)。當然也有些語言如 JavaScript 是解釋執行的,它的代碼是直接被執行的,不需要生成可執行程序。

編譯過程是很復雜的,它涉及到很多步驟,直接拿《編譯原理》(Compilers: Principles, Techniques and Tools,紅龍書)上的圖來看:

圖 1 編譯器的各個步驟,其實是我根據書上的圖綜合了一下后畫的

這里給出了 7 個步驟(后面的優化步驟是可選的),其中前 4 個步驟是分析部分(也被稱為前端 front end),是把源程序分解為多個組成要素,并在這些要素上加上語法結構,最后把信息存放在符號表(symbol table)中。后三個步驟是綜合部分(也成為后端 back end),它們根據中間表示和符號表中的信息構造期待的目標程序。

將編譯器分為這么多步驟,其好處就是使得每個步驟更加簡單,從而使編譯器更加容易設計,也可以利用很多現有的工具――例如詞法分析器可以用 Lex 或 Flex 生成,語法分析器可以用 Yacc 或 Bison 生成,幾乎不用做太多編碼工作就能得到一顆語法樹,前端的工作也就完成的差不多了。而至于后端,也有很多現有的技術可以使用,例如現成的虛擬機(CLR 或 Java,只要翻譯成相應的 IL 就可以了)。

這個系列的文章,說的就是編譯原理的第一步:語法分析。大部分算法和理論都來自《編譯原理》,其余的部分則是自己搞出來的,或者是參考了 Flex 的實現(這里的 Flex 是指 fast lexical analyzer generator,一種著名的提供詞法分析的程序,而不是 Adobe 的 Flex)。

我會盡量完整的介紹詞法分析器的編寫過程,包括一些細節的實現。當然,目前只能根據正則表達式定義得到一個可以用來進行詞法分析的對象,要想達到 Flex 那樣直接根據詞法定義文件生成詞法分析器源代碼,還有很多工作要做,不是短期內能夠搞定的。

本篇文章作為系列的第一篇,將會對詞法分析做綜合的概述,介紹一下其中用到的技術和大致的流程。

一、詞法分析介紹

詞法分析(lexical analysis)或掃描(scanning)是編譯器的第一個步驟。詞法分析器讀入組成源程序的字符流,并且將它們組織成有意義的詞素(lexeme)的序列,并對每個詞素產生詞法單元(token)作為輸出。

簡單的來說,詞法分析就是將源程序(可以認為是一個很長的字符串)讀進來,并且“切”成小段(每一段就是一個詞法單元 token),每個單元都是有具體的意義的,例如表示某個特定的關鍵詞,或者代表一個數字。而這個詞法單元在源程序中對應的文本,就叫做“詞素”。

以計算器來舉例,12+34*9 這一段“源程序”的詞法分析過程如下所示:

圖 2 算式的詞法分析過程

一段對計算機來說豪無意義的字符串,經過語法分析后就得到了略微有意義的 Token 流。digit 就表示這個詞法單元對應的是數字,operator 則表示操作符,后面相應的數字和符號(粉色背景)就是詞素。同時,程序中一些不必要的空白、注釋也可以由詞法分析器來過濾掉,這樣,之后的語法分析等步驟處理起來就會容易得多。

在實際的程序中,詞法單元都會以枚舉或數字來表示這是哪一類詞法單元。我的 Token.cs 定義如下所示:

里面的 Index 和 Text 屬性不必多做解釋,Start 和 End 是用來在源文件中定位的(索引,行數和列數),Value 則僅僅是為了方便傳遞一些值而設。

二、如何描述詞素

現在知道了詞法分析可以將詞素分割開來,那么詞素是怎么描述的?或者說,為什么 12、+ 和 34 都是詞素,而 1、 2+3 和 4 就不是詞素呢?這就需要用到模式了。

模式(pattern)描述了一個詞法單元的詞素可能具有的形式。

也就是說,我定義了 digit 模式為“由一個或多個數字組成的序列”,和 operator 模式為“單個 + 或 * 字符”,詞法分析器就知道 12 是一個詞素,而 2+3 則不是詞素了。

現在,模式一般都是用正則表達式(regular expression)表示的,這里所謂的正則表達式,與平常所說的正則表達式(例如 System.Text.RegularExpressions.Regex 類)形式完全相同,功能卻更有限,它只包含了字符串的匹配能力,而沒有分組、引用和替換的能力。簡單的舉個例子,a+ 這個正則表達式就表示“由一個或多個字符 a 組成的序列”。關于正則表達式更多詳細信息,我會在后面的文章中列出來,當然,有限的參考一下 System.Text.RegularExpressions.Regex 也是可以的。

在本系列之后的文章中所提的正則表達式,都指的是這種只具有字符串匹配能力的正則表達式,大家一定要注意不要與 System.Text.RegularExpressions.Regex 相混淆。

三、如何構造詞法分析器

說完了詞素的描述,就到如何根據詞素的描述來構造詞法分析器了。大致的流程如下:

圖 3 構造詞法分析器

從上圖來看,定義了模式的正則表達式,經過 NFA 轉換、DFA 轉換和 DFA 化簡,得到了一張轉換表。這張轉換表再加上一個固定的 DFA 模擬器,就組成了詞法分析器。它不斷的從輸入緩沖區中讀取字符,利用自動機來識別詞素并輸出??梢哉f,詞法分析的精華就是如何得到這張轉換表。

說了這么多,詞法分析算是簡單的介紹完了,從下一篇開始,就是如何一步一步實現完整的詞法分析器。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品69精品一区二区三区| 在线视频欧美日韩| 亚洲最新av网址| 日韩av一区二区在线| 午夜精品一区二区三区视频免费看| 91牛牛免费视频| 欧美性xxxx极品hd欧美风情| 91精品国产综合久久香蕉最新版| 欧美性xxxx极品高清hd直播| 日韩欧美精品网站| 国模gogo一区二区大胆私拍| 欧美高清在线观看| 国产成人+综合亚洲+天堂| 九九精品视频在线观看| 欧美一级在线亚洲天堂| 成人免费看吃奶视频网站| 亚洲精品www久久久久久广东| 国产欧美精品一区二区| 亚洲va电影大全| 中文字幕亚洲激情| 91网站免费看| 国产精品久久婷婷六月丁香| 亚洲国产毛片完整版| 中文字幕精品影院| 欧美日韩国产999| 国产精品观看在线亚洲人成网| 亚洲精品在线观看www| 欧美日韩一区二区在线播放| 欧美孕妇与黑人孕交| 亚洲国产精品美女| 91精品久久久久久久久久| 疯狂蹂躏欧美一区二区精品| 亚洲国产97在线精品一区| 136fldh精品导航福利| 欧美在线精品免播放器视频| 国产一区二区色| 91精品免费看| 欧美电影在线观看完整版| 日韩视频免费观看| 亚洲天堂网站在线观看视频| 国产精品成人免费视频| 色综合伊人色综合网站| 欧美日韩加勒比精品一区| 国产偷亚洲偷欧美偷精品| 中文字幕欧美视频在线| 在线播放精品一区二区三区| 国产欧美精品在线播放| 久久久久久69| 久久国产精品影片| 亚洲精品按摩视频| 亚洲精品第一国产综合精品| 78m国产成人精品视频| 欧美日韩国产一中文字不卡| 欧美国产欧美亚洲国产日韩mv天天看完整| 韩日精品中文字幕| 亚洲国产精品人久久电影| 91免费国产视频| 欧美电影第一页| 不卡伊人av在线播放| 欧美午夜女人视频在线| 色视频www在线播放国产成人| 欧美俄罗斯性视频| 69国产精品成人在线播放| 久久夜色精品国产欧美乱| 国产精品久久久av| 福利视频导航一区| 成人啪啪免费看| 国产精品午夜一区二区欲梦| 日韩欧美高清视频| 一区二区欧美久久| 亚洲精品在线看| 亚洲自拍偷拍福利| 久久精品视频一| 亚洲福利视频专区| 久久精品亚洲国产| 91亚洲国产精品| 午夜精品久久久久久久久久久久| 日韩精品免费在线视频| 日韩精品中文在线观看| 中文字幕亚洲欧美日韩高清| 国产视频精品免费播放| 欧美怡红院视频一区二区三区| 国产91精品高潮白浆喷水| 81精品国产乱码久久久久久| 日韩免费高清在线观看| 精品视频久久久久久久| 日韩精品视频在线| 亚洲国产日韩欧美在线图片| 国产成人综合久久| 久久精品国产99国产精品澳门| 欧美怡春院一区二区三区| 国产精品人人做人人爽| 在线播放国产一区中文字幕剧情欧美| 亚洲字幕在线观看| 隔壁老王国产在线精品| 国产日韩在线一区| 亚洲剧情一区二区| 国产精品一区二区三区成人| 欧美最近摘花xxxx摘花| 久久精品一区中文字幕| 亚洲欧美国产精品| 亚洲欧洲成视频免费观看| 欧美电影在线观看完整版| 国产91在线播放精品91| 一本一本久久a久久精品牛牛影视| 97香蕉超级碰碰久久免费的优势| 伊人久久综合97精品| 久久精品久久久久| 91在线免费视频| 成人激情在线播放| 日韩视频欧美视频| 国产精品视频大全| 久久精品2019中文字幕| 97国产精品视频人人做人人爱| 亚洲欧美一区二区三区情侣bbw| 欧美日韩成人在线观看| 日韩毛片在线观看| 丝袜亚洲欧美日韩综合| 国产精品手机播放| 亚洲精品影视在线观看| 欧美性受xxxx白人性爽| 久久偷看各类女兵18女厕嘘嘘| 国内精品视频一区| 中文字幕v亚洲ⅴv天堂| 91精品久久久久久久久久久久久久| 97在线观看免费| 亚洲成人久久网| 69av在线播放| 亚洲欧美三级在线| 国产成人精品日本亚洲| 国产精品日韩在线观看| 91九色蝌蚪国产| 日韩av在线导航| 日韩有码片在线观看| 日韩精品电影网| 亚洲成人av资源网| 亚洲xxx视频| 久热爱精品视频线路一| 国产精品久久久久秋霞鲁丝| 91中文在线视频| 中文字幕欧美日韩va免费视频| 午夜精品久久久99热福利| 久久久久久久久亚洲| 久久免费视频这里只有精品| 亚洲精品电影在线观看| 亚洲女人天堂av| 色偷偷偷综合中文字幕;dd| 精品亚洲一区二区| 久久久久久久久久久久久久久久久久av| 精品久久久香蕉免费精品视频| 欧美亚洲另类视频| 国产精品福利无圣光在线一区| 中国日韩欧美久久久久久久久| 日韩在线观看你懂的| 成人免费观看49www在线观看| 亚洲精品日韩欧美| 亚洲欧美福利视频| 欧美一区二区大胆人体摄影专业网站| 欧美一性一乱一交一视频| 日韩av成人在线| 美女999久久久精品视频| 日韩中文字在线| 亚洲精品国产精品国自产在线| 欧美福利小视频|