atcoder-gui 0.1.7 → 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.
- package/README.md +7 -0
- package/dist/analyzer/analyzer.d.ts +16 -0
- package/dist/analyzer/analyzer.d.ts.map +1 -0
- package/dist/analyzer/analyzer.js +379 -0
- package/dist/analyzer/analyzer.js.map +1 -0
- package/dist/analyzer/html-parser.d.ts +24 -0
- package/dist/analyzer/html-parser.d.ts.map +1 -0
- package/dist/analyzer/html-parser.js +214 -0
- package/dist/analyzer/html-parser.js.map +1 -0
- package/dist/analyzer/index.d.ts +7 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +7 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/lexer.d.ts +14 -0
- package/dist/analyzer/lexer.d.ts.map +1 -0
- package/dist/analyzer/lexer.js +133 -0
- package/dist/analyzer/lexer.js.map +1 -0
- package/dist/analyzer/match.d.ts +7 -0
- package/dist/analyzer/match.d.ts.map +1 -0
- package/dist/analyzer/match.js +133 -0
- package/dist/analyzer/match.js.map +1 -0
- package/dist/analyzer/parser.d.ts +20 -0
- package/dist/analyzer/parser.d.ts.map +1 -0
- package/dist/analyzer/parser.js +135 -0
- package/dist/analyzer/parser.js.map +1 -0
- package/dist/analyzer/types.d.ts +54 -0
- package/dist/analyzer/types.d.ts.map +1 -0
- package/dist/analyzer/types.js +10 -0
- package/dist/analyzer/types.js.map +1 -0
- package/dist/analyzer/typing.d.ts +10 -0
- package/dist/analyzer/typing.d.ts.map +1 -0
- package/dist/analyzer/typing.js +246 -0
- package/dist/analyzer/typing.js.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +26 -1
- package/dist/browser.js.map +1 -1
- package/dist/build.d.ts +7 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +40 -0
- package/dist/build.js.map +1 -0
- package/dist/config.d.ts +10 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +31 -18
- package/dist/config.js.map +1 -1
- package/dist/config.json5 +16 -1
- package/dist/gen.d.ts +6 -12
- package/dist/gen.d.ts.map +1 -1
- package/dist/gen.js +153 -66
- package/dist/gen.js.map +1 -1
- package/dist/generator/checker.d.ts +2 -0
- package/dist/generator/checker.d.ts.map +1 -0
- package/dist/generator/checker.js +64 -0
- package/dist/generator/checker.js.map +1 -0
- package/dist/generator/cplusplus.d.ts +14 -0
- package/dist/generator/cplusplus.d.ts.map +1 -0
- package/dist/generator/cplusplus.js +43 -0
- package/dist/generator/cplusplus.js.map +1 -0
- package/dist/generator/fetcher.d.ts +2 -0
- package/dist/generator/fetcher.d.ts.map +1 -0
- package/dist/generator/fetcher.js +39 -0
- package/dist/generator/fetcher.js.map +1 -0
- package/dist/generator/pipeline.d.ts +25 -0
- package/dist/generator/pipeline.d.ts.map +1 -0
- package/dist/generator/pipeline.js +85 -0
- package/dist/generator/pipeline.js.map +1 -0
- package/dist/generator/python.d.ts +14 -0
- package/dist/generator/python.d.ts.map +1 -0
- package/dist/generator/python.js +41 -0
- package/dist/generator/python.js.map +1 -0
- package/dist/generator/types.d.ts +79 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/universal.d.ts +35 -0
- package/dist/generator/universal.d.ts.map +1 -0
- package/dist/generator/universal.js +524 -0
- package/dist/generator/universal.js.map +1 -0
- package/dist/generator/variable-extractor.d.ts +16 -0
- package/dist/generator/variable-extractor.d.ts.map +1 -0
- package/dist/generator/variable-extractor.js +103 -0
- package/dist/generator/variable-extractor.js.map +1 -0
- package/dist/main.d.ts +3 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +103 -102
- package/dist/main.js.map +1 -1
- package/dist/submit.d.ts +3 -2
- package/dist/submit.d.ts.map +1 -1
- package/dist/submit.js +48 -33
- package/dist/submit.js.map +1 -1
- package/dist/test.d.ts +10 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +127 -0
- package/dist/test.js.map +1 -0
- package/dist/tests/batch_check.d.ts +2 -0
- package/dist/tests/batch_check.d.ts.map +1 -0
- package/dist/tests/batch_check.js +46 -0
- package/dist/tests/batch_check.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +12 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +32 -0
- package/dist/utils.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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":"AAQA,MAAM,OAAO,KAAK;IACR,KAAK,CAAS;IACd,GAAG,CAAS;IACZ,IAAI,CAAS;IACb,MAAM,CAAS;IAEf,KAAK,GAAW;QACtB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE;QAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE;QAC1D,+DAA+D;QAC/D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,oCAAoC,EAAE;QAC7D,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE;QAC1C,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,4DAA4D;QAClG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE;QACjD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;QACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,kCAAkC;QACxE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,mBAAmB;QACzD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;KAC/B,CAAC;IAEF,4BAA4B;IACpB,YAAY,GAA2B;QAC7C,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,qBAAqB;KACtB,CAAC;IAEF,0BAA0B;IAClB,iBAAiB,GAA2B;QAClD,GAAG,EAAE,GAAG;KACT,CAAC;IAEF,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IAEO,cAAc,CAAC,KAAa;QAClC,uDAAuD;QACvD,8DAA8D;QAC9D,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,MAAM,WAAW,GAAG,6CAA6C,CAAC;QAClE,OAAO,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QAED,2EAA2E;QAC3E,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAEtD,oCAAoC;QACpC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAE/D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,GAAG,CAAC;oBACd,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;gBACD,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,KAAK,CAAC;gBACpB,MAAM,IAAI,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,QAAQ;QACb,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,OAAO,GAAG,KAAK,CAAC;YAEpB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAEvB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACpB,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK;4BAC3D,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,MAAM,EAAE,IAAI,CAAC,MAAM;yBACpB,CAAC,CAAC;oBACL,CAAC;oBAED,kBAAkB;oBAClB,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC;oBAEzB,qBAAqB;oBACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC9C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;wBACjB,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;wBACtB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAG,CAAC,MAAM,CAAC;wBACpD,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC;oBAChC,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;oBAC9B,CAAC;oBAED,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,2CAA2C;gBAC3C,8CAA8C;gBAC9C,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -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":"AASA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,UAAU,OAAO,CAAC,IAAa,EAAE,GAAwB;IAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAQ,IAAmB,CAAC,KAAK,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAgB,CAAC;QAC9B,4DAA4D;QAC5D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAClB,YAAY,IAAI,CAAC,IAAI,6CAA6C,CACnE,CAAC;QACJ,CAAC;QACD,iGAAiG;QACjG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,oDAAoD;YACpD,8GAA8G;YAC9G,mCAAmC;YACnC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,oCAAoC;gBACpC,0DAA0D;gBAC1D,MAAM,IAAI,UAAU,CAClB,wDAAwD,IAAI,CAAC,IAAI,EAAE,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAiB,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;YACjB,KAAK,GAAG;gBACN,OAAO,IAAI,GAAG,KAAK,CAAC;YACtB,KAAK,GAAG;gBACN,OAAO,IAAI,GAAG,KAAK,CAAC;YACtB,KAAK,GAAG;gBACN,OAAO,IAAI,GAAG,KAAK,CAAC;YACtB,KAAK,GAAG;gBACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,4BAA4B;YAC/D;gBACE,MAAM,IAAI,UAAU,CAAC,oBAAoB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAAgB,EAChB,KAAa;IAEb,+BAA+B;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,qBAAqB;IACrC,CAAC;IAED,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,SAAS,OAAO;QACd,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,WAAW,CAAC,GAAY,EAAE,cAAsC,EAAE;QACzE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAK,GAAkB,CAAC,QAAQ,EAAE,CAAC;gBACjD,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAe,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;YAExB,oBAAoB;YACpB,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnC,gEAAgE;gBAChE,+CAA+C;gBAC/C,mHAAmH;gBACnH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,SAAS;gBACT,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,cAAc;gBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACtB,CAAC;gBACD,iDAAiD;gBACjD,iFAAiF;gBACjF,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAe,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;YAC1D,0CAA0C;YAC1C,qDAAqD;YACrD,iDAAiD;YACjD,2FAA2F;YAE3F,2DAA2D;YAC3D,sBAAsB;YACtB,MAAM,IAAI,GAAG,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC7B,sBAAsB;gBACtB,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;gBACvE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC9B,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,yDAAyD;QAC3D,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,oDAAoD;YACpD,4EAA4E;YAC5E,iCAAiC;YACjC,oCAAoC;YACpC,mDAAmD;YACnD,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -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"}
|