freelang-v4 4.3.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 (261) hide show
  1. package/README.md +548 -0
  2. package/dist/ast.d.ts +367 -0
  3. package/dist/ast.js +4 -0
  4. package/dist/ast.js.map +1 -0
  5. package/dist/async-basic.test.d.ts +1 -0
  6. package/dist/async-basic.test.js +88 -0
  7. package/dist/async-basic.test.js.map +1 -0
  8. package/dist/async-jest.test.d.ts +1 -0
  9. package/dist/async-jest.test.js +99 -0
  10. package/dist/async-jest.test.js.map +1 -0
  11. package/dist/channel-jest.test.d.ts +1 -0
  12. package/dist/channel-jest.test.js +148 -0
  13. package/dist/channel-jest.test.js.map +1 -0
  14. package/dist/checker-jest.test.d.ts +1 -0
  15. package/dist/checker-jest.test.js +160 -0
  16. package/dist/checker-jest.test.js.map +1 -0
  17. package/dist/checker.d.ts +149 -0
  18. package/dist/checker.js +1565 -0
  19. package/dist/checker.js.map +1 -0
  20. package/dist/checker.test.d.ts +1 -0
  21. package/dist/checker.test.js +217 -0
  22. package/dist/checker.test.js.map +1 -0
  23. package/dist/compiler-jest.test.d.ts +1 -0
  24. package/dist/compiler-jest.test.js +233 -0
  25. package/dist/compiler-jest.test.js.map +1 -0
  26. package/dist/compiler.d.ts +127 -0
  27. package/dist/compiler.js +1588 -0
  28. package/dist/compiler.js.map +1 -0
  29. package/dist/compiler.test.d.ts +1 -0
  30. package/dist/compiler.test.js +313 -0
  31. package/dist/compiler.test.js.map +1 -0
  32. package/dist/db-100m-full.d.ts +5 -0
  33. package/dist/db-100m-full.js +78 -0
  34. package/dist/db-100m-full.js.map +1 -0
  35. package/dist/db-100m-no-index.d.ts +12 -0
  36. package/dist/db-100m-no-index.js +119 -0
  37. package/dist/db-100m-no-index.js.map +1 -0
  38. package/dist/db-100m-real.d.ts +5 -0
  39. package/dist/db-100m-real.js +131 -0
  40. package/dist/db-100m-real.js.map +1 -0
  41. package/dist/db-100m-streaming.d.ts +15 -0
  42. package/dist/db-100m-streaming.js +164 -0
  43. package/dist/db-100m-streaming.js.map +1 -0
  44. package/dist/db-100m-test.d.ts +5 -0
  45. package/dist/db-100m-test.js +111 -0
  46. package/dist/db-100m-test.js.map +1 -0
  47. package/dist/db-jest.test.d.ts +1 -0
  48. package/dist/db-jest.test.js +182 -0
  49. package/dist/db-jest.test.js.map +1 -0
  50. package/dist/db-runtime.d.ts +24 -0
  51. package/dist/db-runtime.js +204 -0
  52. package/dist/db-runtime.js.map +1 -0
  53. package/dist/db.d.ts +249 -0
  54. package/dist/db.js +593 -0
  55. package/dist/db.js.map +1 -0
  56. package/dist/file-io-jest.test.d.ts +1 -0
  57. package/dist/file-io-jest.test.js +225 -0
  58. package/dist/file-io-jest.test.js.map +1 -0
  59. package/dist/for-of-jest.test.d.ts +1 -0
  60. package/dist/for-of-jest.test.js +230 -0
  61. package/dist/for-of-jest.test.js.map +1 -0
  62. package/dist/for-of.test.d.ts +1 -0
  63. package/dist/for-of.test.js +305 -0
  64. package/dist/for-of.test.js.map +1 -0
  65. package/dist/function-literal-jest.test.d.ts +1 -0
  66. package/dist/function-literal-jest.test.js +180 -0
  67. package/dist/function-literal-jest.test.js.map +1 -0
  68. package/dist/function-literal.test.d.ts +1 -0
  69. package/dist/function-literal.test.js +245 -0
  70. package/dist/function-literal.test.js.map +1 -0
  71. package/dist/generics-jest.test.d.ts +1 -0
  72. package/dist/generics-jest.test.js +93 -0
  73. package/dist/generics-jest.test.js.map +1 -0
  74. package/dist/ir-gen.d.ts +15 -0
  75. package/dist/ir-gen.js +400 -0
  76. package/dist/ir-gen.js.map +1 -0
  77. package/dist/ir.d.ts +114 -0
  78. package/dist/ir.js +5 -0
  79. package/dist/ir.js.map +1 -0
  80. package/dist/lexer.d.ts +110 -0
  81. package/dist/lexer.js +467 -0
  82. package/dist/lexer.js.map +1 -0
  83. package/dist/lexer.test.d.ts +1 -0
  84. package/dist/lexer.test.js +426 -0
  85. package/dist/lexer.test.js.map +1 -0
  86. package/dist/main.d.ts +2 -0
  87. package/dist/main.js +241 -0
  88. package/dist/main.js.map +1 -0
  89. package/dist/module-jest.test.d.ts +1 -0
  90. package/dist/module-jest.test.js +123 -0
  91. package/dist/module-jest.test.js.map +1 -0
  92. package/dist/parser.d.ts +56 -0
  93. package/dist/parser.js +1060 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/parser.test.d.ts +1 -0
  96. package/dist/parser.test.js +461 -0
  97. package/dist/parser.test.js.map +1 -0
  98. package/dist/pattern-matching-jest.test.d.ts +1 -0
  99. package/dist/pattern-matching-jest.test.js +158 -0
  100. package/dist/pattern-matching-jest.test.js.map +1 -0
  101. package/dist/pkg/init.d.ts +1 -0
  102. package/dist/pkg/init.js +118 -0
  103. package/dist/pkg/init.js.map +1 -0
  104. package/dist/pkg/install.d.ts +1 -0
  105. package/dist/pkg/install.js +77 -0
  106. package/dist/pkg/install.js.map +1 -0
  107. package/dist/pkg/registry.d.ts +23 -0
  108. package/dist/pkg/registry.js +106 -0
  109. package/dist/pkg/registry.js.map +1 -0
  110. package/dist/pkg/run.d.ts +1 -0
  111. package/dist/pkg/run.js +76 -0
  112. package/dist/pkg/run.js.map +1 -0
  113. package/dist/pkg/toml.d.ts +5 -0
  114. package/dist/pkg/toml.js +117 -0
  115. package/dist/pkg/toml.js.map +1 -0
  116. package/dist/repl.d.ts +15 -0
  117. package/dist/repl.js +197 -0
  118. package/dist/repl.js.map +1 -0
  119. package/dist/runtime/bytecode.d.ts +92 -0
  120. package/dist/runtime/bytecode.js +253 -0
  121. package/dist/runtime/bytecode.js.map +1 -0
  122. package/dist/runtime/value.d.ts +102 -0
  123. package/dist/runtime/value.js +302 -0
  124. package/dist/runtime/value.js.map +1 -0
  125. package/dist/runtime/vm.d.ts +65 -0
  126. package/dist/runtime/vm.js +293 -0
  127. package/dist/runtime/vm.js.map +1 -0
  128. package/dist/struct-instance-jest.test.d.ts +1 -0
  129. package/dist/struct-instance-jest.test.js +209 -0
  130. package/dist/struct-instance-jest.test.js.map +1 -0
  131. package/dist/struct-instance.test.d.ts +1 -0
  132. package/dist/struct-instance.test.js +291 -0
  133. package/dist/struct-instance.test.js.map +1 -0
  134. package/dist/struct-jest.test.d.ts +1 -0
  135. package/dist/struct-jest.test.js +176 -0
  136. package/dist/struct-jest.test.js.map +1 -0
  137. package/dist/struct.test.d.ts +1 -0
  138. package/dist/struct.test.js +231 -0
  139. package/dist/struct.test.js.map +1 -0
  140. package/dist/trait-jest.test.d.ts +1 -0
  141. package/dist/trait-jest.test.js +120 -0
  142. package/dist/trait-jest.test.js.map +1 -0
  143. package/dist/vm-jest.test.d.ts +1 -0
  144. package/dist/vm-jest.test.js +569 -0
  145. package/dist/vm-jest.test.js.map +1 -0
  146. package/dist/vm.d.ts +81 -0
  147. package/dist/vm.js +1956 -0
  148. package/dist/vm.js.map +1 -0
  149. package/dist/vm.test.d.ts +1 -0
  150. package/dist/vm.test.js +337 -0
  151. package/dist/vm.test.js.map +1 -0
  152. package/dist/web-repl/sandbox.d.ts +11 -0
  153. package/dist/web-repl/sandbox.js +76 -0
  154. package/dist/web-repl/sandbox.js.map +1 -0
  155. package/dist/web-repl/server.d.ts +1 -0
  156. package/dist/web-repl/server.js +111 -0
  157. package/dist/web-repl/server.js.map +1 -0
  158. package/dist/while-loop-jest.test.d.ts +1 -0
  159. package/dist/while-loop-jest.test.js +201 -0
  160. package/dist/while-loop-jest.test.js.map +1 -0
  161. package/dist/while-loop.test.d.ts +1 -0
  162. package/dist/while-loop.test.js +262 -0
  163. package/dist/while-loop.test.js.map +1 -0
  164. package/docs/EXPERIENCE.md +787 -0
  165. package/docs/README.md +175 -0
  166. package/docs/V1_V2_V3_ANALYSIS.md +107 -0
  167. package/docs/_config.yml +36 -0
  168. package/docs/api-reference.md +459 -0
  169. package/docs/architecture.md +470 -0
  170. package/docs/benchmarks.md +295 -0
  171. package/docs/comparison.md +454 -0
  172. package/docs/index.md +335 -0
  173. package/docs/language-completeness.md +228 -0
  174. package/docs/learning-guide.md +651 -0
  175. package/package.json +65 -0
  176. package/src/api/deploy_key.fl +294 -0
  177. package/src/api/issue.fl +302 -0
  178. package/src/api/org.fl +356 -0
  179. package/src/api/repo.fl +394 -0
  180. package/src/api/team.fl +299 -0
  181. package/src/api/user.fl +385 -0
  182. package/src/api/webhook.fl +273 -0
  183. package/src/ast.ts +158 -0
  184. package/src/async-basic.test.ts +94 -0
  185. package/src/async-jest.test.ts +107 -0
  186. package/src/channel-jest.test.ts +158 -0
  187. package/src/checker-jest.test.ts +189 -0
  188. package/src/checker.test.ts +279 -0
  189. package/src/checker.ts +1861 -0
  190. package/src/commands/analyze.fl +227 -0
  191. package/src/commands/auth.fl +315 -0
  192. package/src/commands/batch.fl +349 -0
  193. package/src/commands/config.fl +199 -0
  194. package/src/commands/deploy_key.fl +352 -0
  195. package/src/commands/issue.fl +275 -0
  196. package/src/commands/main.fl +492 -0
  197. package/src/commands/org.fl +425 -0
  198. package/src/commands/repo.fl +581 -0
  199. package/src/commands/team.fl +244 -0
  200. package/src/commands/user.fl +423 -0
  201. package/src/commands/webhook.fl +400 -0
  202. package/src/compiler-jest.test.ts +275 -0
  203. package/src/compiler.test.ts +375 -0
  204. package/src/compiler.ts +1770 -0
  205. package/src/config.fl +175 -0
  206. package/src/core/batch.fl +355 -0
  207. package/src/core/cache.fl +284 -0
  208. package/src/core/ensure.fl +324 -0
  209. package/src/db-100m-full.ts +96 -0
  210. package/src/db-100m-no-index.ts +133 -0
  211. package/src/db-100m-real.ts +152 -0
  212. package/src/db-100m-streaming.ts +154 -0
  213. package/src/db-100m-test.ts +136 -0
  214. package/src/db-jest.test.ts +161 -0
  215. package/src/db-runtime.ts +242 -0
  216. package/src/db.ts +676 -0
  217. package/src/errors.fl +134 -0
  218. package/src/for-of-jest.test.ts +246 -0
  219. package/src/for-of.test.ts +308 -0
  220. package/src/function-literal-jest.test.ts +193 -0
  221. package/src/function-literal.test.ts +248 -0
  222. package/src/generics-jest.test.ts +104 -0
  223. package/src/http/client.fl +327 -0
  224. package/src/ir-gen.ts +459 -0
  225. package/src/ir.ts +80 -0
  226. package/src/lexer.test.ts +499 -0
  227. package/src/lexer.ts +522 -0
  228. package/src/main.ts +223 -0
  229. package/src/models.fl +162 -0
  230. package/src/module-jest.test.ts +145 -0
  231. package/src/parser.test.ts +542 -0
  232. package/src/parser.ts +1211 -0
  233. package/src/pattern-matching-jest.test.ts +170 -0
  234. package/src/pkg/init.ts +91 -0
  235. package/src/pkg/install.ts +56 -0
  236. package/src/pkg/registry.ts +103 -0
  237. package/src/pkg/run.ts +49 -0
  238. package/src/pkg/toml.ts +129 -0
  239. package/src/repl.ts +190 -0
  240. package/src/runtime/bytecode.ts +291 -0
  241. package/src/runtime/value.ts +322 -0
  242. package/src/runtime/vm.ts +354 -0
  243. package/src/self-host/bootstrap.fl +68 -0
  244. package/src/self-host/interpreter.fl +361 -0
  245. package/src/self-host/lexer-simple.fl +22 -0
  246. package/src/self-host/lexer.fl +305 -0
  247. package/src/self-host/parser.fl +580 -0
  248. package/src/struct-instance-jest.test.ts +221 -0
  249. package/src/struct-instance.test.ts +293 -0
  250. package/src/struct-jest.test.ts +187 -0
  251. package/src/struct.test.ts +234 -0
  252. package/src/trait-jest.test.ts +136 -0
  253. package/src/vm-jest.test.ts +754 -0
  254. package/src/vm.ts +1976 -0
  255. package/src/web-repl/public/index.html +50 -0
  256. package/src/web-repl/public/main.js +105 -0
  257. package/src/web-repl/public/style.css +225 -0
  258. package/src/web-repl/sandbox.ts +88 -0
  259. package/src/web-repl/server.ts +97 -0
  260. package/src/while-loop-jest.test.ts +218 -0
  261. package/src/while-loop.test.ts +267 -0
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ // Lightweight TOML Parser (no external dependencies)
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.parseTOML = parseTOML;
5
+ exports.stringifyTOML = stringifyTOML;
6
+ function parseTOML(content) {
7
+ const result = {};
8
+ const lines = content.split("\n");
9
+ let currentSection = null;
10
+ let currentObj = result;
11
+ for (let i = 0; i < lines.length; i++) {
12
+ const line = lines[i].trim();
13
+ // Skip empty lines and comments
14
+ if (!line || line.startsWith("#"))
15
+ continue;
16
+ // Section header: [section]
17
+ if (line.startsWith("[") && line.endsWith("]")) {
18
+ currentSection = line.slice(1, -1).trim();
19
+ if (!result[currentSection]) {
20
+ result[currentSection] = {};
21
+ }
22
+ currentObj = result[currentSection];
23
+ continue;
24
+ }
25
+ // Key-value pairs: key = value
26
+ const eqIndex = line.indexOf("=");
27
+ if (eqIndex > 0) {
28
+ const key = line.substring(0, eqIndex).trim();
29
+ const valueStr = line.substring(eqIndex + 1).trim();
30
+ const value = parseValue(valueStr);
31
+ currentObj[key] = value;
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ function parseValue(valueStr) {
37
+ // String values (double quotes)
38
+ if (valueStr.startsWith('"') && valueStr.endsWith('"')) {
39
+ return valueStr.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\");
40
+ }
41
+ // String values (single quotes)
42
+ if (valueStr.startsWith("'") && valueStr.endsWith("'")) {
43
+ return valueStr.slice(1, -1);
44
+ }
45
+ // Boolean values
46
+ if (valueStr === "true")
47
+ return true;
48
+ if (valueStr === "false")
49
+ return false;
50
+ // Numeric values
51
+ if (!isNaN(Number(valueStr))) {
52
+ return Number(valueStr);
53
+ }
54
+ // Array values [item1, item2, ...]
55
+ if (valueStr.startsWith("[") && valueStr.endsWith("]")) {
56
+ const itemsStr = valueStr.slice(1, -1);
57
+ const items = itemsStr.split(",").map((item) => parseValue(item.trim()));
58
+ return items;
59
+ }
60
+ // Table values {key = value, ...}
61
+ if (valueStr.startsWith("{") && valueStr.endsWith("}")) {
62
+ const content = valueStr.slice(1, -1);
63
+ const obj = {};
64
+ const pairs = content.split(",");
65
+ for (const pair of pairs) {
66
+ const eqIdx = pair.indexOf("=");
67
+ if (eqIdx > 0) {
68
+ const k = pair.substring(0, eqIdx).trim();
69
+ const v = pair.substring(eqIdx + 1).trim();
70
+ obj[k] = parseValue(v);
71
+ }
72
+ }
73
+ return obj;
74
+ }
75
+ // Return as string if no match
76
+ return valueStr;
77
+ }
78
+ function stringifyTOML(obj, indent = 0) {
79
+ const lines = [];
80
+ const indentStr = " ".repeat(indent);
81
+ for (const [key, value] of Object.entries(obj)) {
82
+ if (value === null || value === undefined) {
83
+ continue;
84
+ }
85
+ if (typeof value === "object" && !Array.isArray(value)) {
86
+ // Nested section
87
+ if (indent === 0) {
88
+ lines.push(`[${key}]`);
89
+ }
90
+ lines.push(stringifyTOML(value, indent + 2));
91
+ }
92
+ else if (Array.isArray(value)) {
93
+ // Array
94
+ const items = value.map((v) => stringifyValue(v)).join(", ");
95
+ lines.push(`${indentStr}${key} = [${items}]`);
96
+ }
97
+ else {
98
+ // Scalar value
99
+ lines.push(`${indentStr}${key} = ${stringifyValue(value)}`);
100
+ }
101
+ }
102
+ return lines.filter((l) => l).join("\n");
103
+ }
104
+ function stringifyValue(value) {
105
+ if (typeof value === "string") {
106
+ return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
107
+ }
108
+ if (typeof value === "boolean") {
109
+ return value ? "true" : "false";
110
+ }
111
+ if (Array.isArray(value)) {
112
+ const items = value.map((v) => stringifyValue(v)).join(", ");
113
+ return `[${items}]`;
114
+ }
115
+ return String(value);
116
+ }
117
+ //# sourceMappingURL=toml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toml.js","sourceRoot":"","sources":["../../src/pkg/toml.ts"],"names":[],"mappings":"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"}
package/dist/repl.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export declare class REPL {
2
+ private rl;
3
+ private vm;
4
+ private globals;
5
+ private history;
6
+ private multiLineBuffer;
7
+ private isMultiLine;
8
+ constructor();
9
+ start(): Promise<void>;
10
+ private handleCommand;
11
+ private eval;
12
+ private printHelp;
13
+ private printHistory;
14
+ private readline;
15
+ }
package/dist/repl.js ADDED
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ // FreeLang v4.1 — REPL (Read-Eval-Print Loop)
3
+ // 대화형 쉘 구현
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.REPL = void 0;
39
+ const readline = __importStar(require("readline"));
40
+ const lexer_1 = require("./lexer");
41
+ const parser_1 = require("./parser");
42
+ const checker_1 = require("./checker");
43
+ const compiler_1 = require("./compiler");
44
+ const vm_1 = require("./vm");
45
+ class REPL {
46
+ constructor() {
47
+ this.globals = new Map();
48
+ this.history = [];
49
+ this.multiLineBuffer = "";
50
+ this.isMultiLine = false;
51
+ this.rl = readline.createInterface({
52
+ input: process.stdin,
53
+ output: process.stdout,
54
+ terminal: process.stdout.isTTY !== false,
55
+ });
56
+ this.vm = new vm_1.VM();
57
+ }
58
+ async start() {
59
+ console.log("🦁 FreeLang v4.1 REPL");
60
+ console.log('입력: "help" (도움말), "exit" (종료), "history" (이력)\n');
61
+ while (true) {
62
+ try {
63
+ const line = await this.readline(this.isMultiLine ? "... " : "> ");
64
+ if (!line)
65
+ continue;
66
+ // 특수 명령어 처리
67
+ if (this.handleCommand(line)) {
68
+ continue;
69
+ }
70
+ // 멀티 라인 처리
71
+ if (line.endsWith("\\")) {
72
+ this.multiLineBuffer += line.slice(0, -1) + "\n";
73
+ this.isMultiLine = true;
74
+ continue;
75
+ }
76
+ const fullCode = this.multiLineBuffer + line;
77
+ this.multiLineBuffer = "";
78
+ this.isMultiLine = false;
79
+ // 실행
80
+ await this.eval(fullCode);
81
+ this.history.push(fullCode);
82
+ }
83
+ catch (e) {
84
+ console.error(`❌ ${e.message}`);
85
+ }
86
+ }
87
+ }
88
+ handleCommand(input) {
89
+ const trimmed = input.trim();
90
+ switch (trimmed) {
91
+ case "exit":
92
+ case "quit":
93
+ console.log("👋 Bye!");
94
+ process.exit(0);
95
+ case "help":
96
+ this.printHelp();
97
+ return true;
98
+ case "history":
99
+ this.printHistory();
100
+ return true;
101
+ case "clear":
102
+ console.clear();
103
+ return true;
104
+ default:
105
+ return false;
106
+ }
107
+ }
108
+ async eval(code) {
109
+ try {
110
+ // 1. Lexer
111
+ const lexer = new lexer_1.Lexer(code);
112
+ const { tokens, errors: lexErrors } = lexer.tokenize();
113
+ if (lexErrors.length > 0) {
114
+ console.error(`❌ Lex error: ${lexErrors[0].message}`);
115
+ return;
116
+ }
117
+ // 2. Parser
118
+ const parser = new parser_1.Parser(tokens);
119
+ const { program, errors: parseErrors } = parser.parse();
120
+ if (parseErrors.length > 0) {
121
+ console.error(`❌ Parse error: ${parseErrors[0].message}`);
122
+ return;
123
+ }
124
+ // 3. Type Checker
125
+ const checker = new checker_1.TypeChecker();
126
+ const checkErrors = checker.check(program);
127
+ if (checkErrors.length > 0) {
128
+ console.error(`❌ Type error: ${checkErrors[0].message}`);
129
+ return;
130
+ }
131
+ // 4. Compiler
132
+ const compiler = new compiler_1.Compiler();
133
+ const chunk = compiler.compile(program);
134
+ // 5. VM Execution
135
+ const { output, error } = await this.vm.run(chunk);
136
+ if (error) {
137
+ console.error(`❌ Runtime error: ${error}`);
138
+ return;
139
+ }
140
+ // 출력
141
+ for (const line of output) {
142
+ console.log(line);
143
+ }
144
+ }
145
+ catch (e) {
146
+ console.error(`❌ ${e.message}`);
147
+ }
148
+ }
149
+ printHelp() {
150
+ console.log(`
151
+ 📚 FreeLang REPL 명령어:
152
+
153
+ 특수 명령:
154
+ exit, quit 프로그램 종료
155
+ help 이 도움말 표시
156
+ history 명령어 이력 표시
157
+ clear 화면 지우기
158
+
159
+ 멀티라인 입력:
160
+ 마지막에 \\ 추가하면 다음 줄에서 계속 입력 가능
161
+ 예: var x = 10 \\
162
+ var y = 20 \\
163
+ println(x + y)
164
+
165
+ 예제:
166
+ > var x = 10
167
+ > fn add(a, b) { a + b }
168
+ > add(x, 5)
169
+ 15
170
+ `);
171
+ }
172
+ printHistory() {
173
+ if (this.history.length === 0) {
174
+ console.log("이력이 없습니다");
175
+ return;
176
+ }
177
+ console.log("\n📜 명령어 이력:");
178
+ this.history.forEach((cmd, i) => {
179
+ console.log(`${i + 1}. ${cmd}`);
180
+ });
181
+ console.log();
182
+ }
183
+ readline(prompt) {
184
+ return new Promise((resolve) => {
185
+ this.rl.question(prompt, (answer) => {
186
+ resolve(answer);
187
+ });
188
+ });
189
+ }
190
+ }
191
+ exports.REPL = REPL;
192
+ // REPL 실행
193
+ if (require.main === module) {
194
+ const repl = new REPL();
195
+ repl.start().catch(console.error);
196
+ }
197
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * FreeLang Bytecode Definition
3
+ * 스택 머신의 모든 명령어를 정의
4
+ */
5
+ import { Value } from './value';
6
+ /**
7
+ * 모든 Bytecode 연산 타입
8
+ */
9
+ export declare enum OpcodeType {
10
+ PUSH = "PUSH",
11
+ POP = "POP",
12
+ DUP = "DUP",
13
+ ADD = "ADD",
14
+ SUB = "SUB",
15
+ MUL = "MUL",
16
+ DIV = "DIV",
17
+ MOD = "MOD",
18
+ AND = "AND",
19
+ OR = "OR",
20
+ NOT = "NOT",
21
+ EQ = "EQ",
22
+ NE = "NE",
23
+ LT = "LT",
24
+ LTE = "LTE",
25
+ GT = "GT",
26
+ GTE = "GTE",
27
+ JUMP = "JUMP",
28
+ JUMP_IF_TRUE = "JUMP_IF_TRUE",
29
+ JUMP_IF_FALSE = "JUMP_IF_FALSE",
30
+ CALL = "CALL",
31
+ RETURN = "RETURN",
32
+ LOAD_LOCAL = "LOAD_LOCAL",
33
+ STORE_LOCAL = "STORE_LOCAL",
34
+ LOAD_GLOBAL = "LOAD_GLOBAL",
35
+ STORE_GLOBAL = "STORE_GLOBAL",
36
+ LOAD_ARRAY = "LOAD_ARRAY",
37
+ STORE_ARRAY = "STORE_ARRAY",
38
+ LOAD_OBJECT = "LOAD_OBJECT",
39
+ STORE_OBJECT = "STORE_OBJECT",
40
+ TO_INT = "TO_INT",
41
+ TO_FLOAT = "TO_FLOAT",
42
+ TO_STRING = "TO_STRING",
43
+ TO_BOOL = "TO_BOOL",
44
+ CALL_BUILTIN = "CALL_BUILTIN",
45
+ PRINT = "PRINT",
46
+ HALT = "HALT",
47
+ NOP = "NOP"
48
+ }
49
+ /**
50
+ * 단일 Bytecode 명령어
51
+ */
52
+ export interface Instruction {
53
+ op: OpcodeType;
54
+ arg?: any;
55
+ line: number;
56
+ column: number;
57
+ }
58
+ /**
59
+ * Bytecode 빌더 - 명령어를 생성하기 편하게 함
60
+ */
61
+ export declare class BytecodeBuilder {
62
+ private instructions;
63
+ private lineNo;
64
+ private colNo;
65
+ setLocation(line: number, col: number): void;
66
+ push(value: Value): this;
67
+ pop(): this;
68
+ dup(): this;
69
+ add(): this;
70
+ sub(): this;
71
+ mul(): this;
72
+ div(): this;
73
+ mod(): this;
74
+ eq(): this;
75
+ ne(): this;
76
+ lt(): this;
77
+ jump(target: number): this;
78
+ jumpIfTrue(target: number): this;
79
+ jumpIfFalse(target: number): this;
80
+ call(name: string, arity: number): this;
81
+ loadLocal(index: number): this;
82
+ storeLocal(index: number): this;
83
+ print(): this;
84
+ halt(): this;
85
+ build(): Instruction[];
86
+ }
87
+ /**
88
+ * Bytecode 프린터 - 명령어를 읽기 좋게 출력
89
+ */
90
+ export declare class BytecodePrinter {
91
+ static print(instructions: Instruction[]): string;
92
+ }
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ /**
3
+ * FreeLang Bytecode Definition
4
+ * 스택 머신의 모든 명령어를 정의
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BytecodePrinter = exports.BytecodeBuilder = exports.OpcodeType = void 0;
8
+ /**
9
+ * 모든 Bytecode 연산 타입
10
+ */
11
+ var OpcodeType;
12
+ (function (OpcodeType) {
13
+ // 스택 연산
14
+ OpcodeType["PUSH"] = "PUSH";
15
+ OpcodeType["POP"] = "POP";
16
+ OpcodeType["DUP"] = "DUP";
17
+ // 산술 연산
18
+ OpcodeType["ADD"] = "ADD";
19
+ OpcodeType["SUB"] = "SUB";
20
+ OpcodeType["MUL"] = "MUL";
21
+ OpcodeType["DIV"] = "DIV";
22
+ OpcodeType["MOD"] = "MOD";
23
+ // 논리 연산
24
+ OpcodeType["AND"] = "AND";
25
+ OpcodeType["OR"] = "OR";
26
+ OpcodeType["NOT"] = "NOT";
27
+ // 비교 연산
28
+ OpcodeType["EQ"] = "EQ";
29
+ OpcodeType["NE"] = "NE";
30
+ OpcodeType["LT"] = "LT";
31
+ OpcodeType["LTE"] = "LTE";
32
+ OpcodeType["GT"] = "GT";
33
+ OpcodeType["GTE"] = "GTE";
34
+ // 제어 흐름
35
+ OpcodeType["JUMP"] = "JUMP";
36
+ OpcodeType["JUMP_IF_TRUE"] = "JUMP_IF_TRUE";
37
+ OpcodeType["JUMP_IF_FALSE"] = "JUMP_IF_FALSE";
38
+ OpcodeType["CALL"] = "CALL";
39
+ OpcodeType["RETURN"] = "RETURN";
40
+ // 변수 접근
41
+ OpcodeType["LOAD_LOCAL"] = "LOAD_LOCAL";
42
+ OpcodeType["STORE_LOCAL"] = "STORE_LOCAL";
43
+ OpcodeType["LOAD_GLOBAL"] = "LOAD_GLOBAL";
44
+ OpcodeType["STORE_GLOBAL"] = "STORE_GLOBAL";
45
+ // 배열/객체 연산
46
+ OpcodeType["LOAD_ARRAY"] = "LOAD_ARRAY";
47
+ OpcodeType["STORE_ARRAY"] = "STORE_ARRAY";
48
+ OpcodeType["LOAD_OBJECT"] = "LOAD_OBJECT";
49
+ OpcodeType["STORE_OBJECT"] = "STORE_OBJECT";
50
+ // 타입 변환
51
+ OpcodeType["TO_INT"] = "TO_INT";
52
+ OpcodeType["TO_FLOAT"] = "TO_FLOAT";
53
+ OpcodeType["TO_STRING"] = "TO_STRING";
54
+ OpcodeType["TO_BOOL"] = "TO_BOOL";
55
+ // 함수 호출
56
+ OpcodeType["CALL_BUILTIN"] = "CALL_BUILTIN";
57
+ // 기타
58
+ OpcodeType["PRINT"] = "PRINT";
59
+ OpcodeType["HALT"] = "HALT";
60
+ OpcodeType["NOP"] = "NOP";
61
+ })(OpcodeType || (exports.OpcodeType = OpcodeType = {}));
62
+ /**
63
+ * Bytecode 빌더 - 명령어를 생성하기 편하게 함
64
+ */
65
+ class BytecodeBuilder {
66
+ constructor() {
67
+ this.instructions = [];
68
+ this.lineNo = 1;
69
+ this.colNo = 1;
70
+ }
71
+ setLocation(line, col) {
72
+ this.lineNo = line;
73
+ this.colNo = col;
74
+ }
75
+ push(value) {
76
+ this.instructions.push({
77
+ op: OpcodeType.PUSH,
78
+ arg: value,
79
+ line: this.lineNo,
80
+ column: this.colNo,
81
+ });
82
+ return this;
83
+ }
84
+ pop() {
85
+ this.instructions.push({
86
+ op: OpcodeType.POP,
87
+ line: this.lineNo,
88
+ column: this.colNo,
89
+ });
90
+ return this;
91
+ }
92
+ dup() {
93
+ this.instructions.push({
94
+ op: OpcodeType.DUP,
95
+ line: this.lineNo,
96
+ column: this.colNo,
97
+ });
98
+ return this;
99
+ }
100
+ add() {
101
+ this.instructions.push({
102
+ op: OpcodeType.ADD,
103
+ line: this.lineNo,
104
+ column: this.colNo,
105
+ });
106
+ return this;
107
+ }
108
+ sub() {
109
+ this.instructions.push({
110
+ op: OpcodeType.SUB,
111
+ line: this.lineNo,
112
+ column: this.colNo,
113
+ });
114
+ return this;
115
+ }
116
+ mul() {
117
+ this.instructions.push({
118
+ op: OpcodeType.MUL,
119
+ line: this.lineNo,
120
+ column: this.colNo,
121
+ });
122
+ return this;
123
+ }
124
+ div() {
125
+ this.instructions.push({
126
+ op: OpcodeType.DIV,
127
+ line: this.lineNo,
128
+ column: this.colNo,
129
+ });
130
+ return this;
131
+ }
132
+ mod() {
133
+ this.instructions.push({
134
+ op: OpcodeType.MOD,
135
+ line: this.lineNo,
136
+ column: this.colNo,
137
+ });
138
+ return this;
139
+ }
140
+ eq() {
141
+ this.instructions.push({
142
+ op: OpcodeType.EQ,
143
+ line: this.lineNo,
144
+ column: this.colNo,
145
+ });
146
+ return this;
147
+ }
148
+ ne() {
149
+ this.instructions.push({
150
+ op: OpcodeType.NE,
151
+ line: this.lineNo,
152
+ column: this.colNo,
153
+ });
154
+ return this;
155
+ }
156
+ lt() {
157
+ this.instructions.push({
158
+ op: OpcodeType.LT,
159
+ line: this.lineNo,
160
+ column: this.colNo,
161
+ });
162
+ return this;
163
+ }
164
+ jump(target) {
165
+ this.instructions.push({
166
+ op: OpcodeType.JUMP,
167
+ arg: target,
168
+ line: this.lineNo,
169
+ column: this.colNo,
170
+ });
171
+ return this;
172
+ }
173
+ jumpIfTrue(target) {
174
+ this.instructions.push({
175
+ op: OpcodeType.JUMP_IF_TRUE,
176
+ arg: target,
177
+ line: this.lineNo,
178
+ column: this.colNo,
179
+ });
180
+ return this;
181
+ }
182
+ jumpIfFalse(target) {
183
+ this.instructions.push({
184
+ op: OpcodeType.JUMP_IF_FALSE,
185
+ arg: target,
186
+ line: this.lineNo,
187
+ column: this.colNo,
188
+ });
189
+ return this;
190
+ }
191
+ call(name, arity) {
192
+ this.instructions.push({
193
+ op: OpcodeType.CALL_BUILTIN,
194
+ arg: { name, arity },
195
+ line: this.lineNo,
196
+ column: this.colNo,
197
+ });
198
+ return this;
199
+ }
200
+ loadLocal(index) {
201
+ this.instructions.push({
202
+ op: OpcodeType.LOAD_LOCAL,
203
+ arg: index,
204
+ line: this.lineNo,
205
+ column: this.colNo,
206
+ });
207
+ return this;
208
+ }
209
+ storeLocal(index) {
210
+ this.instructions.push({
211
+ op: OpcodeType.STORE_LOCAL,
212
+ arg: index,
213
+ line: this.lineNo,
214
+ column: this.colNo,
215
+ });
216
+ return this;
217
+ }
218
+ print() {
219
+ this.instructions.push({
220
+ op: OpcodeType.PRINT,
221
+ line: this.lineNo,
222
+ column: this.colNo,
223
+ });
224
+ return this;
225
+ }
226
+ halt() {
227
+ this.instructions.push({
228
+ op: OpcodeType.HALT,
229
+ line: this.lineNo,
230
+ column: this.colNo,
231
+ });
232
+ return this;
233
+ }
234
+ build() {
235
+ return this.instructions;
236
+ }
237
+ }
238
+ exports.BytecodeBuilder = BytecodeBuilder;
239
+ /**
240
+ * Bytecode 프린터 - 명령어를 읽기 좋게 출력
241
+ */
242
+ class BytecodePrinter {
243
+ static print(instructions) {
244
+ const lines = [];
245
+ instructions.forEach((instr, idx) => {
246
+ const argStr = instr.arg !== undefined ? ` ${JSON.stringify(instr.arg)}` : '';
247
+ lines.push(`${String(idx).padStart(4, '0')}: ${instr.op.padEnd(15)}${argStr}`);
248
+ });
249
+ return lines.join('\n');
250
+ }
251
+ }
252
+ exports.BytecodePrinter = BytecodePrinter;
253
+ //# sourceMappingURL=bytecode.js.map