redscript-mc 1.2.29 → 2.0.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/.claude/commands/build-test.md +10 -0
- package/.claude/commands/deploy-demo.md +12 -0
- package/.claude/commands/stage-status.md +13 -0
- package/.claude/settings.json +12 -0
- package/.github/workflows/ci.yml +1 -0
- package/CLAUDE.md +231 -0
- package/README.md +29 -28
- package/README.zh.md +28 -28
- package/demo.gif +0 -0
- package/dist/cli.js +2 -554
- package/dist/compile.js +2 -266
- package/dist/index.js +2 -159
- package/dist/lexer/index.js +9 -1
- package/dist/lowering/index.js +22 -5
- package/dist/src/__tests__/cli.test.d.ts +1 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/src/__tests__/codegen.test.d.ts +1 -0
- package/dist/src/__tests__/codegen.test.js +152 -0
- package/dist/src/__tests__/compile-all.test.d.ts +10 -0
- package/dist/src/__tests__/compile-all.test.js +108 -0
- package/dist/src/__tests__/dce.test.d.ts +1 -0
- package/dist/src/__tests__/dce.test.js +102 -0
- package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
- package/dist/src/__tests__/diagnostics.test.js +177 -0
- package/dist/src/__tests__/e2e.test.d.ts +6 -0
- package/dist/src/__tests__/e2e.test.js +1789 -0
- package/dist/src/__tests__/entity-types.test.d.ts +1 -0
- package/dist/src/__tests__/entity-types.test.js +203 -0
- package/dist/src/__tests__/formatter.test.d.ts +1 -0
- package/dist/src/__tests__/formatter.test.js +40 -0
- package/dist/src/__tests__/lexer.test.d.ts +1 -0
- package/dist/src/__tests__/lexer.test.js +343 -0
- package/dist/src/__tests__/lowering.test.d.ts +1 -0
- package/dist/src/__tests__/lowering.test.js +1015 -0
- package/dist/src/__tests__/macro.test.d.ts +8 -0
- package/dist/src/__tests__/macro.test.js +306 -0
- package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
- package/dist/src/__tests__/mc-integration.test.js +817 -0
- package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
- package/dist/src/__tests__/mc-syntax.test.js +124 -0
- package/dist/src/__tests__/nbt.test.d.ts +1 -0
- package/dist/src/__tests__/nbt.test.js +82 -0
- package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
- package/dist/src/__tests__/optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer.test.js +149 -0
- package/dist/src/__tests__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/parser.test.js +807 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.js +27 -0
- package/dist/src/__tests__/runtime.test.d.ts +1 -0
- package/dist/src/__tests__/runtime.test.js +289 -0
- package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
- package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
- package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-math.test.js +351 -0
- package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-vec.test.js +263 -0
- package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/structure-optimizer.test.js +33 -0
- package/dist/src/__tests__/typechecker.test.d.ts +1 -0
- package/dist/src/__tests__/typechecker.test.js +552 -0
- package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
- package/dist/src/__tests__/var-allocator.test.js +69 -0
- package/dist/src/ast/types.d.ts +515 -0
- package/dist/src/ast/types.js +9 -0
- package/dist/src/builtins/metadata.d.ts +36 -0
- package/dist/src/builtins/metadata.js +1014 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.js +443 -0
- package/dist/src/codegen/cmdblock/index.d.ts +26 -0
- package/dist/src/codegen/cmdblock/index.js +45 -0
- package/dist/src/codegen/mcfunction/index.d.ts +40 -0
- package/dist/src/codegen/mcfunction/index.js +606 -0
- package/dist/src/codegen/structure/index.d.ts +24 -0
- package/dist/src/codegen/structure/index.js +279 -0
- package/dist/src/codegen/var-allocator.d.ts +45 -0
- package/dist/src/codegen/var-allocator.js +104 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/src/diagnostics/index.d.ts +44 -0
- package/dist/src/diagnostics/index.js +140 -0
- package/dist/src/events/types.d.ts +35 -0
- package/dist/src/events/types.js +59 -0
- package/dist/src/formatter/index.d.ts +1 -0
- package/dist/src/formatter/index.js +26 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.js +45 -0
- package/dist/src/ir/builder.d.ts +33 -0
- package/dist/src/ir/builder.js +99 -0
- package/dist/src/ir/types.d.ts +132 -0
- package/dist/src/ir/types.js +15 -0
- package/dist/src/lexer/index.d.ts +37 -0
- package/dist/src/lexer/index.js +569 -0
- package/dist/src/lowering/index.d.ts +188 -0
- package/dist/src/lowering/index.js +3405 -0
- package/dist/src/mc-test/client.d.ts +128 -0
- package/dist/src/mc-test/client.js +174 -0
- package/dist/src/mc-test/runner.d.ts +28 -0
- package/dist/src/mc-test/runner.js +151 -0
- package/dist/src/mc-test/setup.d.ts +11 -0
- package/dist/src/mc-test/setup.js +98 -0
- package/dist/src/mc-validator/index.d.ts +17 -0
- package/dist/src/mc-validator/index.js +322 -0
- package/dist/src/nbt/index.d.ts +86 -0
- package/dist/src/nbt/index.js +250 -0
- package/dist/src/optimizer/commands.d.ts +38 -0
- package/dist/src/optimizer/commands.js +451 -0
- package/dist/src/optimizer/dce.d.ts +34 -0
- package/dist/src/optimizer/dce.js +639 -0
- package/dist/src/optimizer/passes.d.ts +34 -0
- package/dist/src/optimizer/passes.js +243 -0
- package/dist/src/optimizer/structure.d.ts +9 -0
- package/dist/src/optimizer/structure.js +356 -0
- package/dist/src/parser/index.d.ts +93 -0
- package/dist/src/parser/index.js +1687 -0
- package/dist/src/repl.d.ts +16 -0
- package/dist/src/repl.js +165 -0
- package/dist/src/runtime/index.d.ts +107 -0
- package/dist/src/runtime/index.js +1409 -0
- package/dist/src/typechecker/index.d.ts +61 -0
- package/dist/src/typechecker/index.js +1034 -0
- package/dist/src/types/entity-hierarchy.d.ts +29 -0
- package/dist/src/types/entity-hierarchy.js +107 -0
- package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src2/__tests__/e2e/basic.test.js +140 -0
- package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src2/__tests__/e2e/macros.test.js +182 -0
- package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
- package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
- package/dist/src2/__tests__/hir/desugar.test.js +234 -0
- package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/lower.test.js +559 -0
- package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/types.test.js +185 -0
- package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/verify.test.js +221 -0
- package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/verify.test.js +223 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
- package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src2/emit/compile.d.ts +19 -0
- package/dist/src2/emit/compile.js +80 -0
- package/dist/src2/emit/index.d.ts +17 -0
- package/dist/src2/emit/index.js +172 -0
- package/dist/src2/hir/lower.d.ts +15 -0
- package/dist/src2/hir/lower.js +378 -0
- package/dist/src2/hir/types.d.ts +373 -0
- package/dist/src2/hir/types.js +16 -0
- package/dist/src2/lir/lower.d.ts +15 -0
- package/dist/src2/lir/lower.js +453 -0
- package/dist/src2/lir/types.d.ts +136 -0
- package/dist/src2/lir/types.js +11 -0
- package/dist/src2/lir/verify.d.ts +14 -0
- package/dist/src2/lir/verify.js +113 -0
- package/dist/src2/mir/lower.d.ts +9 -0
- package/dist/src2/mir/lower.js +1030 -0
- package/dist/src2/mir/macro.d.ts +22 -0
- package/dist/src2/mir/macro.js +168 -0
- package/dist/src2/mir/types.d.ts +183 -0
- package/dist/src2/mir/types.js +11 -0
- package/dist/src2/mir/verify.d.ts +16 -0
- package/dist/src2/mir/verify.js +216 -0
- package/dist/src2/optimizer/block_merge.d.ts +12 -0
- package/dist/src2/optimizer/block_merge.js +84 -0
- package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src2/optimizer/branch_simplify.js +28 -0
- package/dist/src2/optimizer/constant_fold.d.ts +10 -0
- package/dist/src2/optimizer/constant_fold.js +85 -0
- package/dist/src2/optimizer/copy_prop.d.ts +9 -0
- package/dist/src2/optimizer/copy_prop.js +113 -0
- package/dist/src2/optimizer/dce.d.ts +8 -0
- package/dist/src2/optimizer/dce.js +155 -0
- package/dist/src2/optimizer/pipeline.d.ts +10 -0
- package/dist/src2/optimizer/pipeline.js +42 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/compiler-pipeline-redesign.md +2243 -0
- package/docs/optimization-ideas.md +1076 -0
- package/editors/vscode/package-lock.json +3 -3
- package/editors/vscode/package.json +1 -1
- package/examples/readme-demo.mcrs +44 -66
- package/jest.config.js +1 -1
- package/package.json +6 -5
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +59 -38
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/ast/types.ts +6 -1
- package/src/cli.ts +29 -156
- package/src/compile.ts +6 -162
- package/src/index.ts +14 -178
- package/src/lexer/index.ts +9 -1
- package/src/mc-test/runner.ts +4 -3
- package/src/parser/index.ts +1 -1
- package/src/repl.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src2/__tests__/e2e/basic.test.ts +154 -0
- package/src2/__tests__/e2e/macros.test.ts +199 -0
- package/src2/__tests__/e2e/migrate.test.ts +3008 -0
- package/src2/__tests__/hir/desugar.test.ts +263 -0
- package/src2/__tests__/lir/lower.test.ts +619 -0
- package/src2/__tests__/lir/types.test.ts +207 -0
- package/src2/__tests__/lir/verify.test.ts +249 -0
- package/src2/__tests__/mir/arithmetic.test.ts +156 -0
- package/src2/__tests__/mir/control-flow.test.ts +242 -0
- package/src2/__tests__/mir/verify.test.ts +254 -0
- package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src2/__tests__/optimizer/dce.test.ts +83 -0
- package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
- package/src2/emit/compile.ts +99 -0
- package/src2/emit/index.ts +222 -0
- package/src2/hir/lower.ts +428 -0
- package/src2/hir/types.ts +216 -0
- package/src2/lir/lower.ts +556 -0
- package/src2/lir/types.ts +109 -0
- package/src2/lir/verify.ts +129 -0
- package/src2/mir/lower.ts +1160 -0
- package/src2/mir/macro.ts +167 -0
- package/src2/mir/types.ts +106 -0
- package/src2/mir/verify.ts +218 -0
- package/src2/optimizer/block_merge.ts +93 -0
- package/src2/optimizer/branch_simplify.ts +27 -0
- package/src2/optimizer/constant_fold.ts +88 -0
- package/src2/optimizer/copy_prop.ts +106 -0
- package/src2/optimizer/dce.ts +133 -0
- package/src2/optimizer/pipeline.ts +44 -0
- package/tsconfig.json +2 -2
- package/src/__tests__/codegen.test.ts +0 -161
- package/src/__tests__/e2e.test.ts +0 -2039
- package/src/__tests__/entity-types.test.ts +0 -236
- package/src/__tests__/lowering.test.ts +0 -1185
- package/src/__tests__/macro.test.ts +0 -343
- package/src/__tests__/nbt.test.ts +0 -58
- package/src/__tests__/optimizer-advanced.test.ts +0 -144
- package/src/__tests__/optimizer.test.ts +0 -162
- package/src/__tests__/runtime.test.ts +0 -305
- package/src/__tests__/stdlib-advanced.test.ts +0 -379
- package/src/__tests__/stdlib-bigint.test.ts +0 -427
- package/src/__tests__/stdlib-math.test.ts +0 -374
- package/src/__tests__/stdlib-vec.test.ts +0 -259
- package/src/__tests__/structure-optimizer.test.ts +0 -38
- package/src/__tests__/var-allocator.test.ts +0 -75
- package/src/codegen/cmdblock/index.ts +0 -63
- package/src/codegen/mcfunction/index.ts +0 -662
- package/src/codegen/structure/index.ts +0 -346
- package/src/codegen/var-allocator.ts +0 -104
- package/src/ir/builder.ts +0 -116
- package/src/ir/types.ts +0 -134
- package/src/lowering/index.ts +0 -3860
- package/src/optimizer/commands.ts +0 -534
- package/src/optimizer/dce.ts +0 -679
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RedScript Diagnostics
|
|
4
|
+
*
|
|
5
|
+
* Error reporting with file path, line, column, and formatted error messages.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DiagnosticCollector = exports.DiagnosticError = void 0;
|
|
9
|
+
exports.parseErrorMessage = parseErrorMessage;
|
|
10
|
+
exports.formatError = formatError;
|
|
11
|
+
function formatSourcePointer(sourceLines, line, col) {
|
|
12
|
+
const lineIdx = line - 1;
|
|
13
|
+
if (lineIdx < 0 || lineIdx >= sourceLines.length) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const sourceLine = sourceLines[lineIdx];
|
|
17
|
+
const safeCol = Math.max(1, Math.min(col, sourceLine.length + 1));
|
|
18
|
+
const pointer = ` ${' '.repeat(safeCol - 1)}^`;
|
|
19
|
+
return [` ${sourceLine}`, pointer];
|
|
20
|
+
}
|
|
21
|
+
class DiagnosticError extends Error {
|
|
22
|
+
constructor(kind, message, location, sourceLines) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = 'DiagnosticError';
|
|
25
|
+
this.kind = kind;
|
|
26
|
+
this.location = location;
|
|
27
|
+
this.sourceLines = sourceLines;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Format the error for display:
|
|
31
|
+
* ```
|
|
32
|
+
* Error: [ParseError] line 5, col 12: Expected ';' after statement
|
|
33
|
+
* 5 | let x = 42
|
|
34
|
+
* ^ expected ';'
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
format() {
|
|
38
|
+
const { kind, message, location, sourceLines } = this;
|
|
39
|
+
const filePart = location.file ? `${location.file}:` : '';
|
|
40
|
+
const header = `Error: [${kind}] ${filePart}line ${location.line}, col ${location.col}: ${message}`;
|
|
41
|
+
if (!sourceLines || sourceLines.length === 0) {
|
|
42
|
+
return header;
|
|
43
|
+
}
|
|
44
|
+
const pointerLines = formatSourcePointer(sourceLines, location.line, location.col);
|
|
45
|
+
if (pointerLines.length === 0) {
|
|
46
|
+
return header;
|
|
47
|
+
}
|
|
48
|
+
const lineNum = String(location.line).padStart(3);
|
|
49
|
+
const prefix = `${lineNum} | `;
|
|
50
|
+
const sourceLine = sourceLines[location.line - 1];
|
|
51
|
+
const safeCol = Math.max(1, Math.min(location.col, sourceLine.length + 1));
|
|
52
|
+
const pointer = ' '.repeat(prefix.length + safeCol - 1) + '^';
|
|
53
|
+
const hint = message.toLowerCase().includes('expected')
|
|
54
|
+
? message.split(':').pop()?.trim() || ''
|
|
55
|
+
: '';
|
|
56
|
+
return [
|
|
57
|
+
header,
|
|
58
|
+
`${prefix}${sourceLine}`,
|
|
59
|
+
`${pointer}${hint ? ` ${hint}` : ''}`,
|
|
60
|
+
].join('\n');
|
|
61
|
+
}
|
|
62
|
+
toString() {
|
|
63
|
+
return this.format();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.DiagnosticError = DiagnosticError;
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Diagnostic Collection
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
class DiagnosticCollector {
|
|
71
|
+
constructor(source, filePath) {
|
|
72
|
+
this.diagnostics = [];
|
|
73
|
+
this.sourceLines = [];
|
|
74
|
+
if (source) {
|
|
75
|
+
this.sourceLines = source.split('\n');
|
|
76
|
+
}
|
|
77
|
+
this.filePath = filePath;
|
|
78
|
+
}
|
|
79
|
+
error(kind, message, line, col) {
|
|
80
|
+
const diagnostic = new DiagnosticError(kind, message, { file: this.filePath, line, col }, this.sourceLines);
|
|
81
|
+
this.diagnostics.push(diagnostic);
|
|
82
|
+
}
|
|
83
|
+
hasErrors() {
|
|
84
|
+
return this.diagnostics.length > 0;
|
|
85
|
+
}
|
|
86
|
+
getErrors() {
|
|
87
|
+
return this.diagnostics;
|
|
88
|
+
}
|
|
89
|
+
formatAll() {
|
|
90
|
+
return this.diagnostics.map(d => d.format()).join('\n\n');
|
|
91
|
+
}
|
|
92
|
+
throwFirst() {
|
|
93
|
+
if (this.diagnostics.length > 0) {
|
|
94
|
+
throw this.diagnostics[0];
|
|
95
|
+
}
|
|
96
|
+
throw new Error('No diagnostics to throw');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.DiagnosticCollector = DiagnosticCollector;
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Helper Functions
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
/**
|
|
104
|
+
* Create a DiagnosticError from a raw error message that includes line/col info
|
|
105
|
+
* e.g., "Expected ';' at line 5, col 12"
|
|
106
|
+
*/
|
|
107
|
+
function parseErrorMessage(kind, rawMessage, sourceLines, filePath) {
|
|
108
|
+
// Try to extract line and col from message
|
|
109
|
+
const match = rawMessage.match(/at line (\d+), col (\d+)/);
|
|
110
|
+
if (match) {
|
|
111
|
+
const line = parseInt(match[1], 10);
|
|
112
|
+
const col = parseInt(match[2], 10);
|
|
113
|
+
const message = rawMessage.replace(/ at line \d+, col \d+$/, '').trim();
|
|
114
|
+
return new DiagnosticError(kind, message, { file: filePath, line, col }, sourceLines);
|
|
115
|
+
}
|
|
116
|
+
// Fallback: line 1, col 1
|
|
117
|
+
return new DiagnosticError(kind, rawMessage, { file: filePath, line: 1, col: 1 }, sourceLines);
|
|
118
|
+
}
|
|
119
|
+
function formatError(error, source) {
|
|
120
|
+
if (error instanceof DiagnosticError) {
|
|
121
|
+
const sourceLines = source?.split('\n') ?? error.sourceLines ?? [];
|
|
122
|
+
const { file, line, col } = error.location;
|
|
123
|
+
const locationPart = file
|
|
124
|
+
? ` in ${file} at line ${line}, col ${col}`
|
|
125
|
+
: ` at line ${line}, col ${col}`;
|
|
126
|
+
const lines = [`Error${locationPart}:`];
|
|
127
|
+
const pointerLines = formatSourcePointer(sourceLines, line, col);
|
|
128
|
+
if (pointerLines.length > 0) {
|
|
129
|
+
lines.push(...pointerLines);
|
|
130
|
+
}
|
|
131
|
+
lines.push(error.message);
|
|
132
|
+
return lines.join('\n');
|
|
133
|
+
}
|
|
134
|
+
if (!source) {
|
|
135
|
+
return error.message;
|
|
136
|
+
}
|
|
137
|
+
const parsed = parseErrorMessage('ParseError', error.message, source.split('\n'));
|
|
138
|
+
return formatError(parsed, source);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TypeNode } from '../ast/types';
|
|
2
|
+
export declare const EVENT_TYPES: {
|
|
3
|
+
readonly PlayerDeath: {
|
|
4
|
+
readonly tag: "rs.just_died";
|
|
5
|
+
readonly params: readonly ["player: Player"];
|
|
6
|
+
readonly detection: "scoreboard";
|
|
7
|
+
};
|
|
8
|
+
readonly PlayerJoin: {
|
|
9
|
+
readonly tag: "rs.just_joined";
|
|
10
|
+
readonly params: readonly ["player: Player"];
|
|
11
|
+
readonly detection: "tag";
|
|
12
|
+
};
|
|
13
|
+
readonly BlockBreak: {
|
|
14
|
+
readonly tag: "rs.just_broke_block";
|
|
15
|
+
readonly params: readonly ["player: Player", "block: string"];
|
|
16
|
+
readonly detection: "advancement";
|
|
17
|
+
};
|
|
18
|
+
readonly EntityKill: {
|
|
19
|
+
readonly tag: "rs.just_killed";
|
|
20
|
+
readonly params: readonly ["player: Player"];
|
|
21
|
+
readonly detection: "scoreboard";
|
|
22
|
+
};
|
|
23
|
+
readonly ItemUse: {
|
|
24
|
+
readonly tag: "rs.just_used_item";
|
|
25
|
+
readonly params: readonly ["player: Player"];
|
|
26
|
+
readonly detection: "scoreboard";
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export type EventTypeName = keyof typeof EVENT_TYPES;
|
|
30
|
+
export interface EventParamSpec {
|
|
31
|
+
name: string;
|
|
32
|
+
type: TypeNode;
|
|
33
|
+
}
|
|
34
|
+
export declare function isEventTypeName(value: string): value is EventTypeName;
|
|
35
|
+
export declare function getEventParamSpecs(eventType: EventTypeName): EventParamSpec[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVENT_TYPES = void 0;
|
|
4
|
+
exports.isEventTypeName = isEventTypeName;
|
|
5
|
+
exports.getEventParamSpecs = getEventParamSpecs;
|
|
6
|
+
exports.EVENT_TYPES = {
|
|
7
|
+
PlayerDeath: {
|
|
8
|
+
tag: 'rs.just_died',
|
|
9
|
+
params: ['player: Player'],
|
|
10
|
+
detection: 'scoreboard',
|
|
11
|
+
},
|
|
12
|
+
PlayerJoin: {
|
|
13
|
+
tag: 'rs.just_joined',
|
|
14
|
+
params: ['player: Player'],
|
|
15
|
+
detection: 'tag',
|
|
16
|
+
},
|
|
17
|
+
BlockBreak: {
|
|
18
|
+
tag: 'rs.just_broke_block',
|
|
19
|
+
params: ['player: Player', 'block: string'],
|
|
20
|
+
detection: 'advancement',
|
|
21
|
+
},
|
|
22
|
+
EntityKill: {
|
|
23
|
+
tag: 'rs.just_killed',
|
|
24
|
+
params: ['player: Player'],
|
|
25
|
+
detection: 'scoreboard',
|
|
26
|
+
},
|
|
27
|
+
ItemUse: {
|
|
28
|
+
tag: 'rs.just_used_item',
|
|
29
|
+
params: ['player: Player'],
|
|
30
|
+
detection: 'scoreboard',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
function isEventTypeName(value) {
|
|
34
|
+
return value in exports.EVENT_TYPES;
|
|
35
|
+
}
|
|
36
|
+
function getEventParamSpecs(eventType) {
|
|
37
|
+
return exports.EVENT_TYPES[eventType].params.map(parseEventParam);
|
|
38
|
+
}
|
|
39
|
+
function parseEventParam(spec) {
|
|
40
|
+
const match = spec.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
41
|
+
if (!match) {
|
|
42
|
+
throw new Error(`Invalid event parameter spec: ${spec}`);
|
|
43
|
+
}
|
|
44
|
+
const [, name, typeName] = match;
|
|
45
|
+
return {
|
|
46
|
+
name,
|
|
47
|
+
type: toTypeNode(typeName),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function toTypeNode(typeName) {
|
|
51
|
+
if (typeName === 'Player') {
|
|
52
|
+
return { kind: 'entity', entityType: 'Player' };
|
|
53
|
+
}
|
|
54
|
+
if (typeName === 'string' || typeName === 'int' || typeName === 'bool' || typeName === 'float' || typeName === 'void' || typeName === 'BlockPos' || typeName === 'byte' || typeName === 'short' || typeName === 'long' || typeName === 'double') {
|
|
55
|
+
return { kind: 'named', name: typeName };
|
|
56
|
+
}
|
|
57
|
+
return { kind: 'struct', name: typeName };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function format(source: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.format = format;
|
|
4
|
+
function format(source) {
|
|
5
|
+
const lines = source.split("\n");
|
|
6
|
+
let indent = 0;
|
|
7
|
+
const result = [];
|
|
8
|
+
for (let line of lines) {
|
|
9
|
+
line = line.trim();
|
|
10
|
+
if (!line) {
|
|
11
|
+
result.push("");
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
// Decrease indent before }
|
|
15
|
+
if (line.startsWith("}"))
|
|
16
|
+
indent = Math.max(0, indent - 1);
|
|
17
|
+
// Add indentation
|
|
18
|
+
result.push(" ".repeat(indent) + line);
|
|
19
|
+
// Increase indent after {
|
|
20
|
+
if (line.endsWith("{"))
|
|
21
|
+
indent++;
|
|
22
|
+
}
|
|
23
|
+
// Ensure single newline at end
|
|
24
|
+
return result.join("\n").trimEnd() + "\n";
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RedScript Compiler
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for programmatic usage.
|
|
5
|
+
*/
|
|
6
|
+
export declare const version = "2.0.0";
|
|
7
|
+
export { compile, CompileOptions, CompileResult } from '../src2/emit/compile';
|
|
8
|
+
export type { DatapackFile } from '../src2/emit/index';
|
|
9
|
+
export { Lexer } from './lexer';
|
|
10
|
+
export { Parser } from './parser';
|
|
11
|
+
export { preprocessSource, preprocessSourceWithMetadata } from './compile';
|
|
12
|
+
export { MCCommandValidator } from './mc-validator';
|
|
13
|
+
export type { Program, FnDecl, Expr, Stmt, Span } from './ast/types';
|
|
14
|
+
export type { DiagnosticError } from './diagnostics';
|
|
15
|
+
/**
|
|
16
|
+
* Check RedScript source code for errors without generating output.
|
|
17
|
+
*
|
|
18
|
+
* @param source - The RedScript source code
|
|
19
|
+
* @param namespace - Optional namespace
|
|
20
|
+
* @returns null if no errors, or an error object
|
|
21
|
+
*/
|
|
22
|
+
export declare function check(source: string, namespace?: string, filePath?: string): Error | null;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RedScript Compiler
|
|
4
|
+
*
|
|
5
|
+
* Main entry point for programmatic usage.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.MCCommandValidator = exports.preprocessSourceWithMetadata = exports.preprocessSource = exports.Parser = exports.Lexer = exports.compile = exports.version = void 0;
|
|
9
|
+
exports.check = check;
|
|
10
|
+
exports.version = '2.0.0';
|
|
11
|
+
const lexer_1 = require("./lexer");
|
|
12
|
+
const parser_1 = require("./parser");
|
|
13
|
+
const compile_1 = require("./compile");
|
|
14
|
+
// Re-export v2 compile API
|
|
15
|
+
var compile_2 = require("../src2/emit/compile");
|
|
16
|
+
Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_2.compile; } });
|
|
17
|
+
// Re-export utilities
|
|
18
|
+
var lexer_2 = require("./lexer");
|
|
19
|
+
Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_2.Lexer; } });
|
|
20
|
+
var parser_2 = require("./parser");
|
|
21
|
+
Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_2.Parser; } });
|
|
22
|
+
var compile_3 = require("./compile");
|
|
23
|
+
Object.defineProperty(exports, "preprocessSource", { enumerable: true, get: function () { return compile_3.preprocessSource; } });
|
|
24
|
+
Object.defineProperty(exports, "preprocessSourceWithMetadata", { enumerable: true, get: function () { return compile_3.preprocessSourceWithMetadata; } });
|
|
25
|
+
var mc_validator_1 = require("./mc-validator");
|
|
26
|
+
Object.defineProperty(exports, "MCCommandValidator", { enumerable: true, get: function () { return mc_validator_1.MCCommandValidator; } });
|
|
27
|
+
/**
|
|
28
|
+
* Check RedScript source code for errors without generating output.
|
|
29
|
+
*
|
|
30
|
+
* @param source - The RedScript source code
|
|
31
|
+
* @param namespace - Optional namespace
|
|
32
|
+
* @returns null if no errors, or an error object
|
|
33
|
+
*/
|
|
34
|
+
function check(source, namespace = 'redscript', filePath) {
|
|
35
|
+
try {
|
|
36
|
+
const preprocessedSource = (0, compile_1.preprocessSource)(source, { filePath });
|
|
37
|
+
const tokens = new lexer_1.Lexer(preprocessedSource, filePath).tokenize();
|
|
38
|
+
new parser_1.Parser(tokens, preprocessedSource, filePath).parse(namespace);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IRBuilder — helper for constructing IR programmatically.
|
|
3
|
+
* AST → IR lowering uses this.
|
|
4
|
+
*/
|
|
5
|
+
import type { IRFunction, IRInstr, IRModule, Operand } from './types';
|
|
6
|
+
export declare class IRBuilder {
|
|
7
|
+
private tempCount;
|
|
8
|
+
private labelCount;
|
|
9
|
+
private currentBlock;
|
|
10
|
+
private blocks;
|
|
11
|
+
private locals;
|
|
12
|
+
freshTemp(): string;
|
|
13
|
+
freshLabel(hint?: string): string;
|
|
14
|
+
startBlock(label: string): void;
|
|
15
|
+
private get block();
|
|
16
|
+
private sealBlock;
|
|
17
|
+
emitAssign(dst: string, src: Operand): void;
|
|
18
|
+
emitBinop(dst: string, lhs: Operand, bop: IRInstr & {
|
|
19
|
+
op: 'binop';
|
|
20
|
+
} extends {
|
|
21
|
+
bop: infer B;
|
|
22
|
+
} ? B : never, rhs: Operand): void;
|
|
23
|
+
emitCmp(dst: string, lhs: Operand, cop: '==' | '!=' | '<' | '<=' | '>' | '>=', rhs: Operand): void;
|
|
24
|
+
emitCall(fn: string, args: Operand[], dst?: string): void;
|
|
25
|
+
emitRaw(cmd: string): void;
|
|
26
|
+
emitJump(target: string): void;
|
|
27
|
+
emitJumpIf(cond: string, then: string, else_: string): void;
|
|
28
|
+
emitReturn(value?: Operand): void;
|
|
29
|
+
emitTickYield(continuation: string): void;
|
|
30
|
+
build(name: string, params: string[], isTickLoop?: boolean): IRFunction;
|
|
31
|
+
}
|
|
32
|
+
import type { GlobalVar } from './types';
|
|
33
|
+
export declare function buildModule(namespace: string, fns: IRFunction[], globals?: GlobalVar[]): IRModule;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IRBuilder — helper for constructing IR programmatically.
|
|
4
|
+
* AST → IR lowering uses this.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.IRBuilder = void 0;
|
|
8
|
+
exports.buildModule = buildModule;
|
|
9
|
+
class IRBuilder {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.tempCount = 0;
|
|
12
|
+
this.labelCount = 0;
|
|
13
|
+
this.currentBlock = null;
|
|
14
|
+
this.blocks = [];
|
|
15
|
+
this.locals = new Set();
|
|
16
|
+
}
|
|
17
|
+
// -------------------------------------------------------------------------
|
|
18
|
+
// Names
|
|
19
|
+
// -------------------------------------------------------------------------
|
|
20
|
+
freshTemp() {
|
|
21
|
+
const name = `$t${this.tempCount++}`;
|
|
22
|
+
this.locals.add(name);
|
|
23
|
+
return name;
|
|
24
|
+
}
|
|
25
|
+
freshLabel(hint = 'L') {
|
|
26
|
+
return `${hint}_${this.labelCount++}`;
|
|
27
|
+
}
|
|
28
|
+
// -------------------------------------------------------------------------
|
|
29
|
+
// Block management
|
|
30
|
+
// -------------------------------------------------------------------------
|
|
31
|
+
startBlock(label) {
|
|
32
|
+
this.currentBlock = { label, instrs: [], term: { op: 'return' } };
|
|
33
|
+
}
|
|
34
|
+
get block() {
|
|
35
|
+
if (!this.currentBlock)
|
|
36
|
+
throw new Error('No active block');
|
|
37
|
+
return this.currentBlock;
|
|
38
|
+
}
|
|
39
|
+
sealBlock(term) {
|
|
40
|
+
this.block.term = term;
|
|
41
|
+
this.blocks.push(this.block);
|
|
42
|
+
this.currentBlock = null;
|
|
43
|
+
}
|
|
44
|
+
// -------------------------------------------------------------------------
|
|
45
|
+
// Emit instructions
|
|
46
|
+
// -------------------------------------------------------------------------
|
|
47
|
+
emitAssign(dst, src) {
|
|
48
|
+
this.locals.add(dst);
|
|
49
|
+
this.block.instrs.push({ op: 'assign', dst, src });
|
|
50
|
+
}
|
|
51
|
+
emitBinop(dst, lhs, bop, rhs) {
|
|
52
|
+
this.locals.add(dst);
|
|
53
|
+
this.block.instrs.push({ op: 'binop', dst, lhs, bop, rhs });
|
|
54
|
+
}
|
|
55
|
+
emitCmp(dst, lhs, cop, rhs) {
|
|
56
|
+
this.locals.add(dst);
|
|
57
|
+
this.block.instrs.push({ op: 'cmp', dst, lhs, cop, rhs });
|
|
58
|
+
}
|
|
59
|
+
emitCall(fn, args, dst) {
|
|
60
|
+
if (dst)
|
|
61
|
+
this.locals.add(dst);
|
|
62
|
+
this.block.instrs.push({ op: 'call', fn, args, dst });
|
|
63
|
+
}
|
|
64
|
+
emitRaw(cmd) {
|
|
65
|
+
this.block.instrs.push({ op: 'raw', cmd });
|
|
66
|
+
}
|
|
67
|
+
// -------------------------------------------------------------------------
|
|
68
|
+
// Terminators
|
|
69
|
+
// -------------------------------------------------------------------------
|
|
70
|
+
emitJump(target) {
|
|
71
|
+
this.sealBlock({ op: 'jump', target });
|
|
72
|
+
}
|
|
73
|
+
emitJumpIf(cond, then, else_) {
|
|
74
|
+
this.sealBlock({ op: 'jump_if', cond, then, else_ });
|
|
75
|
+
}
|
|
76
|
+
emitReturn(value) {
|
|
77
|
+
this.sealBlock({ op: 'return', value });
|
|
78
|
+
}
|
|
79
|
+
emitTickYield(continuation) {
|
|
80
|
+
this.sealBlock({ op: 'tick_yield', continuation });
|
|
81
|
+
}
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
// Build
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
build(name, params, isTickLoop = false) {
|
|
86
|
+
return {
|
|
87
|
+
name,
|
|
88
|
+
params,
|
|
89
|
+
locals: Array.from(this.locals),
|
|
90
|
+
blocks: this.blocks,
|
|
91
|
+
isTickLoop,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.IRBuilder = IRBuilder;
|
|
96
|
+
function buildModule(namespace, fns, globals = []) {
|
|
97
|
+
return { namespace, functions: fns, globals };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RedScript IR — Three-Address Code (TAC)
|
|
3
|
+
*
|
|
4
|
+
* Compilation pipeline:
|
|
5
|
+
* Source → AST → IR → (optimize) → CodeGen → mcfunction / cmdblock
|
|
6
|
+
*
|
|
7
|
+
* Variable storage in MC Java Edition:
|
|
8
|
+
* - Integer vars → scoreboard fake player ($name on objective "rs_vars")
|
|
9
|
+
* - Complex data → NBT storage (redscript:stack / redscript:heap)
|
|
10
|
+
* - Return value → fake player $ret
|
|
11
|
+
* - Temporaries → $_0, $_1, ...
|
|
12
|
+
*/
|
|
13
|
+
export type Operand = {
|
|
14
|
+
kind: 'var';
|
|
15
|
+
name: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'const';
|
|
18
|
+
value: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'storage';
|
|
21
|
+
path: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'param';
|
|
24
|
+
index: number;
|
|
25
|
+
};
|
|
26
|
+
export type BinOp = '+' | '-' | '*' | '/' | '%';
|
|
27
|
+
export type CmpOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
|
|
28
|
+
export type IRInstr = {
|
|
29
|
+
op: 'assign';
|
|
30
|
+
dst: string;
|
|
31
|
+
src: Operand;
|
|
32
|
+
} | {
|
|
33
|
+
op: 'binop';
|
|
34
|
+
dst: string;
|
|
35
|
+
lhs: Operand;
|
|
36
|
+
bop: BinOp;
|
|
37
|
+
rhs: Operand;
|
|
38
|
+
} | {
|
|
39
|
+
op: 'cmp';
|
|
40
|
+
dst: string;
|
|
41
|
+
lhs: Operand;
|
|
42
|
+
cop: CmpOp;
|
|
43
|
+
rhs: Operand;
|
|
44
|
+
} | {
|
|
45
|
+
op: 'jump';
|
|
46
|
+
target: string;
|
|
47
|
+
} | {
|
|
48
|
+
op: 'jump_if';
|
|
49
|
+
cond: string;
|
|
50
|
+
target: string;
|
|
51
|
+
} | {
|
|
52
|
+
op: 'jump_unless';
|
|
53
|
+
cond: string;
|
|
54
|
+
target: string;
|
|
55
|
+
} | {
|
|
56
|
+
op: 'call';
|
|
57
|
+
fn: string;
|
|
58
|
+
args: Operand[];
|
|
59
|
+
dst?: string;
|
|
60
|
+
} | {
|
|
61
|
+
op: 'return';
|
|
62
|
+
value?: Operand;
|
|
63
|
+
} | {
|
|
64
|
+
op: 'label';
|
|
65
|
+
id: string;
|
|
66
|
+
} | {
|
|
67
|
+
op: 'raw';
|
|
68
|
+
cmd: string;
|
|
69
|
+
} | {
|
|
70
|
+
op: 'tick_yield';
|
|
71
|
+
};
|
|
72
|
+
export type Terminator = {
|
|
73
|
+
op: 'jump';
|
|
74
|
+
target: string;
|
|
75
|
+
} | {
|
|
76
|
+
op: 'jump_if';
|
|
77
|
+
cond: string;
|
|
78
|
+
then: string;
|
|
79
|
+
else_: string;
|
|
80
|
+
} | {
|
|
81
|
+
op: 'jump_unless';
|
|
82
|
+
cond: string;
|
|
83
|
+
then: string;
|
|
84
|
+
else_: string;
|
|
85
|
+
} | {
|
|
86
|
+
op: 'return';
|
|
87
|
+
value?: Operand;
|
|
88
|
+
} | {
|
|
89
|
+
op: 'tick_yield';
|
|
90
|
+
continuation: string;
|
|
91
|
+
};
|
|
92
|
+
export interface IRBlock {
|
|
93
|
+
label: string;
|
|
94
|
+
instrs: IRInstr[];
|
|
95
|
+
term: Terminator;
|
|
96
|
+
}
|
|
97
|
+
export interface IRCommand {
|
|
98
|
+
cmd: string;
|
|
99
|
+
conditional?: boolean;
|
|
100
|
+
label?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface IRFunction {
|
|
103
|
+
name: string;
|
|
104
|
+
params: string[];
|
|
105
|
+
locals: string[];
|
|
106
|
+
blocks: IRBlock[];
|
|
107
|
+
commands?: IRCommand[];
|
|
108
|
+
isTickLoop?: boolean;
|
|
109
|
+
isLoadInit?: boolean;
|
|
110
|
+
requiredLoads?: string[];
|
|
111
|
+
isTriggerHandler?: boolean;
|
|
112
|
+
triggerName?: string;
|
|
113
|
+
eventTrigger?: {
|
|
114
|
+
kind: 'advancement' | 'craft' | 'death' | 'login' | 'join_team';
|
|
115
|
+
value?: string;
|
|
116
|
+
};
|
|
117
|
+
eventHandler?: {
|
|
118
|
+
eventType: string;
|
|
119
|
+
tag: string;
|
|
120
|
+
};
|
|
121
|
+
isMacroFunction?: boolean;
|
|
122
|
+
macroParamNames?: string[];
|
|
123
|
+
}
|
|
124
|
+
export interface GlobalVar {
|
|
125
|
+
name: string;
|
|
126
|
+
init: number;
|
|
127
|
+
}
|
|
128
|
+
export interface IRModule {
|
|
129
|
+
namespace: string;
|
|
130
|
+
functions: IRFunction[];
|
|
131
|
+
globals: GlobalVar[];
|
|
132
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RedScript IR — Three-Address Code (TAC)
|
|
4
|
+
*
|
|
5
|
+
* Compilation pipeline:
|
|
6
|
+
* Source → AST → IR → (optimize) → CodeGen → mcfunction / cmdblock
|
|
7
|
+
*
|
|
8
|
+
* Variable storage in MC Java Edition:
|
|
9
|
+
* - Integer vars → scoreboard fake player ($name on objective "rs_vars")
|
|
10
|
+
* - Complex data → NBT storage (redscript:stack / redscript:heap)
|
|
11
|
+
* - Return value → fake player $ret
|
|
12
|
+
* - Temporaries → $_0, $_1, ...
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RedScript Lexer
|
|
3
|
+
*
|
|
4
|
+
* Tokenizes RedScript source code into a stream of tokens.
|
|
5
|
+
* Handles special cases like entity selectors vs decorators,
|
|
6
|
+
* range literals, and raw commands.
|
|
7
|
+
*/
|
|
8
|
+
export type TokenKind = 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match' | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module' | 'execute' | 'run' | 'unless' | 'declare' | 'int' | 'bool' | 'float' | 'string' | 'void' | 'BlockPos' | 'true' | 'false' | 'selector' | 'decorator' | 'int_lit' | 'float_lit' | 'byte_lit' | 'short_lit' | 'long_lit' | 'double_lit' | 'string_lit' | 'f_string' | 'range_lit' | 'rel_coord' | 'local_coord' | '+' | '-' | '*' | '/' | '%' | '~' | '^' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '!' | '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '{' | '}' | '(' | ')' | '[' | ']' | ',' | ';' | ':' | '::' | '->' | '=>' | '.' | 'ident' | 'mc_name' | 'raw_cmd' | 'eof';
|
|
9
|
+
export interface Token {
|
|
10
|
+
kind: TokenKind;
|
|
11
|
+
value: string;
|
|
12
|
+
line: number;
|
|
13
|
+
col: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class Lexer {
|
|
16
|
+
private source;
|
|
17
|
+
private sourceLines;
|
|
18
|
+
private pos;
|
|
19
|
+
private line;
|
|
20
|
+
private col;
|
|
21
|
+
private tokens;
|
|
22
|
+
private filePath?;
|
|
23
|
+
constructor(source: string, filePath?: string);
|
|
24
|
+
private error;
|
|
25
|
+
tokenize(): Token[];
|
|
26
|
+
private isAtEnd;
|
|
27
|
+
private peek;
|
|
28
|
+
private advance;
|
|
29
|
+
private addToken;
|
|
30
|
+
private scanToken;
|
|
31
|
+
private scanAtToken;
|
|
32
|
+
private scanSelectorParams;
|
|
33
|
+
private scanString;
|
|
34
|
+
private scanFString;
|
|
35
|
+
private scanNumber;
|
|
36
|
+
private scanIdentifier;
|
|
37
|
+
}
|