2010-10-14 54 views
2

我正在为C++中的SQL select语句编写(手写)递归下降解析器,我需要知道由我创建的解析树是否正确。我想检查,但我没有得到一个很好的SQL解析树的来源。我的方法是 - 为每个生产写一个函数,并在该函数中将结果添加到根树中。谁能帮我?提前致谢。SQL语句的解析树 - 正好适用于“SELECT”语句

回答

2

我不知道你将如何去验证你的代码是否正确,但如果你关心你对SQL语法的理解,那么here是一个网站,列出了各种SQL方言的BNF语法。您应该能够根据这些规则构建解析器。

+0

是的..我使用的语法.. – jony 2010-10-14 07:50:14

+0

@jony:在这种情况下,你的问题到底是什么?如何确定您的实现是无缺陷的?这很难做到,这就是为什么大多数人只是使用Yacc或Bison,而不是自己动手。 – 2010-10-14 09:19:13

+0

@奥利查尔斯沃斯:我没有可选择的朋友..我需要这样做,这是我的问题混淆?好吧..我的问题是相同的问题,你问:你如何确定实现是无bug?如果可能的话,是否有任何良好的源语法分析树的例子,以便我可以检查我的分析树与他们。 – jony 2010-10-14 09:32:54

0

This parser基于pyparsing,可能作为第二个SELECT解析资源(虽然它是Python,而不是C++,对不起)有帮助。

2

我的公司构建了很多解析器,并且遇到了同样的问题。我们最近完成了基于标准草案的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差异”。这是一个更强烈的暗示,我们没有失去任何东西。如果你愿意比较你之前和之后打印的分析树,你可以做得非常相似。