2013-02-21 81 views
4

我正在尋找一個C/C++ SQL解析庫,它能夠向我提供查詢依賴的表的名稱。SQL解析器庫 - 從查詢中獲取表名

我想到:

SELECT * FROM TABLEA NATURAL JOIN TABLEB 

結果:TABLEA,TABLEB

當然提供的示例是簡單的極端。我已經編寫了自己的解析器(基於Boost.Spirit),它處理SQL語法的一個子集,但我需要的是能夠處理複雜(遞歸等)查詢的解析器。

你知道這個目的有用嗎?

我發現的是http://www.sqlparser.com - 這是商業,但確實是我所需要的。 我也挖掘了PostgreSQL的資源,沒有任何效果。

+0

對不起,因爲變得不合時宜,但是......爲什麼? – vines 2013-02-21 13:17:19

+0

你可以使用lexxer和yaccer的組合來做到這一點,我知道你可以在網上找到完整的語法定義,但它們並不是最新的......無論如何,我也搜索了很多東西,可以做到這一點,並結束編寫我自己的解析器,實際上可以跳過未定義的語法部分,但仍然很難使其處理複雜的查詢... – ppetrov 2013-02-21 13:20:19

+0

@vines - 我正在寫一箇中間件庫,它透明地緩存查詢結果在Memcached,Redis或本地RAM中(取決於配置)。目前這只是一個學術研究,不管它是否合理。我用SOCI庫(http://soci.sourceforge.net/,我已經實現了我自己的後端)進行了測試。也許我會實現一些JDBCv2驅動程序。 – bartull 2013-02-21 13:29:36

回答

3

ANTLR的可以產生一個很好的SQL語法分析器(分析器的來源可以是C++)爲你,有它一些SQL語法可供選擇:http://www.antlr3.org/grammar/list.html

如果你所感興趣的是表名,然後採用這些語法之一併添加收集這些名稱的語義操作應該相當容易。

在Antlr和Bison/Yacc有一些經驗& Lex/Flex我絕對推薦Antlr。它是用Java編寫的,但目標語言可以是C++ - 生成的代碼實際上是可讀的,看起來像人類寫的。 ANTLR的調試產生的解析器是相當好的,不能對野牛生成的說..

還有其他選項,例如像檸檬和SQLite語法,看看這個問題,如果你喜歡:SQL parser in C

+0

謝謝,我會試試 – bartull 2013-02-21 14:19:51

+0

好吧,讓我們知道它是如何發生的,我很想知道。 – piokuc 2013-02-21 14:24:17