所以这就是我想要实现的目标。我想给我的用户一个类似谷歌的文本框,他们可以在其中输入查询。我希望他们能够表达半自然语言,例如
"view all between 1/1/2008 and 1/2/2008"
如果语法必须是相当结构化的并且仅限于这个特定的域,那没关系......这些是将使用它的专家用户。
最终,我想我希望解析结果可以作为某种表达式树使用。但是,如果您对哪种数据结构可能更好有其他想法。
这是在 C# 中:-)
您正在描述一种编程语言。当然它是一种小语言(通常称为小语言,或领域特定语言 (DSL))。如果您从未听说过递归下降解析器这个术语,那么您最好听从 Paul 的建议并使用一些描述的下拉框。
然而,我不得不再次同意他的观点,如果你想这样做,Antlr 就是你要走的路。网站上有一些教程可以帮助您入门。基本上,您将需要描述如何使用Backus-Naur 格式表示法的语法。
然后,您将通过语法运行 Antlr,它会生成您的解析器。然后,您可以将教科书中的输入输入到抽象语法树中。然后,您可以使用该树来生成您的查询。这并不像听起来那么难,但有一点。
如果您真的对此感兴趣和/或想稍微扩展您的编程能力,您可以阅读 Dragon Book,AKA 编译器:原理、技术和工具,了解更多关于该主题的信息。
祝你好运,我的朋友。
我以前也遇到过这种情况。经过多次讨论,我们认为上下文相关的下拉菜单是一个比文本框更好的解决方案。
例如,有 4 个下拉菜单,但最后 3 个被禁用。然后,当用户从第一个选项中选择一个选项时,它会填充并启用其他选项。所以他们会选择“查看全部”然后选择“介于”,然后可能会弹出最后两个的文本框或日历。
表达式树是个好主意。有许多优秀的通用解析器和解析器生成器,开源的和商业的,它们可以将正确的查询字符串转换为表达式树。
使用Oslo,它是专门为此设计的......
我不知道这是否会对您有所帮助,但我们所做的是:我们为用户提供了预定义的标准,例如日期选择我们为他们提供了两个日历弹出窗口,以便他们可以选择日期范围和日期范围......我们做到了不是强制性的..所以日期过滤器仅在用户指定日期时才应用...同样,您也可以为用户提供预定义的标准选择...除此之外,表达式树似乎是一个很好的解决方法.
GOLD Parser Generator具有用于设计和测试语法的有用 UI、相当不错的教程和文档,并且易于从 C# 中使用。
试图解析这些东西将是一场灾难,并且最终对用户非常有限,因此让他们感到沮丧而不是帮助他们。我建议使用预定义的查询子句,以及某种查询构建器工具,该工具具有下拉形式的所有可用选项。您可以为不同的数据类型使用不同的布尔运算符(大于、小于数字,例如字符串等),但是我认为这比实际尝试解析用户可能键入的内容更有意义。