@sciexpr/parser 0.1.0 → 0.1.1

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/dist/index.cjs CHANGED
@@ -182,9 +182,17 @@ var LatexParser = class {
182
182
  // ==========================================================================
183
183
  // Parse Expressions
184
184
  // ==========================================================================
185
- parseExpressions() {
185
+ /**
186
+ * Parse a sequence of expressions.
187
+ * @param stopType Optional token type to stop at (e.g. CloseBrace inside a group).
188
+ * When set, the loop breaks BEFORE consuming the stop token.
189
+ */
190
+ parseExpressions(stopType) {
186
191
  const exprs = [];
187
192
  while (!this.isEOF()) {
193
+ if (stopType !== void 0 && this.peek()?.type === stopType) {
194
+ break;
195
+ }
188
196
  const expr = this.parseExpression();
189
197
  if (expr) exprs.push(expr);
190
198
  }
@@ -220,6 +228,10 @@ var LatexParser = class {
220
228
  this.advance();
221
229
  expr = (0, import_core2.createSymbol)(token.value, this.classifySymbol(token.value));
222
230
  break;
231
+ case "ampersand" /* Ampersand */:
232
+ this.advance();
233
+ expr = (0, import_core2.createSymbol)("&", import_core.SymbolType.Ordinary);
234
+ break;
223
235
  case "number" /* Number */:
224
236
  this.advance();
225
237
  expr = (0, import_core2.createSymbol)(token.value, import_core.SymbolType.Number);
@@ -230,13 +242,13 @@ var LatexParser = class {
230
242
  // Skip whitespace
231
243
  case "openParen" /* OpenParen */:
232
244
  this.advance();
233
- const body = this.parseExpressions();
245
+ const body = this.parseExpressions("closeParen" /* CloseParen */);
234
246
  this.skipType("closeParen" /* CloseParen */);
235
247
  expr = (0, import_core2.createDelimiter)("(", ")", body.length === 1 ? body[0] : (0, import_core2.createGroup)(body));
236
248
  break;
237
249
  case "openBracket" /* OpenBracket */:
238
250
  this.advance();
239
- const bracketBody = this.parseExpressions();
251
+ const bracketBody = this.parseExpressions("closeBracket" /* CloseBracket */);
240
252
  this.skipType("closeBracket" /* CloseBracket */);
241
253
  expr = (0, import_core2.createDelimiter)("[", "]", bracketBody.length === 1 ? bracketBody[0] : (0, import_core2.createGroup)(bracketBody));
242
254
  break;
@@ -346,7 +358,7 @@ var LatexParser = class {
346
358
  /** 解析 { expressions } 分组 */
347
359
  parseGroup() {
348
360
  this.skipType("openBrace" /* OpenBrace */);
349
- const children = this.parseExpressions();
361
+ const children = this.parseExpressions("closeBrace" /* CloseBrace */);
350
362
  this.skipType("closeBrace" /* CloseBrace */);
351
363
  return (0, import_core2.createGroup)(children);
352
364
  }
package/dist/index.d.cts CHANGED
@@ -83,6 +83,11 @@ declare class LatexParser implements IParser {
83
83
  private displayMode;
84
84
  canParse(input: string): boolean;
85
85
  parse(input: string, options?: ParseOptions): ExpressionRoot;
86
+ /**
87
+ * Parse a sequence of expressions.
88
+ * @param stopType Optional token type to stop at (e.g. CloseBrace inside a group).
89
+ * When set, the loop breaks BEFORE consuming the stop token.
90
+ */
86
91
  private parseExpressions;
87
92
  private parseExpression;
88
93
  /** 处理上/下标:检查 ^ 和 _ 后附加到 base 节点 */
package/dist/index.d.ts CHANGED
@@ -83,6 +83,11 @@ declare class LatexParser implements IParser {
83
83
  private displayMode;
84
84
  canParse(input: string): boolean;
85
85
  parse(input: string, options?: ParseOptions): ExpressionRoot;
86
+ /**
87
+ * Parse a sequence of expressions.
88
+ * @param stopType Optional token type to stop at (e.g. CloseBrace inside a group).
89
+ * When set, the loop breaks BEFORE consuming the stop token.
90
+ */
86
91
  private parseExpressions;
87
92
  private parseExpression;
88
93
  /** 处理上/下标:检查 ^ 和 _ 后附加到 base 节点 */
package/dist/index.js CHANGED
@@ -161,9 +161,17 @@ var LatexParser = class {
161
161
  // ==========================================================================
162
162
  // Parse Expressions
163
163
  // ==========================================================================
164
- parseExpressions() {
164
+ /**
165
+ * Parse a sequence of expressions.
166
+ * @param stopType Optional token type to stop at (e.g. CloseBrace inside a group).
167
+ * When set, the loop breaks BEFORE consuming the stop token.
168
+ */
169
+ parseExpressions(stopType) {
165
170
  const exprs = [];
166
171
  while (!this.isEOF()) {
172
+ if (stopType !== void 0 && this.peek()?.type === stopType) {
173
+ break;
174
+ }
167
175
  const expr = this.parseExpression();
168
176
  if (expr) exprs.push(expr);
169
177
  }
@@ -199,6 +207,10 @@ var LatexParser = class {
199
207
  this.advance();
200
208
  expr = createSymbol(token.value, this.classifySymbol(token.value));
201
209
  break;
210
+ case "ampersand" /* Ampersand */:
211
+ this.advance();
212
+ expr = createSymbol("&", SymbolType.Ordinary);
213
+ break;
202
214
  case "number" /* Number */:
203
215
  this.advance();
204
216
  expr = createSymbol(token.value, SymbolType.Number);
@@ -209,13 +221,13 @@ var LatexParser = class {
209
221
  // Skip whitespace
210
222
  case "openParen" /* OpenParen */:
211
223
  this.advance();
212
- const body = this.parseExpressions();
224
+ const body = this.parseExpressions("closeParen" /* CloseParen */);
213
225
  this.skipType("closeParen" /* CloseParen */);
214
226
  expr = createDelimiter("(", ")", body.length === 1 ? body[0] : createGroup(body));
215
227
  break;
216
228
  case "openBracket" /* OpenBracket */:
217
229
  this.advance();
218
- const bracketBody = this.parseExpressions();
230
+ const bracketBody = this.parseExpressions("closeBracket" /* CloseBracket */);
219
231
  this.skipType("closeBracket" /* CloseBracket */);
220
232
  expr = createDelimiter("[", "]", bracketBody.length === 1 ? bracketBody[0] : createGroup(bracketBody));
221
233
  break;
@@ -325,7 +337,7 @@ var LatexParser = class {
325
337
  /** 解析 { expressions } 分组 */
326
338
  parseGroup() {
327
339
  this.skipType("openBrace" /* OpenBrace */);
328
- const children = this.parseExpressions();
340
+ const children = this.parseExpressions("closeBrace" /* CloseBrace */);
329
341
  this.skipType("closeBrace" /* CloseBrace */);
330
342
  return createGroup(children);
331
343
  }
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@sciexpr/parser",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Scientific Expression Engine - LaTeX & Chemical formula parser",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
- "module": "./dist/index.mjs",
7
+ "module": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
- "import": "./dist/index.mjs",
12
+ "import": "./dist/index.js",
13
13
  "require": "./dist/index.cjs"
14
14
  }
15
15
  },