使用PLY编写这样的 DSL 实际上非常容易,而且,在 Django 中,已经有一个示例可用于执行您想要的操作。你看,Django 有一个叫做Q对象的奇特的东西,它使 Django 查询事情变得相当容易。
在 2012 年 DjangoCon EU 上,Matthieu Amiguet 发表了题为“在 Django 应用程序中实现特定领域语言”的会议,他在其中经历了整个过程,一直到实现您想要的这种 DSL。他的幻灯片,包括所有你需要的,都可以在他的网站上找到。最终代码(无论如何链接到最后一张幻灯片)可在http://www.matthieuamiguet.ch/media/misc/djangocon2012/resources/compiler.html获得。
Reinout van Rees对该会议也发表了一些好评。(他通常会这样做!)这些涵盖了一些缺失的上下文。
在给出的示例中,您可以看到与 YQL 和 JQL 非常相似的内容:
groups__name="XXX" AND NOT groups__name="YYY"
(modified > 1/4/2011 OR NOT state__name="OK") AND groups__name="XXX"
它也可以很容易地调整;例如,您可能想要使用groups.name而不是groups__name(我愿意)。这种修改可以相当简单地进行(允许.在 FIELD 标记中,通过修改t_FIELD,然后在构造对象之前.替换为)。__Qp_expression_ID
所以,这就满足了简单的查询;如果您希望制作更复杂的 DSL,它还为您提供了一个很好的起点。