【发布时间】:2013-01-05 21:31:56
【问题描述】:
对于我们的 CMIS 服务器端实现,我希望构建一个解析器来解析作为查询方法的输入提供的查询语句。 CMIS 为查询语句定义了 BNF 语法。我想知道生成这个 BNF 解析器的最佳方法是什么?
我们的实现是在 C# 中。 CMIS 查询基于 SQL 语法加上 CMIS 定义的一些谓词。
【问题讨论】:
-
这里有一些关于 C# 解析的信息stackoverflow.com/questions/7377344/…
-
SQL 通常是一种相当复杂的语言。最直接的答案是,“获取具有现有 SQL 语法的解析器生成器”,因此您不必复制它。但是,大多数解析器生成器构建解析器。但是,解析通常是达到目的的一种手段,而不是目标本身。一个更有趣的问题是解析后打算做什么?这可能会大大改变答案。
-
@IraBaxter - 我必须使用的语法是由 CMIS 定义的,它基于 SQL 加上一些由 CMIS 标准定义的谓词。因此查询将类似于“SELECT * FROM cmis:document WHERE IN_FOLDER(10230)”。一旦解析器验证并分类查询,我就可以根据查询中的谓词调用适当的代码。
-
“调用适当的代码”......这并没有回答关于你想要实现什么的问题。适当的代码做什么?它是否执行整个 CMIS SQL 查询?我想知道的是你在解析之上对 SQL 查询做了多少分析。
-
@IraBaxter - 正如我所说,CMIS SQL 查询不同于普通 SQL。所以我不能真正按原样执行这些。表名、列名也将与我们的内部表不同。所以我们也需要翻译它。像“SELECT cmis:name FROM cmis:document”这样的查询需要这样的翻译。对于像“SELECT * FROM cmis:document WHERE In_TREE(folder_id)”这样的另一个查询,我们必须编写代码来返回指定文件夹树中的所有文档。此外,像“SELECT SCORE() FROM cmis:document WHERE CONTAINS('some text')”这样的查询需要我们使用全文搜索功能。
标签: parser-generator bnf cmis