@fordi-org/bsimp

中文文档
1.0.4发布于 2023/02/21ISCESM + CJS零依赖近 30 天下载 2718

布尔表达式简化器

中文使用文档
文档目录12 节
  1. 剖析( 字符串)
  2. 至 String( 表达式)
  3. 简化(表达式,[步骤])
  4. 符号( termStr)
  5. 术语( termStr)
  6. 表达式对象
  7. 表达式字符串
  8. 波兰语标记
  9. 插件标记
  10. 初专
  11. 隐含和
  12. 发展问题

纯度

布尔表达式简化器

演示

剖析( 字符串)

将逻辑表达式的字符串表达式转换为表达式对象

import { parse } from '@fordi-org/bsimp/parse';

console.log(parse('A+A!B'));
[
  Symbol( ∪ ),
  Symbol(A),
  [ Symbol( ∩ ), Symbol(A), [ Symbol(!), Symbol(B) ] ]
]

至 String( 表达式)

将表达式对象转换为字符串

import { parse, toString, SET } from '@fordi-org/bsimp';

console.log(toString(parse('A+A!B'), SET));
console.log(toString(parse('A+A!B'), LOGIC));
console.log(toString(parse('A+A!B'), POLISH));
console.log(toString(parse('A+A!B'), SOURCE));
A ∪ (A ∖ B)
A+A!B
(∪ A (∩ A !B))
[OR, A, [AND, A, [NOT, B]]]

简化(表达式,[步骤])

简化象征布尔的表达式。 可选地通过数组来收集步骤 .

import { simplify, parse, toString, LOGIC } from '@fordi-org/bsimp/simplify';

const toSimplify = [
  'A+B!C+C!A',
  'AB!C+ABC+A!B!C+B!A!C',
];

const result = toSimplify.map(expStr => {
  const exp = parse(expStr);
  const steps = [];
  const simple = simplify(exp, steps);
  return {
    simplified: toString(simple, LOGIC),
    steps,
  };
});

console.log(result);
[ 
  {
    simplified: 'A+B+C',
    steps: [
      [
        'absorption',
        null,
        [OR, A, [AND, B, [NOT, C]], [AND, C, [NOT, A]]],
        [OR, A, C, B]
      ]
    ]
  },
  {
    simplified: 'AB+A!C+B!C',
    steps: [...],
  }
]

步骤的结构是[transform, (中文(简体) ), parentOperation, (中文(简体) ), fromExpr, (中文(简体) ), toExpr[ [ ] [ ] ]. ].

符号( termStr)

将字符串转换为符号 。 对于And, or, Not, TRUE, 和FALSE, 这将将字符串转换为内部符号. 对于其他弦,你会得到 term(termStr)。 。 。 .

术语( termStr)

将字符串转换为符号 。 对于任何以前命名的术语,你会为同一个输入字符串获得相同的符号(这与如何使用不同) Symbol(termStr) 作品,因为每个符号都是独一无二的.


表达式对象

形式上...

  • 表达式: [操作器,... Operand]
  • 运算符: 和 QQ 或 NQ NOT
  • 行动:TRUE QQ FALSE QQ符号 QQ表达式

也就是说,它是一个阵列,其中第一个元素必须是运算符,以下所有符号必须是操作符. 运算符是符号 AND, (中文(简体) ), OR,以及 NOT (从 @fordi-org/bsimp) (中文(简体) ). 操作可以是符号 TRUE 或者说 FALSE,其他表达式,或任何用户定义的符号.

表达式字符串

语法非常宽容,允许使用下列语法:

波兰语标记

{OP} {TERM} {TERM}*

例如,

"(and A B C)" 变成 [AND, A, B, C]

插件标记

{TERM} ({OP} {TERM})*

例如,

(P | Q | R) 变成 [OR, P, Q, R]

初专

解析器能理解Tronary表达式 CODE 字符串符知道如何将表达式转换为它们,但是,它们被表达为逻辑组合 AND, (中文(简体) ), OR,以及 NOT十三分之一,如果你不知道, 就像一个如果/然后/ 其它统计, 其中每块是一个名词.

这么说吧, C ? T : F 评估到 [OR, [AND, C, T], [AND, [NOT, C], F]]。你可以筑巢,但必须将其组合起来以避免模糊.

对三进制的支持旨在帮助将表达式传递到简化符中,而 CODE 串接器可以识别并包含这种模式的简单形式,被嵌入的三角体通常会被简化为某种 CODE 字符串无法识别(例如, a ? (b ? c : d) : e 将变成 (a && b && c) || (e && !a) || (a && !b && d)这不理想.

我可能对此做更多的工作,但三者支持最初意在作为投入.

隐含和

{TERM}{TERM}*

例如,

XYZ 变成 [AND, X, Y, Z]

注:由于需要隐含和, 解析器将术语限制为单字母、大小写敏感。 简化器没有那么有限,你可以做这样的事情:

const [a, b] = [
  term('longName'),
  term('longerName'),
];
const simple = simplify([OR, a, [AND, a, [NOT, b]]]);

我所想到的两个使用例是linters的布尔简化符(linter可以选择完全随机的符号名),以及一页上逻辑简化符件(用户可以输入紧逻辑字符串并重新获得其简化符).


发展问题

要运行测试套件:

npm run test

要编译布尔语法:

npm run build:peg

为了建立整个事情:

npm run build

版本与发布记录

@fordi-org/bsimp 共发布 5 个版本,首次发布于 2022/07/26;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.0.4latest2023/02/213 年前
1.0.32022/11/233 年前
1.0.22022/07/264 年前
1.0.12022/07/264 年前
1.0.02022/07/264 年前

关于 @fordi-org/bsimp 的常见问题

@fordi-org/bsimp 是什么?

布尔表达式简化器

如何安装 @fordi-org/bsimp?

在项目目录运行 npm install @fordi-org/bsimp,或使用 pnpm add / yarn add / bun add。

@fordi-org/bsimp 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/fordi-org__bsimp 是否存在。

@fordi-org/bsimp 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@fordi-org/bsimp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=16.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@fordi-org/bsimp 可以商用吗?

@fordi-org/bsimp 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@fordi-org/bsimp 的下载量有多少?

根据 npm 官方下载统计,@fordi-org/bsimp 在 2026/10/16 – 2026/11/14 这 30 天内被下载 2,718 次,日均约 91 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fordi-org/bsimp 还在维护吗?

最新版本 1.0.4 发布于 2023/02/21(3 年前);至今共发布 5 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/07/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。