日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

在C#中使用Irony实现SQL语句的解析

發布時間:2023/12/4 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在C#中使用Irony实现SQL语句的解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇博文?LogoSharp:Logo語言的C#實現中,我介紹了LOGO語言的C#實現,在該項目中,我使用了.NET下的語法解析框架:Irony。Irony框架最開始的時候是由Roman Ivantsov發布在codeplex上的一個開源項目,它使用MIT協議開源。由于2017年的時候,微軟關閉了codeplex服務,為了讓這個優秀的項目能夠繼續為人所用,我將其復制到了我的Github賬號下,并將其移植到NET Standard 2.0,地址是:https://github.com/daxnet/irony。于是,Irony目前可以在.NET Core下使用了。事實上,Github中有很多Irony的版本,但大多數都不支持.NET Core。

不僅如此,我還在Azure DevOps上配置了持續集成,因此,你可以通過NuGet很方便地使用Irony。Irony相關的NuGet包有兩個,你需要在你的項目中同時安裝以下兩個NuGet包:

12Install-Package Irony.NetCore -Version 1.1.11Install-Package Irony.Interpreter.NetCore -Version 1.1.11

接下來,我介紹一下如何用Irony實現一個語法解析器,我們以SQL語句為例進行介紹。

所有使用Irony框架的語法定義,都必須繼承于Grammar類,并加上Language特性。以下就是我定義的一個SQL語句的語法,我稱之為“Mini SQL”,因為它目前只支持SELECT語句,而且不支持WHERE子句。

12345678910111213141516171819[Language("Mini SQL", "1.0", "A SQL Sample")]public class MiniSqlGrammar : Grammar{????public MiniSqlGrammar()????????: base(false)????{????????var identifier = new IdentifierTerminal("Identifier");????????var table = new NonTerminal("table");????????var fields = new NonTerminal("fields");????????var sql_statement = new NonTerminal("SQL");????????table.Rule = identifier;????????fields.Rule = "*" | MakePlusRule(fields, ToTerm(","), identifier);????????sql_statement.Rule = "SELECT" + fields + "FROM" + table;????????Root = sql_statement;????}}

代碼非常簡單,也很容易理解,它可以使用人類比較容易讀懂的語法定義規則進行語法定義。這里簡單介紹一下上面的代碼:

  • Language特性用于描述我們自定義的語法

  • 語法類需要繼承于Grammar類

  • 基類構造函數的false參數表示我們的語言是大小寫不敏感的

  • 所有的程序語言標識符都可以用IdentifierTerminal進行定義,Irony已經自帶了標識符的識別邏輯,非常簡單

  • table是一個標識符

  • fields可以是*,也可以是由一些標識符通過逗號分隔的一個列表

  • SQL語句由四個部分組成:SELECT關鍵字、fields字段列表、FROM關鍵字以及table數據表名

  • Root=sql_statement表示語言的解析入口就是SQL語句

編譯通過后,我們就可以使用這個語法進行SELECT語句的解析了。

Irony有一個非常不錯的功能,就是它提供一個用戶界面,用來測試我們定義的語法。這個用戶界面是一個Windows Forms的應用程序,我也將其發布到我的Github賬號下,地址是:https://github.com/daxnet/irony-explorer。下載以后編譯執行GrammarExplorer項目,就可以打開這個測試界面。在測試界面中,打開包含有自定義語法的.NET DLL,就可以將其添加到Grammar Explorer中。例如,下圖展示了我用Grammar Explorer測試上面的SQL語法的界面效果:

在Grammar Explorer中,你可以看到我們自定義語法是否存在錯誤,還可以使用一個具有代碼著色功能的編輯器進行測試,點擊Parse按鈕,即可生成語法解析樹。

使用Irony進行語法解析的基本步驟是:

  • 基于語法(Grammar)定義,創建語言數據(Language Data)

  • 基于語言數據,產生解析器(Parser)

  • 使用解析器,解析輸入的字符串,生成語法樹

  • 遍歷語法樹,執行相應的程序邏輯

  • 下面的代碼展示了這一過程:

    123456789101112131415161718192021222324252627282930313233343536373839404142sealed class SqlParser{????private static readonly LanguageData languageData = new LanguageData(new MiniSqlGrammar());????private static readonly Parser parser = new Parser(languageData);????private readonly List<string> parsedFields = new List<string>();????public void Execute(string command)????{????????var tree = parser.Parse(command);????????if (tree.HasErrors())????????{????????????return;????????}????????ParseTree(tree.Root);????}????private void ParseTree(ParseTreeNode node)????{????????switch (node.Term.Name)????????{????????????case "SQL":????????????????foreach (var child in node.ChildNodes)????????????????{????????????????????ParseTree(child);????????????????}????????????????break;????????????case "fields":????????????????foreach (var child in node.ChildNodes)????????????????{????????????????????parsedFields.Add(child.Token.Text);????????????????}????????????????break;????????????case "table":????????????????ParsedTable = node.ChildNodes[0].Token.Text;????????????????break;????????}????}????public IEnumerable<string> ParsedFields => parsedFields;????public string ParsedTable { get; private set; }}

    SqlParser會基于我們自定義的語法類,生成一個Irony的Parser對象,然后使用Parse方法來解析傳入的SQL語句,并產生語法解析樹。之后,就可以根據樹狀結構來解析語句中的每一個部分,并執行相應的操作。

    最后,就是使用這個SqlParser類來解析SQL語句并得到結果。代碼如下:

    123456789101112static void Main(string[] args){????var sqlParser = new SqlParser();????sqlParser.Execute("SELECT firstName, LastName FROM tbl_students");????Console.WriteLine($"獲得的數據表: {sqlParser.ParsedTable}");????Console.WriteLine("獲得的字段:");????foreach (var field in sqlParser.ParsedFields)????{????????Console.WriteLine(field);????}}

    代碼很簡單:調用SqlParser的Execute方法來解析給定的SQL語句,解析結果會分別保存在SqlParser的ParsedTable和ParsedFields兩個屬性中,上面的控制臺程序只需要輸出這兩個結果就行了。在實際應用中,可以通過ParsedTable來獲取某一種類型的對象列表,然后通過ParsedFields來投影列表中每個對象的屬性,從而得到基于C#的一系列對象來執行SQL查詢的效果。

    本案例執行結果如下:

    本文簡要介紹了.NET語法解析框架Irony的使用,并通過SQL語句解析的案例,介紹了Irony使用的一些技巧與步驟。就SQL語句而言,它的定義還是相對比較復雜的,不可能單靠一篇博客就能完全覆蓋所有內容,也是因為這個原因,本文也沒有涉及WHERE子句的設計,但Irony框架是完全可以做到這一點的。事實上,在Irony Explorer項目中,就有一個IronyExplorer.Samples的工程,其中包含了很多編程語言語法定義的案例代碼,比如Java、C#、SQL等,有興趣的可以參考。Irony框架本身已經幫我們做了很多工作,比如大小寫敏感的特性,比如運算符優先級的定義,比如標識符、整數、小數、正負數的定義,再比如塊注釋與行注釋的處理等等。在我用C#實現LOGO語言時,基本上也是按照上面所述步驟進行編寫和測試,因此,我就不再另起篇幅來介紹LOGO語言的語法定義了。

    原文地址:https://sunnycoding.cn/2019/07/11/sql-parser-with-irony-in-csharp/


    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

    總結

    以上是生活随笔為你收集整理的在C#中使用Irony实现SQL语句的解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。