4

我正在寻找一个 C/C++ SQL 解析库,它能够为我提供查询所依赖的表的名称。

我的期望:

    SELECT * FROM TABLEA NATURAL JOIN TABLEB

结果:TABLEA、TABLEB

当然提供的例子非常简单。我已经编写了自己的解析器(基于 Boost.Spirit)来处理 SQL 语法的一个子集,但我需要的是一个能够处理复杂(递归等)查询的解析器。

你知道什么有用的吗?

我发现的是http://www.sqlparser.com - 它是商业的,但正是我需要的。我还深入研究了 PostgreSQL 源代码,但没有任何效果。

4

1 回答 1

3

Antlr 可以为您生成一个不错的 SQL 解析器(解析器的源代码可以是 C++),并且可用的 SQL 语法很少:http ://www.antlr3.org/grammar/list.html

如果您只对表名感兴趣,那么采用其中一种语法并添加收集这些名称的语义操作应该相当容易。

对 Antlr 和 Bison/Yacc & Lex/Flex 有一些经验,我绝对推荐 Antlr。它是用 Java 编写的,但目标语言可以是 C++ - 生成的代码实际上是可读的,看起来像是由人类编写的。Antlr生成解析器的调试还算OK,Bison生成的就不好说了。。

还有其他选项,例如 Lemon 和 sqlite 语法,如果您愿意,可以看看这个问题:SQL parser in C

于 2013-02-21T14:01:25.033 回答