1
murmur 2022-01-10 08:28:30 +08:00
你用 lua 就可以了
|
3
CaffreySun 2022-01-10 08:36:37 +08:00 1
DSL ?要不试试 Ruby ?超级灵活的语法,做 DSL 很方便。
为啥要自己搞解释器呢? |
4
musi 2022-01-10 08:37:32 +08:00
蹲一个方案,简单点就写个 AST parser 解析到对应的语言,然后在生成代码的时候做一些逻辑判断,然后去访问你封装好的对象就行了
|
5
ClarkAbe 2022-01-10 08:40:26 +08:00
https://github.com/dop251/goja Golang 语言的,特别好用......直接映射函数或者 map 进去就行
|
7
2i2Re2PLMaDnghL 2022-01-10 09:21:37 +08:00
兼容现有脚本的语法?首先想办法嵌入原有解释器,毕竟可能有人写脚本时会依赖未定义行为(
其次就是编译原理整一套,通常就是写 AST parser 然后解释执行。 |
8
heguangyu5 2022-01-10 09:29:12 +08:00
可以看看我的这个 https://www.v2ex.com/t/826154
被网友称为"玩具" 这个"玩具"(BPC)兼容 PHP,也就是说,同样的 PHP 代码,用 php 执行出来的结果和 BPC 编译执行出来的结果是一样的.如果当作黑盒子用的话,我不说是 BPC,一般情况下外部来看就是 PHP. 虽然我是走编译成二进制的路子,但是也可以做成解释执行的,只不过解释执行对我没用,就没做. 具体实现思路的话,首先要实现一个要兼容的语言的核心或者说 runtime,这个核心保证了你的解释器和那个语言的行为是一致的,比如拿 PHP 来说,两个 int 相加,如果溢出了,就返回 float 而不是溢出,那么你的 runtime 里就要对加法这样来实现. 然后再定义 /实现一个添加扩展函数或类的机制,来在 runtime 之外增加你需要的 user 及 user.transfer() 再接下来就是 lexer parser 那一套了,解析脚本在做什么,调用 runtime 和扩展函数执行给出结果. |
9
janxin 2022-01-10 09:33:15 +08:00 via iPhone
不要整天造轮子了,嵌个脚本引擎或者 wasm 直接走起吧
|
10
selca 2022-01-10 09:35:42 +08:00
CTRL+R
|
11
BQsummer 2022-01-10 09:50:28 +08:00
找个脚本引擎吧,比如 aviator
|
12
SmiteChow 2022-01-10 09:52:04 +08:00
如果你的需求是通用的嵌入式编程环境,建议 lualang 。如果你的需求和业务场景强相关,建议 DSL ,使用成熟的 antlr4 编译前端+java/python/...后端很容易设计实现一个新语言。
|
13
Via8veritas 2022-01-10 10:19:18 +08:00
我推测你的需求是需要一个规则引擎。试试直接用 Drools ,用户直接学习他的语法就可以了。你也可以二次开发增加自己的提供的 api 。
|
14
monkeyWie 2022-01-10 12:18:21 +08:00
python exec 就行了
|
15
learningman 2022-01-10 12:51:59 +08:00
真想写 yaac+llvm 走起
|
16
learningman 2022-01-10 12:52:35 +08:00
@learningman #15 yacc
|
17
churchill 2022-01-10 13:07:10 +08:00
|
18
ByteCat 2022-01-10 14:57:21 +08:00
ANTLR4 DSL ,我自己写了个代码生成器
|
19
msg7086 2022-01-10 15:20:02 +08:00
这不就是 binding 吗?
nginx 有个 lua binding ,vapoursynth 有个 python binding ,去挖他们源码看看就知道怎么玩了。 |
20
mxT52CRuqR6o5 2022-01-10 15:23:47 +08:00
[我想兼容别人的脚本语言]
你直接把别人用的那种语言的解释器 fork 出来改一改定制一下不就好了,为啥要从 0 实现呢 |
21
8520ccc OP @mxT52CRuqR6o5 别人原创的……
|
22
8520ccc OP @mxT52CRuqR6o5 而且是闭源的
|