atcoder-gui 1.0.0 → 1.1.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.
Files changed (105) hide show
  1. package/README.md +7 -0
  2. package/dist/analyzer/analyzer.d.ts +16 -0
  3. package/dist/analyzer/analyzer.d.ts.map +1 -0
  4. package/dist/analyzer/analyzer.js +379 -0
  5. package/dist/analyzer/analyzer.js.map +1 -0
  6. package/dist/analyzer/html-parser.d.ts +24 -0
  7. package/dist/analyzer/html-parser.d.ts.map +1 -0
  8. package/dist/analyzer/html-parser.js +214 -0
  9. package/dist/analyzer/html-parser.js.map +1 -0
  10. package/dist/analyzer/index.d.ts +7 -0
  11. package/dist/analyzer/index.d.ts.map +1 -0
  12. package/dist/analyzer/index.js +7 -0
  13. package/dist/analyzer/index.js.map +1 -0
  14. package/dist/analyzer/lexer.d.ts +14 -0
  15. package/dist/analyzer/lexer.d.ts.map +1 -0
  16. package/dist/analyzer/lexer.js +133 -0
  17. package/dist/analyzer/lexer.js.map +1 -0
  18. package/dist/analyzer/match.d.ts +7 -0
  19. package/dist/analyzer/match.d.ts.map +1 -0
  20. package/dist/analyzer/match.js +133 -0
  21. package/dist/analyzer/match.js.map +1 -0
  22. package/dist/analyzer/parser.d.ts +20 -0
  23. package/dist/analyzer/parser.d.ts.map +1 -0
  24. package/dist/analyzer/parser.js +135 -0
  25. package/dist/analyzer/parser.js.map +1 -0
  26. package/dist/analyzer/types.d.ts +54 -0
  27. package/dist/analyzer/types.d.ts.map +1 -0
  28. package/dist/analyzer/types.js +10 -0
  29. package/dist/analyzer/types.js.map +1 -0
  30. package/dist/analyzer/typing.d.ts +10 -0
  31. package/dist/analyzer/typing.d.ts.map +1 -0
  32. package/dist/analyzer/typing.js +246 -0
  33. package/dist/analyzer/typing.js.map +1 -0
  34. package/dist/browser.d.ts +12 -0
  35. package/dist/browser.d.ts.map +1 -1
  36. package/dist/browser.js +26 -1
  37. package/dist/browser.js.map +1 -1
  38. package/dist/build.d.ts +7 -0
  39. package/dist/build.d.ts.map +1 -0
  40. package/dist/build.js +40 -0
  41. package/dist/build.js.map +1 -0
  42. package/dist/config.d.ts +10 -2
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +31 -18
  45. package/dist/config.js.map +1 -1
  46. package/dist/config.json5 +16 -1
  47. package/dist/gen.d.ts +6 -12
  48. package/dist/gen.d.ts.map +1 -1
  49. package/dist/gen.js +153 -66
  50. package/dist/gen.js.map +1 -1
  51. package/dist/generator/checker.d.ts +2 -0
  52. package/dist/generator/checker.d.ts.map +1 -0
  53. package/dist/generator/checker.js +64 -0
  54. package/dist/generator/checker.js.map +1 -0
  55. package/dist/generator/cplusplus.d.ts +14 -0
  56. package/dist/generator/cplusplus.d.ts.map +1 -0
  57. package/dist/generator/cplusplus.js +43 -0
  58. package/dist/generator/cplusplus.js.map +1 -0
  59. package/dist/generator/fetcher.d.ts +2 -0
  60. package/dist/generator/fetcher.d.ts.map +1 -0
  61. package/dist/generator/fetcher.js +39 -0
  62. package/dist/generator/fetcher.js.map +1 -0
  63. package/dist/generator/pipeline.d.ts +25 -0
  64. package/dist/generator/pipeline.d.ts.map +1 -0
  65. package/dist/generator/pipeline.js +85 -0
  66. package/dist/generator/pipeline.js.map +1 -0
  67. package/dist/generator/python.d.ts +14 -0
  68. package/dist/generator/python.d.ts.map +1 -0
  69. package/dist/generator/python.js +41 -0
  70. package/dist/generator/python.js.map +1 -0
  71. package/dist/generator/types.d.ts +79 -0
  72. package/dist/generator/types.d.ts.map +1 -0
  73. package/dist/generator/types.js +2 -0
  74. package/dist/generator/types.js.map +1 -0
  75. package/dist/generator/universal.d.ts +35 -0
  76. package/dist/generator/universal.d.ts.map +1 -0
  77. package/dist/generator/universal.js +524 -0
  78. package/dist/generator/universal.js.map +1 -0
  79. package/dist/generator/variable-extractor.d.ts +16 -0
  80. package/dist/generator/variable-extractor.d.ts.map +1 -0
  81. package/dist/generator/variable-extractor.js +103 -0
  82. package/dist/generator/variable-extractor.js.map +1 -0
  83. package/dist/main.d.ts +3 -1
  84. package/dist/main.d.ts.map +1 -1
  85. package/dist/main.js +99 -100
  86. package/dist/main.js.map +1 -1
  87. package/dist/submit.d.ts +1 -1
  88. package/dist/submit.d.ts.map +1 -1
  89. package/dist/submit.js +17 -17
  90. package/dist/submit.js.map +1 -1
  91. package/dist/test.d.ts +10 -0
  92. package/dist/test.d.ts.map +1 -0
  93. package/dist/test.js +127 -0
  94. package/dist/test.js.map +1 -0
  95. package/dist/tests/batch_check.d.ts +2 -0
  96. package/dist/tests/batch_check.d.ts.map +1 -0
  97. package/dist/tests/batch_check.js +46 -0
  98. package/dist/tests/batch_check.js.map +1 -0
  99. package/dist/types.d.ts +2 -0
  100. package/dist/types.d.ts.map +1 -1
  101. package/dist/utils.d.ts +12 -0
  102. package/dist/utils.d.ts.map +1 -1
  103. package/dist/utils.js +32 -0
  104. package/dist/utils.js.map +1 -1
  105. package/package.json +21 -4
