C#詞法分析器(七)總結

來源:互聯網
上載者:User

在之前的六篇文章中,我比較詳細的介紹了與詞法分析器相關的演算法。它們都比較關注於實現的細節,感覺上可能比較淩亂,本篇就從整體上介紹一下如何定義詞法分析器,以及如何?自己的詞法分析器。

第二節完整的介紹了如何定義詞法分析器,可以當作一個詞法分析器使用指南。如果不關心詞法分析器的具體實現的話,可以只看第二節。

一、類庫的改變

首先需要說明一下我對類庫做的一些修改。詞法分析部分的介面,與當初寫《C# 詞法分析器》系列時相比,已經發生了不小的改變,有必要做一下說明。

1. 詞法單元的標識符

詞法單元(token)最初的定義是一個 Token 結構,使用一個 int 屬性作為詞法單元的標識符,這也是很多詞法分析器的通用做法。

但後來做文法分析的時候,感覺這樣非常不方便。因為目前還不支援從定義檔案產生詞法分析器代碼,只能在程式裡面定義詞法分析器。而 int 本身是不具有語義的,作為詞法單元的標識符來使用,不但不方便還容易出錯。

後來嘗試過使用字串作為標識符,雖然解決了語義的問題,但仍然容易出錯,實現上也會複雜些(需要儲存字串字典)。

而既簡單,又具有語義的解決方案,就是使用枚舉了。枚舉名稱提供了語義,枚舉值又可以轉換為整數,而且還能夠提供編譯期檢查,完全避免了拼字錯誤,所以現在的詞法單元便定義為 Token<T> 類,與之相關的很多類也同樣帶上了泛型參數 T。

2. 命名空間

之前的命名空間是 Cyjb.Compiler 和 Cyjb.Compiler.Lexer,現在被改成了 Cyjb.Compilers 和 Cyjb.Compilers.Lexers,畢竟命名空間名稱還是比較適合使用複數。

3. 詞法分析器上下文

之前對詞法分析器內容相關的切換,可以使用內容相關的索引、標籤或 LexerContext 執行個體本身。但現在只能夠通過標籤進行切換,這樣實現起來更簡單些,使用上也不會受到過多影響。

4. DFA 的表示

原先 LexerRule 類中對 DFA 的表示有些簡單粗暴,對於不瞭解具體實現的人來說,很難理解 DFA 的表示。現在重新規划了 LexerRule<T> 類中的介面,理解起來會更容易些。

二、定義詞法分析器

這一節是 Cyjb.Compilers 類庫中詞法分析器的使用指南,包含了完整的文檔、執行個體以及相關注意事項。類庫的源碼可以從 Cyjb.Compilers 項目找到,類庫文檔請參見 wiki。

1. 定義詞法單元的標識符

前面說到,目前是使用枚舉類型作為詞法單元的標識符,這個枚舉類型中的欄位可以任意定義,沒有任何限制。不過,為了方便之後的文法分析部分,特別要求枚舉值必須是從 0 開始的整數,枚舉值最好是連續的,因為不連續的枚舉值會導致文法分析部分浪費更多的空間。

使用特殊的值 -1 來表示檔案結束(EndOfFile),該值可以從 Token<T>.EndOfFile 欄位得到,也可以通過 Token<T>.IsEndOfFile 屬性擷取詞法單元是否表示檔案結束。

這裡仍然使用計算機作為樣本,以下代碼便定義了作為標識符的枚舉:

在使用的時候,顯然會比整數更加方便。

2. 定義詞法分析器的上下文

詞法分析器的所有定義都是從 Cyjb.Compilers.Grammar<T> 類開始的,因此首先需要執行個體化一個 Grammar<T> 類的執行個體:

詞法分析器的上下文,可以用來控制規則是否生效。上下文有兩種類型:包含型或者排除型。

如果當前是包含型上下文,那麼會啟用當前內容相關的所有規則,同時會啟用所有沒有指定任何內容相關的規則。

如果當前是排除型上下文,那麼只會啟用當前內容相關的所有規則,其它任何規則都不會被啟用。

使用以下的方法來分別定義排除型和包含型的詞法分析器上下文,label 參數即為內容相關的標籤:

預設的詞法分析器上下文是 "Initial",通過該標籤可以切換到預設的上下文中。需要特別注意的是,由於實現上的原因,上下文必須先於所有終結符定義。

例如,以下的代碼定義了一個包含型上下文 Inc,以及一個排除型上下文 Exc。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.