Q: 大佬们有没有关于自己写 DSL(Domain Specific Language)的入门级资料/书籍 可以推荐一下? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anonymous2351d00
V2EX    问与答

Q: 大佬们有没有关于自己 DSL(Domain Specific Language)的入门级资料/书籍 可以推荐一下?

  •  
  •   anonymous2351d00 2023 年 2 月 26 日 2143 次点击
    这是一个创建于 1073 天前的主题,其中的信息可能已经有所发展或是发生改变。

    intro

    • 最近在写动态表单,关于灵活的表单配置写到最后还是逃不过,不得不实现一套 DSL 解析器的道路。

    • 当然,不单单是动态表单,涉及到灵活配置的大多最后都会实现一套 DSL ,在 Web 端用图形界面生成 DSL 的语句,然后代码解析(或是后端的运行时解析器,在后端运行语句),最后渲染(后端对应的是返回结果)。

    • DSL 解析器 是目前来说对我最大的障碍 /瓶颈,非常打击自信心。

    • 今年想下定决心把这个心结解决掉。

    question

    • 想请教一下大佬们,有没有入门读物或者资料,书籍也没有关系
    • 要想实现一个 DSL 解析器需要怎样的学习路线(依赖哪些基础知识,这个我也可以去补)

    ps

    • 可以先从实现简单的开始,循序渐进
    6 条回复    2023-02-27 15:53:51 +08:00
    netabare
        1
    netabare  
       2023 年 2 月 27 日 via Android   2
    op 想做的,侧重于 DSL 还是解析呢?算是两个不同的方向了。前者是 Model Driven Engineering ,后者就是典型的造语言(即使是 DSL 原理也一致)。

    前者的话更多关注于怎么样把具体的应用场景里面的 model 和 domain map 到语言上,关注于,如何去做 meta modeling ,如何提供语义清晰的 api ,如何做 text 、model 、运行时之间的转换,主要还是合理使用第三方工具而不是自己造轮子。当然基本的一些概念,比如不同的 eval 语义,还是需要了解的。

    后者重点在造语言,比如说词法分析语法分析、类型检查和推导、代码生成甚至后期优化。这个也是不限于 DSL 的,或者说 DSL 其实一般不需要这个 approach 。

    Model Design 这方面我不了解,感觉 op 可以找找看有没有一些学校的公开课件看一下,不过感觉这个领域也是那种比较老式的软科,可能有许多模糊的概念或者过时的工具,需要仔细甄别。

    我的建议是 op 可以先考虑一下这个 DSL 是否一定要用造语言来实现,会不会有一些语言内置的语法已经可以表达出来。当然造语言最大的好处大概是可以灵活应对多变的具体场景了。

    如果想好了要造 DSL ,可以优先考虑 antlr ,这是一个常用的 parser generator ,可以根据用户提供的文法来生成词法和语法分析器的骨骼,然后让用户自行填入编译器的具体实现。有几本书也是讨论这个的,然后 idea 里面有专门的语法树可视化的插件也很方便。不过我觉得首要的还是得理解一些关于 parser 和编程语言的基本概念了,比如 parser 的分类和不同类型的 parser 有哪些限制。

    在这个基础上,op 可以进一步去考虑到底选哪个方向。
    levelworm
        2
    levelworm  
       2023 年 2 月 27 日 via Android   1
    yaml 行不行?
    echoless
        3
    echoless  
       2023 年 2 月 27 日   1
    最近在写动态表单,关于灵活的表单配置写到最后还是逃不过,不得不实现一套 DSL 解析器的道路。

    ===
    这个我做过 2 次, 不知道你们是否愿意使用第三方的. 专业做问卷 DSL, 细节我不多说, 毕竟还想着靠这个吃饭.


    先说我是怎么学的, 毕业进入一家公司, 上来就是修 DSL 的 bug, 解析各种问题. 慢慢的了解了 ast 这些.


    第二次我自己重新搞了个 DSL, 都是做表单的.

    关键是你把语法定好. 后面解析啥的真没有什么难度, 不要去搞编译原理这些, DSL 的书籍也没多大必要. 我后来学过这些.
    因为你的 DSL 特别简单 根据需要不断改就是了. 解析看看(pyparsing,lark)这些, 手写难度也不大.

    想看书的话 自制编译器 这种比较贴切一点.

    可以在 yaml 的基础上去改造, 个人经验 yaml 是不够的.
    tool2d
        4
    tool2d  
       2023 年 2 月 27 日   1
    我上个帖子说过,与其想着怎么创造新语言,不如想一下如何改进现在的语言。

    毕竟不是 10 年前,现在编译技术已经非常完善了,从头造一个 DSL ,最后大概率是玩具级别的,没办法商用。

    你只需要想一下,如何最大限度改进现有的语言语法,就已经成功一大半了。
    anonymous251d00
        5
    anonymous2351d00  
    OP
       2023 年 2 月 27 日   1
    @netabare 更偏向于业务领域专用的 DSL ,大佬的回答很有启发性,感谢感谢

    @levelworm yaml/json 也都可以难在怎么解析

    @wuhaoecho 非常赞同,我感觉专业问卷的 DSL 核心在于语言模型,语法表达丰富程度,语法丰富控件可配置能力就很高,还有一方面是解析效率,感谢大佬的宝贵经验

    @tool2d 感谢大佬回答,毕竟自己没做过这些,卡了很久,想试一试先做一个玩具出来,把这个坎越过去,哪怕是越半步,也能找回一点信心。非常感谢
    anonymous2351d00
        6
    anonymous2351d00  
    OP
       2023 年 2 月 27 日
    感谢大佬们的回答,我来说一下目前的思路

    - 1.先了解但不深入 编译原理,包括词法解析,语法解析,抽象语法树的知识,这部分可看看公开课并结合语言看看代码,看看别人如何把文本解析成 树形数据结构
    - 2.在 github 找一找简单的 DSL ,理解每部分的含义后,照葫芦画瓢写一个试试
    - 3.思考如何给 DSL 添加语句并实现
    - 4.结合业务写一个简单的 DSL
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4906 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 20ms UTC 01:59 PVG 09:59 LAX 17:59 JFK 20:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86