我正在为c ++中的SQL select语句编写(手写)递归下降解析器,我需要知道我创建的解析树是否正确。我想检查,但我没有得到sql解析树的良好来源。我的方法是 - 为每个生产编写一个函数,在该函数中,结果是添加到根树。谁能帮我?提前致谢。
答案 0 :(得分:2)
我不知道如何验证您的代码是否正确,但如果您担心自己对SQL语法的理解,那么here是一个列出各种方言的BNF语法的网站的SQL。您应该能够根据这些规则构建解析器。
答案 1 :(得分:2)
我的公司构建了很多解析器,并且遇到了同样的问题。我们最近完成了基于草案标准的SQL 2011解析器。
您可以通过手动检查解析树是否正确,以查看许多源代码案例。这假设您可以以易于检查的形式打印解析树;这很容易通过解析树的递归树遍历来完成。 [您必须已经相信您的抽象语法树节点正确地模拟了您要捕获的内容!]。您仔细选择案例来练习语法的不同部分(想想“语法的单元测试”)。对于像SQL一样丰富的语言,这是一项很重要的工作。
您还需要验证解析器是否正常工作,并通过为正在处理的SQL的特定方言提供实际代码的 lot 来实现。我通常试图找到100K-1M SLOC,如果解析器不能吃掉所有这些,我还有剩下的工作要做。一旦达到该级别,您就会认为您的解析器没问题,并将其他错误视为“维护问题”。
虽然以下内容可能无法直接帮助您,但它可能暗示您可以前进的方向。基于具有极强的解析机制,我使用了一种不同的方法。我们的工具DMS Software Reengineering Toolkit给定一个语法,将自动生成AST,并具有内置工具来打印这样的解析树(以XML的形式)。 AST有足够的信息来重新生成(“prettyprint”)源文本,DMS有一个内置的prettyprinter。因此,在手工检查各种情况之后,我所做的就是获取大量代码,并为每个文件解析它(通过上面完成的工作得不到解析错误),刷新源代码,然后重新分析源(期望没有错误)。这强烈暗示我们在往返行程中没有丢失任何东西。
我们有一个新工具,Smart Differencer比较两个程序的文本,看它们是否“相同”忽略了语言布局规则。它本质上是通过解析两个文件并分隔它们的解析树,忽略格式(行/列/转义/基数/注释/空格)。我们开始做的是解析源代码,对其进行精确打印,以及对原始文件进行智能差异化。 SmartDiff应该说“没有AST差异”。这是一个更强大的暗示,我们没有失去任何东西。如果你愿意比较你之前和之后打印的解析树,你可以做得非常相似。
答案 2 :(得分:0)
This parser可能有助于作为第二个SELECT解析资源(虽然它是在Python中,而不是C ++,对不起)。