pacc 4.14.0 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pacc",
3
- "version": "4.14.0",
3
+ "version": "4.15.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -38,7 +38,7 @@
38
38
  "browser-ava": "^2.3.31",
39
39
  "c8": "^10.1.3",
40
40
  "documentation": "^14.0.3",
41
- "semantic-release": "^24.2.7",
41
+ "semantic-release": "^24.2.8",
42
42
  "typescript": "^5.9.2"
43
43
  },
44
44
  "engines": {
@@ -1,12 +1,14 @@
1
1
  import {
2
2
  tokens,
3
- EQUAL,
4
- NOT_EQUAL,
5
3
  DOT,
6
4
  OPEN_ROUND,
7
5
  CLOSE_ROUND,
8
6
  OPEN_BRACKET,
9
7
  CLOSE_BRACKET,
8
+ DOUBLE_BAR,
9
+ DOUBLE_AMPERSAND,
10
+ EQUAL,
11
+ NOT_EQUAL,
10
12
  LESS,
11
13
  LESS_EQUAL,
12
14
  GREATER,
@@ -64,6 +66,7 @@ export function parse(context) {
64
66
  switch (typeof token) {
65
67
  case "string":
66
68
  return { path: [token] };
69
+ case "boolean":
67
70
  case "number":
68
71
  return token;
69
72
  }
@@ -73,18 +76,60 @@ export function parse(context) {
73
76
 
74
77
  const led = (token, left) => {
75
78
  switch (token.type) {
76
- case "infix":
79
+ case "infixr": {
80
+ const right = expression(token.precedence - 1);
81
+ if (typeof left === typeof right) {
82
+ switch (typeof left) {
83
+ case "number":
84
+ case "string":
85
+ switch (token) {
86
+ case GREATER:
87
+ return left > right;
88
+ case GREATER_EQUAL:
89
+ return left >= right;
90
+ case LESS:
91
+ return left < right;
92
+ case LESS_EQUAL:
93
+ return left <= right;
94
+ case EQUAL:
95
+ return left == right;
96
+ case NOT_EQUAL:
97
+ return left != right;
98
+ }
99
+ break;
100
+
101
+ case "boolean":
102
+ switch (token) {
103
+ case DOUBLE_BAR:
104
+ return left || right;
105
+ case DOUBLE_AMPERSAND:
106
+ return left && right;
107
+ }
108
+ }
109
+ }
110
+ return {
111
+ token,
112
+ left,
113
+ right
114
+ };
115
+ }
116
+
117
+ case "infix": {
77
118
  const right = expression(token.precedence);
78
- if (typeof left === "number" && typeof right === "number") {
79
- switch (token) {
80
- case PLUS:
81
- return left + right;
82
- case MINUS:
83
- return left - right;
84
- case STAR:
85
- return left * right;
86
- case DIVIDE:
87
- return left / right;
119
+ if (typeof left === typeof right) {
120
+ switch (typeof left) {
121
+ case "number":
122
+ switch (token) {
123
+ case PLUS:
124
+ return left + right;
125
+ case MINUS:
126
+ return left - right;
127
+ case STAR:
128
+ return left * right;
129
+ case DIVIDE:
130
+ return left / right;
131
+ }
132
+ break;
88
133
  }
89
134
  }
90
135
  if (token === DOT) {
@@ -92,9 +137,11 @@ export function parse(context) {
92
137
  left.path.push(...right.path);
93
138
  return left;
94
139
  }
95
- if (typeof left === "number") {
96
- right.path.unshift(left);
97
- return right;
140
+ switch (typeof left) {
141
+ case "number":
142
+ case "boolean":
143
+ right.path.unshift(left);
144
+ return right;
98
145
  }
99
146
  return { path: [left.token, right.token] };
100
147
  }
@@ -107,14 +154,7 @@ export function parse(context) {
107
154
  left,
108
155
  right
109
156
  };
110
-
111
- case "infixr":
112
- return {
113
- token,
114
- left,
115
- right: expression(token.precedence - 1)
116
- };
117
-
157
+ }
118
158
  case "prefix":
119
159
  switch (token) {
120
160
  case OPEN_BRACKET: {
package/src/tokens.mjs CHANGED
@@ -25,6 +25,7 @@ export /** @type {Token} */ const STAR = createToken("*", 60, "infix");
25
25
  export /** @type {Token} */ const DIVIDE = createToken("/", 60, "infix");
26
26
  export /** @type {Token} */ const NOT = createToken("!");
27
27
  export /** @type {Token} */ const NOT_EQUAL = createToken("!=", 40, "infixr");
28
+ export /** @type {Token} */ const EQUAL = createToken("=", 40, "infixr");
28
29
  export /** @type {Token} */ const GREATER = createToken(">", 40, "infixr");
29
30
  export /** @type {Token} */ const GREATER_EQUAL = createToken(
30
31
  ">=",
@@ -33,7 +34,6 @@ export /** @type {Token} */ const GREATER_EQUAL = createToken(
33
34
  );
34
35
  export /** @type {Token} */ const LESS = createToken("<", 40, "infixr");
35
36
  export /** @type {Token} */ const LESS_EQUAL = createToken("<=", 40, "infixr");
36
- export /** @type {Token} */ const EQUAL = createToken("=", 40);
37
37
  export /** @type {Token} */ const OPEN_ROUND = createToken("(", 0, "prefix");
38
38
  export /** @type {Token} */ const CLOSE_ROUND = createToken(")", 0, "infix");
39
39
  export /** @type {Token} */ const OPEN_BRACKET = createToken("[", 10, "prefix");
@@ -13,11 +13,11 @@ export namespace STAR { }
13
13
  export namespace DIVIDE { }
14
14
  export namespace NOT { }
15
15
  export namespace NOT_EQUAL { }
16
+ export namespace EQUAL { }
16
17
  export namespace GREATER { }
17
18
  export namespace GREATER_EQUAL { }
18
19
  export namespace LESS { }
19
20
  export namespace LESS_EQUAL { }
20
- export namespace EQUAL { }
21
21
  export namespace OPEN_ROUND { }
22
22
  export namespace CLOSE_ROUND { }
23
23
  export namespace OPEN_BRACKET { }