1. 引言
经过一段时间的打磨,我的自制 DSL 终于迎来了新版1.2版本的发布。这篇文章将完整记录这次版本迭代的核心设计思路、关键改动以及落地过程中的踩坑经验,希望能给同样在探索 DSL 设计的开发者一些参考。
3. 新版核心特性
本次新版自制语言发布带来了以下关键能力升级:
支持联接汇编(只支持编译后的)
支持函数定义(暂时不支持参数)
示例
定义函数原理:
录入代码:
ifgog==1:ifrealcs[0]=='funend':gog=0funname[name]=fcode fcode=""cur_fun_name=""returnNone使用代码(跟原解析逻辑一样):
else:lst=[""]kkkkk=0res=""rcode=funname[realcs[0]].split('\n')print(rcode)#fileml.all2(["start()"])bl.to2(rcode)foriinrange(0,len(rcode)-1,1):lst=[rcode[i]]ccccc=all2(lst)res=res+str(ccccc)+'\n'bl.to(ccccc)returnres5. 代码示例
下面是一个简单的规则定义示例:
print(1) fz(a) ==({a},1) print(ok) end() loop(1)对应的解析核心片段:
ifrealcs[0]=='==':cvcv=realcsz.split(',')ifcvcv[0].strip()==cvcv[1].strip():ifft=1else:ifft=0returnNoneifrealcs[0]=='<=':cvcv=realcsz.split(',')iffloat(cvcv[0])<=float(cvcv[1]):ifft=1else:ifft=0returnNoneifrealcs[0]=='>=':cvcv=realcsz.split(',')iffloat(cvcv[0])>=float(cvcv[1]):ifft=1else:ifft=0returnNone函数定义代码:
funstart(s) print(10) funend() s() loop(1)汇编连接代码
importpy(hb.py) py(run_bin("test.bin"))在这里填入你放在hb文件夹的bin汇编文件夹 loop(10)6. 踩坑与经验
这次迭代过程中遇到1个值得记录的问题:
- 函数无法使用:无法正常调用
7. 后续规划
下一阶段的重点方向包括:
- 提供可视化规则编辑界面
- 增加更多内置函数库
- 完善文档与示例工程
- 探索编译到原生代码的路径
8. 总结
自制 DSL 的迭代是一个持续演进的过程。新版在语法表达力、解析性能和运行时能力上都有明显提升,但更重要的是建立了一套可扩展的架构基础。希望这篇文章能给你带来启发,也欢迎在社区交流 DSL 设计中的各种问题。
社区