我正在爲C++中的SQL select語句編寫(手寫)遞歸下降解析器,我需要知道由我創建的解析樹是否正確。我想檢查,但我沒有得到一個很好的SQL解析樹的來源。我的方法是 - 爲每個生產寫一個函數,並在該函數中將結果添加到根樹中。誰能幫我?提前致謝。SQL語句的解析樹 - 正好適用於「SELECT」語句
回答
我不知道你將如何去驗證你的代碼是否正確,但如果你關心你對SQL語法的理解,那麼here是一個網站,列出了各種SQL方言的BNF語法。您應該能夠根據這些規則構建解析器。
This parser基於pyparsing,可能作爲第二個SELECT解析資源(雖然它是Python,而不是C++,對不起)有幫助。
我的公司構建了很多解析器,並且遇到了同樣的問題。我們最近完成了基於標準草案的SQL 2011解析器。
如果解析樹是通過手工檢查許多源代碼的情況來決定的,那麼您決定做的事情非常多。這假設你可以打印解析樹的形式,你可以很容易地檢查;這很容易通過分析樹的遞歸樹遍歷來實現。 [你必須已經相信你的抽象語法樹節點正確地模擬了你打算捕獲的東西!]。你仔細選擇案例來練習語法的不同部分(比如「對語法進行單元測試」)。對於像SQL這樣豐富的語言,這是一項很大的工作。
您還需要驗證解析器的工作原理,並且通過爲您正在處理的SQL的特定方言提供實際代碼的批次。我通常會嘗試找到100K-1M SLOC,如果解析器無法完成所有這些,我仍然有工作要做。一旦你達到那個水平,你就會認爲你的解析器是正常的,並將進一步的錯誤視爲「維護問題」。
雖然以下內容可能不會直接幫助您,但它可能會暗示您可以領導的方向。基於具有非常強大的解析機制,我使用了一種不同的方法。我們的工具DMS Software Reengineering Toolkit在給定語法的情況下會自動生成AST,並且具有用於打印這種分析樹的內置工具(以XML的形式)。 AST有足夠的信息來重新生成(「漂白」)源文本,並且DMS有一個內置的漂亮打印機。因此,在手動檢查各種情況之後,我所做的就是取大量代碼,並對每個文件進行解析(由於上述工作而沒有得到解析錯誤),相應地打印源代碼,並重新打印來源(期望不會有錯誤)。這強烈暗示我們在往返途中並沒有失去任何東西。
我們有一個新工具可用,Smart Differencer比較兩個程序的文本,看看它們是否是「相同的」,忽略語言佈局規則。它本質上是通過解析兩個文件並對其分析樹進行分區來實現的,忽略格式(line/column/escapes/radix/comments/whitespace)。我們現在開始做的是解析源代碼,相當漂亮,並且將原始文件的結果打印出來。 SmartDiff應該說「沒有AST差異」。這是一個更強烈的暗示,我們沒有失去任何東西。如果你願意比較你之前和之後打印的分析樹,你可以做得非常相似。
- 1. 解析SQL語句
- 2. SQL SELECT語句
- 3. SQL SELECT語句
- 4. SQL-SELECT語句
- 5. SQL select語句
- 6. grep語句不適用於case語句
- 7. SQL - SELECT語句語法
- 8. SQL語句從兩個SELECT語句
- 9. 解析T-SQL語句
- 10. T-SQL SELECT語句
- 11. Tricky SQL SELECT語句
- 12. 在SQL SELECT語句
- 13. SQL 2008 SELECT語句
- 14. Pl/Sql select語句?
- 15. SQL select語句dout
- 16. 基於SELECT語句
- 17. 無法解析的SELECT語句
- 18. sql select語句select sum where
- 19. sql select語句,正確選擇語句的指南
- 20. SQL SELECT語句跳過基於WHERE語句的行
- 21. C#中的Sql解析器用於語法檢查Oracle語句
- 22. 與case語句SELECT語句
- 23. Stuck在連接子句中解析SQL Select語句(包括BNF語法)
- 24. select(select語句)
- 25. Select語句解析目標C
- 26. PHP解析語句錯誤if語句
- 27. 解釋MySQL的SELECT語句
- 28. SQL SELECT語句的問題
- 29. 嵌套的Sql select語句
- 30. SQL Server的SELECT語句
是的..我使用的語法.. – jony 2010-10-14 07:50:14
@jony:在這種情況下,你的問題到底是什麼?如何確定您的實現是無缺陷的?這很難做到,這就是爲什麼大多數人只是使用Yacc或Bison,而不是自己動手。 – 2010-10-14 09:19:13
@奧利查爾斯沃斯:我沒有可選擇的朋友..我需要這樣做,這是我的問題混淆?好吧..我的問題是相同的問題,你問:你如何確定實現是無bug?如果可能的話,是否有任何良好的源語法分析樹的例子,以便我可以檢查我的分析樹與他們。 – jony 2010-10-14 09:32:54