iteye_2754 2008-11-09 22:50
浏览 332
已采纳

编译原理的应用

这两天在研究复杂查询的实现,想把普通sql的写法,转成criteria的写法。没想出一个好的方法,特抛砖一块,呵呵。

((name='test1' or name='test2') and (age>20 and age<30)) and sex='1'

这个对应的结果是这样的

Ex.and(Ex.and(Ex.or(name='test1',name='test2'),Ex.and(age>20,age<30)),sex='1')



怎么能使用程序自动解析并得到结果呢?

初步想法是,通过编译原理的方式进行解析,组装成一棵树,然后对树进行遍历。


问题补充:
这两天在研究复杂查询的实现,想把普通sql的写法,转成criteria的写法。没想出一个好的方法,特抛砖一块,呵呵。


((name='test1' or name='test2') and (age>20 and age<30)) and sex='1'


这个对应的结果是这样的


Ex.and(Ex.and(Ex.or(name='test1',name='test2'),Ex.and(age>20,age<30)),sex='1')





怎么能使用程序自动解析并得到结果呢?


初步想法是,通过编译原理的方式进行解析,组装成一棵树,然后对树进行遍历。






直接使用了hibernate中的HqlParser,得到AST。问题解决。整个复杂查询终于实现,当然中间采用了不少的约定。



另:对参与运算的value需要做类型转换,感觉实在无奈!



感谢sdh5724和cats_tiger的回答。

  • 写回答

2条回答 默认 最新

  • catstiger 2008-11-10 08:27
    关注

    直接用antlr就可以。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置