1 xianbing278 2024-02-27 17:27:02 +08:00 ![]() 你说的这些我都跟听天书了,你已经掌握的内容我感觉我都还要学一段时间,我也是做了 5 年 |
![]() | 2 c3de3f21 2024-02-27 17:44:11 +08:00 |
![]() | 3 c3de3f21 2024-02-27 17:44:45 +08:00 |
![]() | 4 c3de3f21 2024-02-27 17:45:05 +08:00 上面两个结合看看怎么用,集成到你项目里 |
![]() | 5 Betsy 2024-02-27 17:54:29 +08:00 via iPhone calcite 很容易完成不同数据源 sql 的转换,不过想二开可不容易呐。antlr4 的话可以看下 https://github.com/apache/shardingsphere/tree/master/parser/sql/dialect ,这个会简单点 |
6 ufo5260987423 2024-02-27 18:11:50 +08:00 antlr+*BNF 基本上能做好词法解析了,不过我感觉你是想在语法,即 syntax 基础上延伸。这个的确不好弄,我这里用 lisp 语言举例,因为 lisp 的 AST 和代码是同构的syntax 扩展,实际上等于写 lisp 宏。 在 sql 层面,你加新的语法,就等于写了 lisp 宏以后,还要往 lexer 层面加东西,等于拓展原有的 BNF 。这个事情怎么说呢?比如 C++,它的标准的拓展就是一个逐步增加新语法的过程,实际上 C++的词法解析也的确是非常复杂,甚至效率很低的。 |
7 hangbale 2024-02-27 18:19:12 +08:00 b 站上面有编译原理理论层面的公开课,但离实际的工程比较远,需要再看下如何手写 compiler 的书 |
8 namonai 2024-02-27 19:18:59 +08:00 搜一下《 Engineering a compiler 》 |
9 a7851578 2024-02-27 19:56:18 +08:00 ![]() 给标准的 sql 增加一些自定义的语法 -> 如何保证兼容性?做个新数据库吗? 用一套 sql 语法来查询不同数据库 -> 难度很大,需要类似 sql 到中间语言再到 sql 的翻译器,参考 2 和 5 楼的回答。 给不支持 sql 的工具开发开发简单的查询引擎 -> 为什么需要给工具开发查询引擎? 我感觉你这里一个问题解决了,就是一篇系统级别的论文。 |
![]() | 10 goofish 2024-02-27 21:20:29 +08:00 https://csdiy.wiki/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/CS143/ |
11 Donahue 2024-02-27 22:44:01 +08:00 nand2tries |
![]() | 12 momocraft 2024-02-28 00:18:10 +08:00 这几个 "需求" 都不简单 建议放低目标 找个现成的 SQL parser 边用 (改) 边学 |
13 mantouboji 2024-02-28 00:21:20 +08:00 别难为自己了,还是去找专业的人干吧。人家科班教育不是白学的。 |
![]() | 14 agagega 2024-02-28 02:17:50 +08:00 ![]() 有本书叫《 Engineering a Compiler 》,有中文版《编译器设计》,翻译的也还可以。这本书涵盖了前端到后端的理论,但也比龙书通俗易懂一些,另外章节划分比较完整,不会像有些书一样从头到尾带你写一个语言的编译器。前端里面各种自动机理论看不明白可以跳过,把前端部分看完以后就能理解递归下降、LL 、LR 这些概念了。 写类似编译器的软件,还有本书叫《编程语言实践模式》,里面提供了很多实用性的套路(或者说设计模式),也算很有帮助。 你要改 SQL 的话重点其实不在编译原理这里,而是理解 SQL 的完整语法,有些地方不理解还得学一下关系代数。C 语言的语法定义在主流语言算简单的,但也能找到不少大家不了解的阴暗角落。 查询引擎和编译器关系就不那么大了,虽然说有很多人觉得可以用编译器思路来优化查询,但不做那么深的话基本还是数据库那套理论。其实你用 ANTLR 或者 Bison 这类工具,只需要知道它们解析的局限性就好了。LL 很好理解,LR 可能要稍多花点时间。 |
![]() | 15 levelworm 2024-02-28 02:49:48 +08:00 via Android 最近也在自己弄这个,不过只能弄玩具语言的 rdp ,sql 这种还是太复杂了。 |
16 cnsdytedison 2024-02-28 08:25:28 +08:00 via Android 貌似 datagrip 就可以直接翻译 sql 方言。但是没详细用过。不过感觉这个需求不是很有用。pojo 框架可以避免大部分 sql 书写需求。 |
17 dayeye2006199 2024-02-28 08:26:03 +08:00 via Android ![]() |
![]() | 18 xuanbg 2024-02-28 08:38:19 +08:00 给 sql 加自定义语法不如自己多写点自定义函数或者存储过程来得方便实用 |
19 ZGame 2024-02-28 08:40:32 +08:00 你说的应该是数据存储厂商应该关心的, 你想要增加一些扩展语法,是希望自己做计算引擎还是翻译到具体的某种数据库厂商的 sql 上去? 而且这类 dsl 需求已经在大数据领域很常见了 ,可以去看看 flink sql 或者 apache 方解石 |
20 ZGame 2024-02-28 08:41:14 +08:00 用一套 sql 语法来查询不同数据库,这个去看看 apache 方解石 就可以了 |
21 lff0305 2024-02-28 09:24:30 +08:00 学会用 antlr 就行了,感觉 antlr 不需要特别多的编译原理的东西 |
22 fredweili 2024-02-28 10:10:55 +08:00 要去找英文资料了 |
![]() | 23 pangdundun996 2024-02-28 11:03:17 +08:00 用现成的 parser 库改改吧,拿到 AST 后自己操作,之前写的 sql-to-mongo 的 golang 库就是这个思路: https://github.com/tsfans/sql-to-mongo |
![]() | 24 masterclock 2024-02-28 11:44:18 +08:00 Apache calcite 直接搞定吧 |
![]() | 25 levelworm 2024-02-28 21:54:36 +08:00 @dayeye2006199 我最近在读"Writing Interpreters and Compilers for the Raspberry Pi Using Python"这本书,感觉是最浅显最容易入门的。接下来如果有时间还准备读"Crafting Interpreters"这本书(可以网上免费读: https://craftinginterpreters.com/) 我觉得这两本书比教科书都容易一些,比较适合我这样的小白入门。 |
![]() | 26 la2la OP @a7851578 对,您说的这些如果做的特别深确实很难,我的需求没有这么深 1. 例如 FlinkSQL 或者 SparkSQL 有些功能不是很好用,我只想增加几个关键字来实现特定功能,执行还是 Flink 或者 Spark 2. 例如 HiveSQL 跟其他的一些数据库的 SQL 有些函数名称是不一样的但是功能一样,我想把 Hsql 中相关函数提取出来替换一下就行 3. 例如查询消息队列,会实现一个简单的 sql 语法然后后面解析查询,也没有啥性能需求能用就行 我也看了一点关于编译原理的东西,感觉我主要需求编译前端的一部分知识,后端的太难了我也搞不了 |
![]() | 27 junmoxiao 2024-02-29 17:10:24 +08:00 学 antlr4 |