#解释器 #表达式 #逻辑 #后端 #逻辑 #前端 #跨平台

polyglot_interpreter

一个跨平台、跨语言的简单逻辑表达式解释器

3个版本 (稳定)

1.0.1 2024年2月29日
1.0.0 2024年2月27日
0.1.0 2024年2月22日

#268 in 编程语言

Download history 31/week @ 2024-03-30 1/week @ 2024-04-06 4/week @ 2024-05-18

每月96次下载

MIT许可证

15KB
243

多语言

一个跨平台、跨语言解释器,用于在逆波兰表示法中表达可参数化的简单逻辑表达式。

动机

目前,实际上并没有一种方法可以在前端和后端代码之间共享简单的参数化逻辑。比如说,如果你想在一个列表中显示数据,用户可以对其行执行的操作。用户可能或可能没有权限执行操作,我们希望将不可用的操作灰色化。解决这个问题的一种方法是在后端对每一行的用户可以执行的操作名称进行评估,将其与列表数据混合。但如果生成该列表定义的成本很高怎么办?你如何验证尝试对行执行操作的用户的权限呢?

解决这个问题的一种方法是为操作定义附加一个逻辑表达式,以确定用户是否有权限执行它。如果这个表达式既可以在前端执行,也可以在后端执行,那么前端可以使用它来灰化不可用的操作,后端可以使用它来验证权限(假设表达式是经过密码学签名的)。这就是polyglot的作用。

此包提供了一个简单语言的编译解释器,用于表达可以接受参数的逻辑表达式。它被编译成原生二进制文件,以及WebAssembly,并为几种编程语言提供绑定(目前:Rust、C#和JavaScript)。

语言

polyglot所解释的语言本质上是基于Lisp-like Reverse Polish Notation(逆波兰表示法)书写的布尔运算符和比较运算符构建的。例如:(= @a 1) 表示 '参数a等于1'。比较表达式也可以与布尔运算符组合。例如 (& (= @a 1) (= @b 'abc')) 表示 '参数a等于1且参数b等于字符串"abc"'。布尔运算符可以接受任意数量的子表达式作为参数。例如 (| (= @a 1) (= @b 'abc') (! @c g))

布尔运算符

  • &
  • |

比较运算符

  • = 等于
  • ! 不等于
  • > 第一个操作数大于第二个操作数(仅数值)(
  • ] 第一个操作数大于或等于第二个操作数(仅数值)(
  • < 第一个操作数小于第二个操作数(仅数值)(
  • [ 第一个操作数小于或等于第二个操作数(仅数值)(

数值可以用 ' 或裸字符串指定:123 等价于 '123'

可以使用 @ 访问参数

解释器实现文件,包含带有附加表达式示例的单元测试。

无运行时依赖