5

所以这就是我想要实现的目标。我想给我的用户一个类似谷歌的文本框,他们可以在其中输入查询。我希望他们能够表达半自然语言,例如

"view all between 1/1/2008 and 1/2/2008"

如果语法必须是相当结构化的并且仅限于这个特定的域,那没关系......这些是将使用它的专家用户。

最终,我想我希望解析结果可以作为某种表达式树使用。但是,如果您对哪种数据结构可能更好有其他想法。

这是在 C# 中:-)

4

8 回答 8

4

您正在描述一种编程语言。当然它是一种小语言(通常称为小语言,或领域特定语言 (DSL))。如果您从未听说过递归下降解析器这个术语,那么您最好听从 Paul 的建议并使用一些描述的下拉框。

然而,我不得不再次同意他的观点,如果你想这样做,Antlr 就是你要走的路。网站上有一些教程可以帮助您入门。基本上,您将需要描述如何使用Backus-Naur 格式表示法的语法。

然后,您将通过语法运行 Antlr,它会生成您的解析器。然后,您可以将教科书中的输入输入到抽象语法树中。然后,您可以使用该树来生成您的查询。这并不像听起来那么难,但有一点。

如果您真的对此感兴趣和/或想稍微扩展您的编程能力,您可以阅读 Dragon Book,AKA 编译器:原理、技术和工具,了解更多关于该主题的信息。

祝你好运,我的朋友。

于 2008-12-09T06:07:35.983 回答
3

对于一种非常简单的语言,我会使用正则表达式。主要好处是您不必处理任何代码生成。不过,模式匹配的调试基本上为零。

如果您的语言比较复杂(您不介意在单个语法文件中指定整个内容),我会选择Coco/R——它速度快、易于使用,并且代码可调试性极强。

对于更复杂的语言,我目前最喜欢的是Antlr v3。支持多文件语法(通过'import'语句),非常好。生成的代码是可调试的,但在调试被认为“简单”之前需要一些时间来适应。

于 2008-12-09T05:38:17.417 回答
2

我以前也遇到过这种情况。经过多次讨论,我们认为上下文相关的下拉菜单是一个比文本框更好的解决方案。

例如,有 4 个下拉菜单,但最后 3 个被禁用。然后,当用户从第一个选项中选择一个选项时,它会填充并启用其他选项。所以他们会选择“查看全部”然后选择“介于”,然后可能会弹出最后两个的文本框或日历。

这是一个有点像我正在谈论的例子

于 2008-12-09T05:20:21.633 回答
1

表达式树是个好主意。有许多优秀的通用解析器和解析器生成器,开源的和商业的,它们可以将正确的查询字符串转换为表达式树。

于 2008-12-09T05:10:10.623 回答
1

使用Oslo,它是专门为此设计的......

于 2009-01-12T20:12:45.397 回答
0

我不知道这是否会对您有所帮助,但我们所做的是:我们为用户提供了预定义的标准,例如日期选择我们为他们提供了两个日历弹出窗口,以便他们可以选择日期范围和日期范围......我们做到了不是强制性的..所以日期过滤器仅在用户指定日期时才应用...同样,您也可以为用户提供预定义的标准选择...除此之外,表达式树似乎是一个很好的解决方法.

于 2008-12-09T06:47:02.720 回答
0

GOLD Parser Generator具有用于设计和测试语法的有用 UI、相当不错的教程和文档,并且易于从 C# 中使用。

于 2009-01-12T20:19:10.267 回答
-1

试图解析这些东西将是一场灾难,并且最终对用户非常有限,因此让他们感到沮丧而不是帮助他们。我建议使用预定义的查询子句,以及某种查询构建器工具,该工具具有下拉形式的所有可用选项。您可以为不同的数据类型使用不同的布尔运算符(大于、小于数字,例如字符串等),但是我认为这比实际尝试解析用户可能键入的内容更有意义。

于 2008-12-09T05:05:11.163 回答