C# 解析用户的查询

C# 解析用户的查询,c#,parsing,tokenize,C#,Parsing,Tokenize,这就是我想要实现的目标。我想给我的用户一个类似谷歌的文本框,他们可以在这里输入他们的查询。我希望他们能够表达半自然语言,比如 "view all between 1/1/2008 and 1/2/2008" 如果语法必须是相当结构化的,并且仅限于这个特定的域,那么就可以了。。。这些是将使用此功能的专家用户 最后,我想我希望解析结果可以作为某种表达式树使用。但如果您对什么样的数据结构可能更好有其他想法 这是在C:-中,试图解析这些东西将是一场灾难,而且最后通牒对用户来说非常有限,因此让他们感到沮

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

"view all between 1/1/2008 and 1/2/2008"
如果语法必须是相当结构化的,并且仅限于这个特定的域,那么就可以了。。。这些是将使用此功能的专家用户

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


这是在C:-

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

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

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

例如,有4个下拉列表,但最后3个是禁用的。然后,当用户从第一个选项中选择一个选项时,它将填充并启用其他选项。所以他们会选择view all然后选择between,然后可能会弹出一个文本框或最后两个日历


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

如果您的语言比较复杂,您不介意在一个语法文件中指定整个内容,我会选择它—它速度快、易于使用,并且生成极易调试的代码


对于更复杂的语言,我目前最喜欢的是。通过“import”语句支持多文件语法,这非常好。生成的代码是可调试的,但在调试被认为是“简单”之前需要一点习惯。

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

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

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

如果你真的对此感兴趣,并且/或者想稍微扩展一下你的编程翅膀,你可以阅读龙之书《编译器:原理、技术和工具》中关于这个主题的更多内容


祝你好运,我的朋友。

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

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

有一个有用的用户界面,用于设计和测试语法、相当好的教程和文档,而且很容易从C中使用。

你能给我/我们一些你提到的解析器和解析器生成器的例子吗?只需谷歌C解析器生成器,并准备好进行实验。我们已经实现了下拉菜单。。。对于我们的用户来说,为了在查询中添加动态元素,不得不进行如此多的点击,这是非常令人沮丧的。注意:我对我们的用户说,我知道一般来说你的建议可能更容易,但这些人了解我们的应用程序并接受培训:-