@@ -0,0 +1,214 @@
1
+ import * as cheerio from "cheerio";
2
+ export function parseHtml(html) {
3
+ const $ = cheerio.load(html);
4
+ let inputFormat = "";
5
+ const samples = [];
6
+ const tempSamples = {};
7
+ let multipleCases = false;
8
+ let queryType = false;
9
+ let judgeType = "normal";
10
+ let errorTolerance = undefined;
11
+ let mod = undefined;
12
+ const checkFloatingPoint = (text) => {
13
+ const sectionText = text.toLowerCase();
14
+ if (sectionText.includes("絶対誤差") ||
15
+ sectionText.includes("相対誤差") ||
16
+ sectionText.includes("absolute error") ||
17
+ sectionText.includes("relative error")) {
18
+ judgeType = "decimal";
19
+ if (errorTolerance === undefined) {
20
+ // Try to extract error tolerance like 10^{-6}
21
+ const match = text.match(/10\^{?(-?\d+)}?/);
22
+ if (match) {
23
+ errorTolerance = Math.pow(10, parseInt(match[1]));
24
+ }
25
+ else {
26
+ errorTolerance = 1e-6;
27
+ }
28
+ }
29
+ }
30
+ };
31
+ const checkMod = (text) => {
32
+ if (text.includes("998244353")) {
33
+ mod = 998244353;
34
+ }
35
+ else if (text.includes("1000000007") || text.includes("10^9+7") || text.includes("10^{9}+7")) {
36
+ mod = 1000000007;
37
+ }
38
+ };
39
+ $("h3").each((_, element) => {
40
+ const text = $(element).text().trim();
41
+ const section = $(element).closest("section");
42
+ if (text.match(/^(?:Input(?:\s*Format)?|入力)$/i)) {
43
+ const pres = section.find("pre");
44
+ if (pres.length >= 3) {
45
+ // Query type problem
46
+ // Use only the first block for format
47
+ inputFormat = pres.eq(0).text();
48
+ queryType = true;
49
+ multipleCases = false;
50
+ }
51
+ else if (pres.length >= 2) {
52
+ const firstPreText = pres.eq(0).text().trim();
53
+ // Check if starts with T or Q.
54
+ // The content might be <var>T</var>... so text is T...
55
+ if (firstPreText.startsWith("T") || firstPreText.startsWith("Q")) {
56
+ multipleCases = true;
57
+ inputFormat = pres.eq(1).text();
58
+ }
59
+ else {
60
+ inputFormat = pres.eq(0).text();
61
+ }
62
+ }
63
+ else if (pres.length > 0) {
64
+ inputFormat = pres.eq(0).text();
65
+ }
66
+ }
67
+ else if (text.match(/^(Problem Statement|問題文|Output|出力)$/i)) {
68
+ const sectionText = section.text();
69
+ checkFloatingPoint(sectionText);
70
+ checkMod(sectionText);
71
+ }
72
+ else if (text.match(/^Constraints|制約$/i)) {
73
+ checkMod(section.text());
74
+ }
75
+ else {
76
+ const inputMatch = text.match(/^(?:Sample Input|入力例)\s*(\d+)?$/i);
77
+ if (inputMatch) {
78
+ const id = inputMatch[1] || "1";
79
+ if (!tempSamples[id])
80
+ tempSamples[id] = {};
81
+ let content = "";
82
+ const pre = section.find("pre");
83
+ if (pre.length > 0) {
84
+ content = pre.text();
85
+ }
86
+ tempSamples[id].input = content;
87
+ }
88
+ const outputMatch = text.match(/^(?:Sample Output|出力例)\s*(\d+)?$/i);
89
+ if (outputMatch) {
90
+ const id = outputMatch[1] || "1";
91
+ if (!tempSamples[id])
92
+ tempSamples[id] = {};
93
+ let content = "";
94
+ const pre = section.find("pre:first"); // abc233_f
95
+ if (pre.length > 0) {
96
+ content = pre.text();
97
+ }
98
+ tempSamples[id].output = content;
99
+ if (content.match(/\d+\.\d+/) || content.match(/\d+[eE][+-]?\d+/)) {
100
+ if (judgeType === "normal") {
101
+ judgeType = "decimal";
102
+ if (errorTolerance === undefined)
103
+ errorTolerance = 1e-6;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ });
109
+ // Convert tempSamples to array
110
+ const ids = Object.keys(tempSamples).sort((a, b) => Number(a) - Number(b));
111
+ const allOutputs = ids.map((id) => tempSamples[id].output?.trim()).filter(Boolean);
112
+ for (const id of ids) {
113
+ const s = tempSamples[id];
114
+ if (s.input !== undefined && s.output !== undefined) {
115
+ samples.push({
116
+ input: s.input,
117
+ output: s.output,
118
+ });
119
+ }
120
+ }
121
+ return {
122
+ inputFormat: inputFormat.trim(),
123
+ samples,
124
+ multipleCases,
125
+ queryType,
126
+ judgeType,
127
+ errorTolerance,
128
+ mod,
129
+ ...inferReturnType(allOutputs, judgeType, mod, multipleCases),
130
+ };
131
+ }
132
+ function inferReturnType(outputs, judgeType, mod, multipleCases) {
133
+ if (outputs.length === 0)
134
+ return { returnType: "void", multipleColumns: false, multipleRows: false, variableArray: false };
135
+ let returnType = "string";
136
+ let yesStr = undefined;
137
+ let noStr = undefined;
138
+ const parsedOutputs = outputs.map((out) => out
139
+ .trim()
140
+ .split(/\s+/)
141
+ .filter((s) => s.length > 0));
142
+ // Check for variableArray pattern (K elements preceded by K)
143
+ // Atcoder ABC 233 F style:
144
+ // K
145
+ // c1 c2 ... cK
146
+ // OR -1
147
+ const variableArray = parsedOutputs.every((tokens) => {
148
+ if (tokens.length === 0)
149
+ return false;
150
+ if (tokens.length === 1 && tokens[0] === "-1")
151
+ return true;
152
+ const K = parseInt(tokens[0]);
153
+ if (isNaN(K) || K < 0)
154
+ return false;
155
+ return tokens.length === K + 1;
156
+ });
157
+ const isSingleLine = outputs.every((out) => out.trim().split("\n").length <= (variableArray ? 2 : 1));
158
+ const isSingleValue = outputs.every((out) => out
159
+ .trim()
160
+ .split("\n")
161
+ .every((line) => line.split(/\s+/).length == 1));
162
+ const tokensToConsider = variableArray ? parsedOutputs.map((tokens) => tokens.slice(1)).flat() : parsedOutputs.flat();
163
+ const isNumeric = (t) => /^-?(?:\d+\.\d+|\d+)$/.test(t);
164
+ const isNumericAll = tokensToConsider.every(isNumeric);
165
+ const hasVeryLargeNumber = tokensToConsider.some((t) => {
166
+ const digitsOnly = t.replace(/^-/, "").split(".")[0];
167
+ return digitsOnly.length >= 20;
168
+ });
169
+ const isBinaryOnly = (t) => /^[01]+$/.test(t);
170
+ const allBinary = tokensToConsider.length > 0 && tokensToConsider.every(isBinaryOnly);
171
+ const hasLongBinary = tokensToConsider.some((t) => t.length > 1);
172
+ const hasLeadingZero = tokensToConsider.some((t) => t.length > 1 && t.startsWith("0") && !t.startsWith("0."));
173
+ if (isNumericAll && !hasVeryLargeNumber && tokensToConsider.length > 0) {
174
+ if ((allBinary && hasLongBinary) || hasLeadingZero) {
175
+ returnType = "string";
176
+ }
177
+ else if (judgeType === "decimal") {
178
+ returnType = "float";
179
+ }
180
+ else if (mod !== undefined) {
181
+ returnType = "modint";
182
+ }
183
+ else {
184
+ returnType = "int";
185
+ }
186
+ }
187
+ else if (tokensToConsider.length > 0) {
188
+ const yesNoPairs = [
189
+ ["Yes", "No"],
190
+ ["YES", "NO"],
191
+ ["Possible", "Impossible"],
192
+ ["POSSIBLE", "IMPOSSIBLE"],
193
+ ["Takahashi", "Aoki"],
194
+ ];
195
+ for (const [y, n] of yesNoPairs) {
196
+ const isBoolean = (t) => t == y || t == n;
197
+ const isBooleanAll = tokensToConsider.every(isBoolean);
198
+ if (isBooleanAll) {
199
+ returnType = "bool";
200
+ yesStr = y;
201
+ noStr = n;
202
+ }
203
+ }
204
+ }
205
+ return {
206
+ returnType,
207
+ multipleColumns: !isSingleValue,
208
+ multipleRows: !isSingleLine && !multipleCases,
209
+ variableArray,
210
+ yesStr,
211
+ noStr,
212
+ };
213
+ }
214
+ //# sourceMappingURL=html-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../../src/analyzer/html-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./types";
2
+ export * from "./lexer";
3
+ export * from "./parser";
4
+ export * from "./analyzer";
5
+ export * from "./match";
6
+ export * from "./typing";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "./types";
2
+ export * from "./lexer";
3
+ export * from "./parser";
4
+ export * from "./analyzer";
5
+ export * from "./match";
6
+ export * from "./typing";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Token } from "./types.js";
2
+ export declare class Lexer {
3
+ private input;
4
+ private pos;
5
+ private line;
6
+ private column;
7
+ private rules;
8
+ private subscriptMap;
9
+ private subscriptMinusMap;
10
+ constructor(input: string);
11
+ private normalizeInput;
12
+ tokenize(): Token[];
13
+ }
14
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../src/analyzer/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AAQ9C,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,KAAK,CAaX;IAGF,OAAO,CAAC,YAAY,CA6BlB;IAGF,OAAO,CAAC,iBAAiB,CAEvB;gBAEU,KAAK,EAAE,MAAM;IAOzB,OAAO,CAAC,cAAc;IAkCf,QAAQ,IAAI,KAAK,EAAE;CAkD3B"}
@@ -0,0 +1,133 @@
1
+ export class Lexer {
2
+ input;
3
+ pos;
4
+ line;
5
+ column;
6
+ rules = [
7
+ { type: "newline", regex: /^(\r\n|\r|\n)/ },
8
+ { type: "space", regex: /^[ \t\u00a0]+/, skippable: true },
9
+ // LaTeX style dots \ldots, \cdots, \dots. Also plain ... and …
10
+ { type: "dots", regex: /^(\\ldots|\\cdots|\\dots|\.\.\.|…)/ },
11
+ { type: "vdots", regex: /^(\\vdots|⋮|:)/ },
12
+ { type: "subscript", regex: /^(_)/ }, // Unicode subscripts are handled separately before matching
13
+ { type: "number", regex: /^[0-9]+/ },
14
+ { type: "ident", regex: /^[a-zA-Z][a-zA-Z0-9]*/ },
15
+ { type: "binop", regex: /^[-+*/]/ },
16
+ { type: "lparen", regex: /^[{([[]/ }, // Match (, {, or [ (fixed regex)
17
+ { type: "rparen", regex: /^[})\]]/ }, // Match ), }, or ]
18
+ { type: "comma", regex: /^,/ },
19
+ ];
20
+ // Unicode subscript mapping
21
+ subscriptMap = {
22
+ "₀": "0",
23
+ "₁": "1",
24
+ "₂": "2",
25
+ "₃": "3",
26
+ "₄": "4",
27
+ "₅": "5",
28
+ "₆": "6",
29
+ "₇": "7",
30
+ "₈": "8",
31
+ "₉": "9",
32
+ ₐ: "a",
33
+ ₑ: "e",
34
+ ₕ: "h",
35
+ ᵢ: "i",
36
+ ⱼ: "j",
37
+ ₖ: "k",
38
+ ₗ: "l",
39
+ ₘ: "m",
40
+ ₙ: "n",
41
+ ₒ: "o",
42
+ ₚ: "p",
43
+ ᵣ: "r",
44
+ ₛ: "s",
45
+ ₜ: "t",
46
+ ᵤ: "u",
47
+ ᵥ: "v",
48
+ ₓ: "x",
49
+ // Add more if needed
50
+ };
51
+ // Unicode subscript minus
52
+ subscriptMinusMap = {
53
+ "₋": "-",
54
+ };
55
+ constructor(input) {
56
+ this.input = this.normalizeInput(input);
57
+ this.pos = 0;
58
+ this.line = 1;
59
+ this.column = 1;
60
+ }
61
+ normalizeInput(input) {
62
+ // Replace \mathrm{...} and \operatorname{...} with ...
63
+ // Repeatedly replace to handle nested or multiple occurrences
64
+ let currentInput = input;
65
+ const mathRmRegex = /\\(?:mathrm|operatorname|text)\{([^{}]+)\}/g;
66
+ while (mathRmRegex.test(currentInput)) {
67
+ currentInput = currentInput.replace(mathRmRegex, "$1");
68
+ }
69
+ // Replace LaTeX spacing commands like "\ ", "\,", "\;" with a single space
70
+ currentInput = currentInput.replace(/\\[,;: ]/g, ' ');
71
+ // Replace \hspace{...} with a space
72
+ currentInput = currentInput.replace(/\\hspace\{[^}]*\}/g, ' ');
73
+ let result = "";
74
+ let inSubscript = false;
75
+ for (const char of currentInput) {
76
+ if (this.subscriptMap[char] || this.subscriptMinusMap[char]) {
77
+ if (!inSubscript) {
78
+ result += "_";
79
+ inSubscript = true;
80
+ }
81
+ result += this.subscriptMap[char] || this.subscriptMinusMap[char];
82
+ }
83
+ else {
84
+ inSubscript = false;
85
+ result += char;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ tokenize() {
91
+ const tokens = [];
92
+ while (this.pos < this.input.length) {
93
+ const rest = this.input.slice(this.pos);
94
+ let matched = false;
95
+ for (const rule of this.rules) {
96
+ const match = rule.regex.exec(rest);
97
+ if (match) {
98
+ const value = match[0];
99
+ if (!rule.skippable) {
100
+ tokens.push({
101
+ type: rule.type,
102
+ value: rule.type === "number" ? parseInt(value, 10) : value,
103
+ line: this.line,
104
+ column: this.column,
105
+ });
106
+ }
107
+ // Update position
108
+ this.pos += value.length;
109
+ // Update line/column
110
+ const newlines = value.split("\n").length - 1;
111
+ if (newlines > 0) {
112
+ this.line += newlines;
113
+ const lastLineLen = value.split("\n").pop().length;
114
+ this.column = 1 + lastLineLen;
115
+ }
116
+ else {
117
+ this.column += value.length;
118
+ }
119
+ matched = true;
120
+ break;
121
+ }
122
+ }
123
+ if (!matched) {
124
+ // Instead of throwing, skip the character?
125
+ // Or throw. The prompt implies normal inputs.
126
+ throw new Error(`Unexpected character at line ${this.line}, column ${this.column}: ${rest[0]}`);
127
+ }
128
+ }
129
+ tokens.push({ type: "eof", line: this.line, column: this.column });
130
+ return tokens;
131
+ }
132
+ }
133
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/analyzer/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ASTNode, FormatNode } from "./types";
2
+ export declare class MatchError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export declare function evalAST(node: ASTNode, env: Record<string, any>): number;
6
+ export declare function matchFormat(node: FormatNode, input: string): Record<string, any>;
7
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/analyzer/match.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,UAAU,EAIX,MAAM,SAAS,CAAC;AAEjB,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CA8CvE;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoFrB"}
@@ -0,0 +1,133 @@
1
+ export class MatchError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "MatchError";
5
+ }
6
+ }
7
+ // Helper to evaluate AST expressions (BinOp, Number, Item)
8
+ export function evalAST(node, env) {
9
+ if (node.type === "number") {
10
+ return node.value;
11
+ }
12
+ if (node.type === "item") {
13
+ const item = node;
14
+ // Assuming variables used in indices are scalars (integers)
15
+ const val = env[item.name];
16
+ if (val === undefined) {
17
+ throw new MatchError(`Variable ${item.name} not found in environment during evaluation`);
18
+ }
19
+ // If val is an object (array/map), we can't use it directly in arithmetic unless we have indices
20
+ if (typeof val === "object") {
21
+ // If indices are provided, we should evaluate them.
22
+ // However, ASTNode for 'item' in LoopNode's start/end usually doesn't have complex indices in simplified AST?
23
+ // Let's handle simple cases first.
24
+ if (item.indices.length > 0) {
25
+ // Recursive evaluation for indices?
26
+ // For now, let's assume scalar variables for loop bounds.
27
+ throw new MatchError(`Array access in loop bounds not fully supported yet: ${item.name}`);
28
+ }
29
+ }
30
+ return Number(val);
31
+ }
32
+ if (node.type === "binop") {
33
+ const binop = node;
34
+ const left = evalAST(binop.left, env);
35
+ const right = evalAST(binop.right, env);
36
+ switch (binop.op) {
37
+ case "+":
38
+ return left + right;
39
+ case "-":
40
+ return left - right;
41
+ case "*":
42
+ return left * right;
43
+ case "/":
44
+ return Math.floor(left / right); // Integer division assumed?
45
+ default:
46
+ throw new MatchError(`Unknown operator ${binop.op}`);
47
+ }
48
+ }
49
+ throw new MatchError(`Unknown node type for evaluation: ${node.type}`);
50
+ }
51
+ export function matchFormat(node, input) {
52
+ // Tokenize input by whitespace
53
+ const tokens = input.trim().split(/\s+/);
54
+ if (tokens.length === 1 && tokens[0] === "") {
55
+ tokens.pop(); // Handle empty input
56
+ }
57
+ const env = {};
58
+ let tokenIndex = 0;
59
+ function consume() {
60
+ if (tokenIndex >= tokens.length) {
61
+ throw new MatchError("Unexpected end of input");
62
+ }
63
+ return tokens[tokenIndex++];
64
+ }
65
+ function processNode(ast, loopContext = {}) {
66
+ if (ast.type === "format") {
67
+ for (const child of ast.children) {
68
+ processNode(child, loopContext);
69
+ }
70
+ }
71
+ else if (ast.type === "item") {
72
+ const item = ast;
73
+ const value = consume();
74
+ // Determine indices
75
+ const indices = [];
76
+ for (const idxNode of item.indices) {
77
+ // Evaluate index expression. It might depend on loop variables.
78
+ // We merge env and loopContext for evaluation.
79
+ // loopContext variables (i, j, k) shadow env if conflict (though they shouldn't conflict with global vars usually)
80
+ indices.push(evalAST(idxNode, { ...env, ...loopContext }));
81
+ }
82
+ if (indices.length === 0) {
83
+ // Scalar
84
+ env[item.name] = value;
85
+ }
86
+ else {
87
+ // Array / Map
88
+ if (!env[item.name]) {
89
+ env[item.name] = {};
90
+ }
91
+ // Store in a nested object or flat map with key?
92
+ // Let's use string keys "i,j" for simplicity and compatibility with Python logic
93
+ const key = indices.join(",");
94
+ env[item.name][key] = value;
95
+ }
96
+ }
97
+ else if (ast.type === "loop") {
98
+ const loop = ast;
99
+ const start = evalAST(loop.start, { ...env, ...loopContext });
100
+ const end = evalAST(loop.end, { ...env, ...loopContext });
101
+ // Assuming inclusive range [start, end] ?
102
+ // In Analyzer.createLoop, start and end are indices.
103
+ // Usually standard loops are 0 to N-1 or 1 to N.
104
+ // Let's assume inclusive for now based on Analyzer logic usually preserving exact indices.
105
+ // We need to know if the loop is increasing or decreasing?
106
+ // Usually increasing.
107
+ const step = 1;
108
+ const count = Math.max(0, Math.floor((end - start) / step) + 1);
109
+ for (let i = 0; i < count; i++) {
110
+ const currentVal = start + i;
111
+ // Update loop context
112
+ const newLoopContext = { ...loopContext, [loop.variable]: currentVal };
113
+ for (const child of loop.body) {
114
+ processNode(child, newLoopContext);
115
+ }
116
+ }
117
+ }
118
+ else if (ast.type === "break") {
119
+ // Newline checks are implicit in whitespace tokenization
120
+ }
121
+ else if (ast.type === "dots") {
122
+ // dots should be handled by loop detection ideally.
123
+ // If we encounter dots here, it means analyzer didn't convert it to a loop?
124
+ // Or maybe it's just decorative?
125
+ // For matching, we might ignore it?
126
+ // But if it implies "read until end", that's hard.
127
+ // We assume AST is fully normalized to Loops.
128
+ }
129
+ }
130
+ processNode(node);
131
+ return env;
132
+ }
133
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/analyzer/match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Simple parser implementation for the format string.
3
+ * This should transform a stream of tokens into an AST (FormatNode).
4
+ */
5
+ import { Token, FormatNode } from "./types";
6
+ export declare class Parser {
7
+ private tokens;
8
+ private pos;
9
+ constructor(tokens: Token[]);
10
+ parse(): FormatNode;
11
+ private parseStatement;
12
+ private parseItem;
13
+ private parseExpression;
14
+ private parseAddSub;
15
+ private parseMulDiv;
16
+ private parseAtom;
17
+ private peek;
18
+ private consume;
19
+ }
20
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAW,UAAU,EAAmC,MAAM,SAAS,CAAC;AAEtF,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,GAAG,CAAa;gBAEZ,MAAM,EAAE,KAAK,EAAE;IAIpB,KAAK,IAAI,UAAU;IAS1B,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;CAGhB"}