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

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

这是确定如果语法有相当结构性,并仅限于这个特定的领域......这些都是谁将会使用这个专家级用户。

最后,我想我想解析结果可作为某种表达式树的。但是,如果你有什么数据结构可能会更好一些其他的想法。

这是在C#: - )

有帮助吗?

解决方案

您所描述一种编程语言。诚然这是一个小的语言(通常称为小语言,或领域特定语言(DSL))。如果你从来没有听说过这个词递归下降解析器,你可能断下保罗的意见,并使用下拉的一些描述盒子更好。

然而,再次,我会同意他的观点,如果你想这样做,ANTLR的是要走的路。有在网站上的教程,可以帮助您开始使用。基本上,你需要描述如何使用语法巴科斯范式的符号。

您然后在你的语法运行ANTLR的,它会生成解析器。然后,您可以养活你从课本中输入到抽象语法树。然后,您可以使用该树来生成查询。这不是因为这一切听起来那么困难,但有一点吧。

如果你真的到这一点,并/或想伸展你的编程翅膀一点,你可以在与龙书,又名编译器的话题更多:原理,技术和工具

祝我的朋友。

其他提示

对于一个非常简单的语言,我会用正则表达式去。主要的好处有你没有处理任何代码生成。图案匹配的调试基本上是零,虽然。

如果你的语言是比较复杂的(你不会介意指定在一个单一的语法文件整个事情),我会去的可可/ R - 它的快速,易于使用,并且使得非常调试代码

对于更复杂的语言,我目前最喜欢的是 ANTLR的V3 。支持多文件语法(通过“进口”语句),这是非常好的。生成的代码是可调试,但需要一个有点习惯前调试,可以考虑的“容易。”

我曾经有过这种情况。经过多次讨论后,我们决定上下文敏感的下拉列表中都不仅仅是一个文本框,一个更好的解决方案。

例如,有4个下拉菜单,但在最后3被禁用。然后,当用户选择从第一选项,它填充并允许其他人。所以他们会选择“查看全部”,然后“之间”,然后也许弹出一个文本框或在过去两年的日历。

下面是有点像我所讲的一个例子

表达式树是一个好主意。有很多很好的通用解析器和解析器发电机在那里,开源以及商业,它可以改变正确的查询字符串转换为表达式树。

使用奥斯陆,它是专门设计的这个...

我不知道这是否会帮助你,但我们所做的是:我们给用户预先定义的像日期选择,我们给了他们两个日历弹出窗口,使他们能够从和日期范围选择指标分析.. 。我们没有做强制规定..所以日期过滤器使用应用,只有当用户指定的日期......同样也可以给用户一个预先定义的标准选择......其他然后,表达式树似乎是一个不错的解决办法为

GOLD分析器生成器具有用于设计和测试你的语法,相当不错的教程有帮助的UI和文件,并且很容易从C#使用。

试图解析的东西将是一个灾难,ultimatley非常限制给用户,从而挫败他们更然后帮助他们。我会建议使用预先定义的查询clasues,以某种查询生成器工具已经在下拉表单中所有可用的选项。你可以有不同的数据类型不同的布尔运算符(大于,小于的数字,如不喜欢串等),但我认为这将使一个宏大的很多更有意义比实际试图分析出哪些用户可以输入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top