欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2013年05月03日 09:37:10   作者:  
本篇文章介紹了,C#詞法分析器之詞法分析的使用詳解。需要的朋友參考下

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

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

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

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

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

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

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

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

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

一、詞法分析介紹

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

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

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

圖 2 算式的詞法分析過程

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

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

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

二、如何描述詞素

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

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

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

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

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

三、如何構(gòu)造詞法分析器

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

圖 3 構(gòu)造詞法分析器

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

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

相關(guān)文章

  • C#簡單實現(xiàn)發(fā)送socket字符串

    C#簡單實現(xiàn)發(fā)送socket字符串

    這篇文章主要為大家詳細介紹了C#簡單實現(xiàn)socket字符串發(fā)送,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C#實現(xiàn)學員信息管理系統(tǒng)

    C#實現(xiàn)學員信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)學員信息管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • c# 判斷是否為空然后賦值的4種實現(xiàn)方法

    c# 判斷是否為空然后賦值的4種實現(xiàn)方法

    下面小編就為大家分享一篇c# 判斷是否為空然后賦值的4種實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#程序中使用LINQ to XML來查詢XML格式數(shù)據(jù)的實例

    C#程序中使用LINQ to XML來查詢XML格式數(shù)據(jù)的實例

    這篇文章主要介紹了C#程序中使用LINQ to XML來查詢XML格式數(shù)據(jù)的實例,LINQ to XML是.NET框架中集成的接口,可以將XML數(shù)據(jù)放到內(nèi)存中進行處理,需要的朋友可以參考下
    2016-03-03
  • C# 通過反射初探ORM框架的實現(xiàn)原理(詳解)

    C# 通過反射初探ORM框架的實現(xiàn)原理(詳解)

    下面小編就為大家分享一篇C# 通過反射初探ORM框架的實現(xiàn)原理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#事件實例詳解

    C#事件實例詳解

    這篇文章主要介紹了C#事件實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c# 鉤子學習筆記

    c# 鉤子學習筆記

    今天弄了一下c#的鉤子,沒弄好,但是鉤子安裝成功,可以捕獲鍵盤事件。
    2011-04-04
  • C#遍歷文件夾后上傳文件夾中所有文件錯誤案例分析

    C#遍歷文件夾后上傳文件夾中所有文件錯誤案例分析

    這篇文章主要介紹了C#遍歷文件夾后上傳文件夾中所有文件的實現(xiàn)方法,需要的朋友可以參考下
    2015-10-10
  • VS2017使用Git進行源代碼管理的實現(xiàn)

    VS2017使用Git進行源代碼管理的實現(xiàn)

    這篇文章主要介紹了VS2017使用Git進行源代碼管理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • C#中XML基礎(chǔ)用法

    C#中XML基礎(chǔ)用法

    可擴展標記語言,標準通用標記語言的子集,簡稱XML。是一種用于標記電子文件使其具有結(jié)構(gòu)性的標記語言。這篇文章介紹了C#中XML基礎(chǔ)的用法,下面的實例代碼,大家可以看看
    2021-12-12

最新評論