轻盈的鱼

← 返回归档

将布尔表达式转成json格式

日期:2022/11/18分类:javascript

完整代码

1const str = '(((((1 & 2) | 3) & 4 & 5) | 6) & 7) | 8'
2
3const operate = ['&', '|'] // 操作符
4const divide = ['(', ')'] // 分隔符
5
6// 字符串去除空格转数组 进行词法分析
7function translate(str) {
8 let arr = str.replace(/ /gi, '').split('')
9 let arrTranslate = []
10 arr.forEach((itm, idx) => {
11 if (operate.indexOf(itm) > -1) {
12 // 操作
13 arrTranslate.push({
14 index: idx,
15 type: 'operate',
16 value: itm,
17 })
18 } else if (divide.indexOf(itm) > -1) {
19 // 括号分隔符
20 arrTranslate.push({
21 index: idx,
22 type: 'divide',
23 value: itm,
24 })
25 } else {
26 // 数字等符号
27 arrTranslate.push({
28 index: idx,
29 type: 'token',
30 value: itm,
31 })
32 }
33 })
34
35 return getResultByStack(arrTranslate)
36}
37
38function getResultByStack(arrTranslate) {
39 // 通过栈分组 先匹配第一个括号 作为第一层的逻辑
40 let obj = {
41 operate: '',
42 tokenList: [],
43 children: [],
44 }
45 let stack = []
46 arrTranslate.forEach((item) => {
47 if (item.value === '(') {
48 stack.push(item)
49 }
50 if (item.value === ')') {
51 stack.push(item)
52 // 判断当前分组是否完备 即 ()成对匹配
53 if (checkStack(stack)) {
54 // 递归匹配子集
55 let child = getResultByStack(stack.slice(1, -1))
56 obj.children.push(child)
57 // 清空栈
58 stack = []
59 }
60 }
61 if (item.type === 'operate') {
62 if (stack.length === 0) {
63 // 如果栈为空 则为当前分组的 操作符
64 obj.operate = item.value
65 } else {
66 // 不为空则是子分组的 操作符
67 stack.push(item)
68 }
69 }
70
71 if (item.type === 'token') {
72 if (stack.length === 0) {
73 // 如果栈为空 则属于当前分组的 token 列表
74 obj.tokenList.push(item)
75 } else {
76 // 不为空则是子分组的 token 列表
77 stack.push(item)
78 }
79 }
80 })
81 return obj
82}
83
84// 判断栈分组是否完备
85function checkStack(stack) {
86 let leftCount = stack.filter((itm) => itm.value === '(').length
87 let rightCount = stack.filter((itm) => itm.value === ')').length
88 return leftCount === rightCount
89}
90
91console.log(JSON.stringify(translate(str)))

结果

1{
2 "operate": "|",
3 "tokenList": [
4 {
5 "index": 24,
6 "type": "token",
7 "value": "8"
8 }
9 ],
10 "children": [
11 {
12 "operate": "&",
13 "tokenList": [
14 {
15 "index": 21,
16 "type": "token",
17 "value": "7"
18 }
19 ],
20 "children": [
21 {
22 "operate": "|",
23 "tokenList": [
24 {
25 "index": 18,
26 "type": "token",
27 "value": "6"
28 }
29 ],
30 "children": [
31 {
32 "operate": "&",
33 "tokenList": [
34 {
35 "index": 13,
36 "type": "token",
37 "value": "4"
38 },
39 {
40 "index": 15,
41 "type": "token",
42 "value": "5"
43 }
44 ],
45 "children": [
46 {
47 "operate": "|",
48 "tokenList": [
49 {
50 "index": 10,
51 "type": "token",
52 "value": "3"
53 }
54 ],
55 "children": [
56 {
57 "operate": "&",
58 "tokenList": [
59 {
60 "index": 5,
61 "type": "token",
62 "value": "1"
63 },
64 {
65 "index": 7,
66 "type": "token",
67 "value": "2"
68 }
69 ],
70 "children": []
71 }
72 ]
73 }
74 ]
75 }
76 ]
77 }
78 ]
79 }
80 ]
81}

版权信息

日期2022/11/18
协议CC BY-NC-SA 4.0 转载请注明出处
评论

暂无评论,来抢沙发吧。

返回顶部