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
package/dist/ir-gen.js ADDED
@@ -0,0 +1,400 @@
1
+ "use strict";
2
+ // FreeLang v4 — IR Generator
3
+ // AST → IrProgram 변환
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.IRGen = void 0;
6
+ class IRGen {
7
+ constructor() {
8
+ this.tempCount = 0;
9
+ this.labelCount = 0;
10
+ this.insts = []; // 현재 생성 중인 명령어
11
+ this.functions = [];
12
+ }
13
+ newTemp() {
14
+ return `t${this.tempCount++}`;
15
+ }
16
+ newLabel() {
17
+ return `L${this.labelCount++}`;
18
+ }
19
+ emit(inst) {
20
+ this.insts.push(inst);
21
+ }
22
+ // ============================================================
23
+ // 메인 진입점
24
+ // ============================================================
25
+ generate(prog) {
26
+ const savedInsts = this.insts;
27
+ this.insts = [];
28
+ for (const stmt of prog.stmts) {
29
+ if (stmt.kind === "fn_decl") {
30
+ this.genFnDecl(stmt);
31
+ }
32
+ else {
33
+ this.genStmt(stmt);
34
+ }
35
+ }
36
+ const main = this.insts;
37
+ this.insts = savedInsts;
38
+ return {
39
+ functions: this.functions,
40
+ main,
41
+ };
42
+ }
43
+ // ============================================================
44
+ // 문 생성
45
+ // ============================================================
46
+ genStmt(stmt) {
47
+ switch (stmt.kind) {
48
+ case "var_decl": {
49
+ const val = this.genExpr(stmt.init);
50
+ this.emit({ kind: "assign", dest: stmt.name, src: val });
51
+ break;
52
+ }
53
+ case "if_stmt": {
54
+ const cond = this.genExpr(stmt.condition);
55
+ const elseLabel = this.newLabel();
56
+ const endLabel = this.newLabel();
57
+ this.emit({ kind: "jump_if_false", cond, target: elseLabel });
58
+ for (const s of stmt.then) {
59
+ this.genStmt(s);
60
+ }
61
+ this.emit({ kind: "jump", target: endLabel });
62
+ this.emit({ kind: "label", name: elseLabel });
63
+ if (stmt.else_) {
64
+ for (const s of stmt.else_) {
65
+ this.genStmt(s);
66
+ }
67
+ }
68
+ this.emit({ kind: "label", name: endLabel });
69
+ break;
70
+ }
71
+ case "while_stmt": {
72
+ const loopLabel = this.newLabel();
73
+ const endLabel = this.newLabel();
74
+ this.emit({ kind: "label", name: loopLabel });
75
+ const cond = this.genExpr(stmt.condition);
76
+ this.emit({ kind: "jump_if_false", cond, target: endLabel });
77
+ for (const s of stmt.body) {
78
+ this.genStmt(s);
79
+ }
80
+ this.emit({ kind: "jump", target: loopLabel });
81
+ this.emit({ kind: "label", name: endLabel });
82
+ break;
83
+ }
84
+ case "for_stmt": {
85
+ // for i = start to end step s → var i; while i < end { body; i = i + s }
86
+ const varName = stmt.variable;
87
+ const iterable = this.genExpr(stmt.iterable); // [start, end, step]
88
+ // iterable은 보통 i32이므로 0부터 시작
89
+ this.emit({ kind: "assign", dest: varName, src: { kind: "const_i32", val: 0 } });
90
+ const loopLabel = this.newLabel();
91
+ const endLabel = this.newLabel();
92
+ this.emit({ kind: "label", name: loopLabel });
93
+ const cond = { kind: "local", name: varName };
94
+ this.emit({ kind: "jump_if_false", cond, target: endLabel });
95
+ for (const s of stmt.body) {
96
+ this.genStmt(s);
97
+ }
98
+ // i = i + 1
99
+ const nextTemp = this.newTemp();
100
+ this.emit({
101
+ kind: "binop",
102
+ dest: nextTemp,
103
+ op: "+",
104
+ left: cond,
105
+ right: { kind: "const_i32", val: 1 },
106
+ });
107
+ this.emit({ kind: "assign", dest: varName, src: { kind: "local", name: nextTemp } });
108
+ this.emit({ kind: "jump", target: loopLabel });
109
+ this.emit({ kind: "label", name: endLabel });
110
+ break;
111
+ }
112
+ case "for_of_stmt": {
113
+ // for x in arr → while iter < length(arr) { x = arr[iter]; body; iter++ }
114
+ const varName = stmt.variable;
115
+ const iterExpr = this.genExpr(stmt.iterable);
116
+ const iterVar = this.newTemp();
117
+ this.emit({ kind: "assign", dest: iterVar, src: { kind: "const_i32", val: 0 } });
118
+ const loopLabel = this.newLabel();
119
+ const endLabel = this.newLabel();
120
+ this.emit({ kind: "label", name: loopLabel });
121
+ const iterVal = { kind: "local", name: iterVar };
122
+ // array_get 명령어 발행 후 결과를 itemTemp에 저장
123
+ const itemTemp = this.newTemp();
124
+ this.emit({
125
+ kind: "array_get",
126
+ dest: itemTemp,
127
+ arr: iterExpr,
128
+ idx: iterVal,
129
+ });
130
+ // 루프 변수에 할당
131
+ this.emit({ kind: "assign", dest: varName, src: { kind: "local", name: itemTemp } });
132
+ for (const s of stmt.body) {
133
+ this.genStmt(s);
134
+ }
135
+ // 반복 변수 증가
136
+ const nextTemp = this.newTemp();
137
+ this.emit({
138
+ kind: "binop",
139
+ dest: nextTemp,
140
+ op: "+",
141
+ left: iterVal,
142
+ right: { kind: "const_i32", val: 1 },
143
+ });
144
+ this.emit({ kind: "assign", dest: iterVar, src: { kind: "local", name: nextTemp } });
145
+ this.emit({ kind: "jump", target: loopLabel });
146
+ this.emit({ kind: "label", name: endLabel });
147
+ break;
148
+ }
149
+ case "return_stmt": {
150
+ const val = stmt.value ? this.genExpr(stmt.value) : null;
151
+ this.emit({ kind: "return", value: val });
152
+ break;
153
+ }
154
+ case "expr_stmt": {
155
+ this.genExpr(stmt.expr);
156
+ break;
157
+ }
158
+ case "spawn_stmt": {
159
+ // TODO: spawn 처리 (현재 미지원)
160
+ break;
161
+ }
162
+ // 타입 선언, match, break, continue는 생략
163
+ default:
164
+ break;
165
+ }
166
+ }
167
+ genFnDecl(stmt) {
168
+ const savedInsts = this.insts;
169
+ this.insts = [];
170
+ const params = stmt.params.map((p) => p.name);
171
+ for (const s of stmt.body) {
172
+ this.genStmt(s);
173
+ }
174
+ // 함수의 끝에 return void 추가 (명시적 반환 없으면)
175
+ const lastInst = this.insts[this.insts.length - 1];
176
+ if (!lastInst || lastInst.kind !== "return") {
177
+ this.emit({ kind: "return", value: null });
178
+ }
179
+ this.functions.push({
180
+ name: stmt.name,
181
+ params,
182
+ insts: this.insts,
183
+ });
184
+ this.insts = savedInsts;
185
+ }
186
+ // ============================================================
187
+ // 식 생성
188
+ // ============================================================
189
+ genExpr(expr) {
190
+ switch (expr.kind) {
191
+ case "int_lit":
192
+ return { kind: "const_i32", val: expr.value };
193
+ case "float_lit":
194
+ return { kind: "const_f64", val: expr.value };
195
+ case "string_lit":
196
+ return { kind: "const_str", val: expr.value };
197
+ case "bool_lit":
198
+ return { kind: "const_bool", val: expr.value };
199
+ case "ident":
200
+ return { kind: "local", name: expr.name };
201
+ case "binary": {
202
+ const left = this.genExpr(expr.left);
203
+ const right = this.genExpr(expr.right);
204
+ const dest = this.newTemp();
205
+ this.emit({
206
+ kind: "binop",
207
+ dest,
208
+ op: expr.op,
209
+ left,
210
+ right,
211
+ });
212
+ return { kind: "local", name: dest };
213
+ }
214
+ case "unary": {
215
+ const src = this.genExpr(expr.operand);
216
+ const dest = this.newTemp();
217
+ this.emit({
218
+ kind: "unop",
219
+ dest,
220
+ op: expr.op,
221
+ src,
222
+ });
223
+ return { kind: "local", name: dest };
224
+ }
225
+ case "call": {
226
+ const args = expr.args.map((a) => this.genExpr(a));
227
+ const dest = this.newTemp();
228
+ if (expr.callee.kind === "ident") {
229
+ const name = expr.callee.name;
230
+ const builtins = [
231
+ "println", "print", "read_line", "read_file", "write_file",
232
+ "i32", "i64", "f64", "str",
233
+ "push", "pop", "slice", "clone", "length",
234
+ "char_at", "contains", "split", "trim", "to_upper", "to_lower",
235
+ "abs", "min", "max", "pow", "sqrt",
236
+ "range", "channel", "panic", "typeof", "assert",
237
+ // Phase 7: 20 Core Libraries
238
+ "md5", "sha256", "sha512", "base64_encode", "base64_decode", "hmac",
239
+ "json_parse", "json_stringify", "json_validate", "json_pretty",
240
+ "starts_with", "ends_with", "replace",
241
+ "reverse", "sort", "unique",
242
+ "gcd", "lcm",
243
+ "uuid", "timestamp",
244
+ "send", "recv",
245
+ ];
246
+ if (builtins.includes(name)) {
247
+ this.emit({
248
+ kind: "call_builtin",
249
+ dest,
250
+ name,
251
+ args,
252
+ });
253
+ }
254
+ else {
255
+ this.emit({
256
+ kind: "call",
257
+ dest,
258
+ fn: name,
259
+ args,
260
+ });
261
+ }
262
+ }
263
+ else {
264
+ // 복잡한 callee는 일단 지원 안 함
265
+ }
266
+ return { kind: "local", name: dest };
267
+ }
268
+ case "index": {
269
+ const arr = this.genExpr(expr.object);
270
+ const idx = this.genExpr(expr.index);
271
+ const dest = this.newTemp();
272
+ this.emit({
273
+ kind: "array_get",
274
+ dest,
275
+ arr,
276
+ idx,
277
+ });
278
+ return { kind: "local", name: dest };
279
+ }
280
+ case "field_access": {
281
+ const obj = this.genExpr(expr.object);
282
+ const dest = this.newTemp();
283
+ this.emit({
284
+ kind: "struct_get",
285
+ dest,
286
+ obj,
287
+ field: expr.field,
288
+ });
289
+ return { kind: "local", name: dest };
290
+ }
291
+ case "assign": {
292
+ const val = this.genExpr(expr.value);
293
+ if (expr.target.kind === "ident") {
294
+ this.emit({
295
+ kind: "assign",
296
+ dest: expr.target.name,
297
+ src: val,
298
+ });
299
+ return val;
300
+ }
301
+ else if (expr.target.kind === "index") {
302
+ const arr = this.genExpr(expr.target.object);
303
+ const idx = this.genExpr(expr.target.index);
304
+ this.emit({
305
+ kind: "array_set",
306
+ arr,
307
+ idx,
308
+ value: val,
309
+ });
310
+ return val;
311
+ }
312
+ else if (expr.target.kind === "field_access") {
313
+ const obj = this.genExpr(expr.target.object);
314
+ this.emit({
315
+ kind: "struct_set",
316
+ obj,
317
+ field: expr.target.field,
318
+ value: val,
319
+ });
320
+ return val;
321
+ }
322
+ return { kind: "const_i32", val: 0 };
323
+ }
324
+ case "array_lit": {
325
+ const elements = expr.elements.map((e) => this.genExpr(e));
326
+ const dest = this.newTemp();
327
+ this.emit({
328
+ kind: "array_new",
329
+ dest,
330
+ elements,
331
+ });
332
+ return { kind: "local", name: dest };
333
+ }
334
+ case "struct_lit": {
335
+ const fields = expr.fields.map((f) => ({
336
+ name: f.name,
337
+ value: this.genExpr(f.value),
338
+ }));
339
+ const dest = this.newTemp();
340
+ this.emit({
341
+ kind: "struct_new",
342
+ dest,
343
+ sname: expr.structName,
344
+ fields,
345
+ });
346
+ return { kind: "local", name: dest };
347
+ }
348
+ case "if_expr": {
349
+ const cond = this.genExpr(expr.condition);
350
+ const thenLabel = this.newLabel();
351
+ const elseLabel = this.newLabel();
352
+ const endLabel = this.newLabel();
353
+ const resultDest = this.newTemp();
354
+ this.emit({ kind: "jump_if_false", cond, target: elseLabel });
355
+ this.emit({ kind: "label", name: thenLabel });
356
+ let thenVal = { kind: "const_i32", val: 0 };
357
+ for (let i = 0; i < expr.then.length; i++) {
358
+ if (i === expr.then.length - 1) {
359
+ // 마지막 식
360
+ thenVal = this.genExpr(expr.then[i]);
361
+ }
362
+ else {
363
+ // 문
364
+ this.genStmt(expr.then[i]);
365
+ }
366
+ }
367
+ this.emit({ kind: "assign", dest: resultDest, src: thenVal });
368
+ this.emit({ kind: "jump", target: endLabel });
369
+ this.emit({ kind: "label", name: elseLabel });
370
+ let elseVal = { kind: "const_i32", val: 0 };
371
+ for (let i = 0; i < expr.else_.length; i++) {
372
+ if (i === expr.else_.length - 1) {
373
+ elseVal = this.genExpr(expr.else_[i]);
374
+ }
375
+ else {
376
+ this.genStmt(expr.else_[i]);
377
+ }
378
+ }
379
+ this.emit({ kind: "assign", dest: resultDest, src: elseVal });
380
+ this.emit({ kind: "label", name: endLabel });
381
+ return { kind: "local", name: resultDest };
382
+ }
383
+ case "block_expr": {
384
+ let result = { kind: "const_i32", val: 0 };
385
+ for (const s of expr.stmts) {
386
+ this.genStmt(s);
387
+ }
388
+ if (expr.expr) {
389
+ result = this.genExpr(expr.expr);
390
+ }
391
+ return result;
392
+ }
393
+ // match_expr, fn_lit, try 등은 일단 미지원
394
+ default:
395
+ return { kind: "const_i32", val: 0 };
396
+ }
397
+ }
398
+ }
399
+ exports.IRGen = IRGen;
400
+ //# sourceMappingURL=ir-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ir-gen.js","sourceRoot":"","sources":["../src/ir-gen.ts"],"names":[],"mappings":"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"}
package/dist/ir.d.ts ADDED
@@ -0,0 +1,114 @@
1
+ export type IrValue = {
2
+ kind: "temp";
3
+ name: string;
4
+ } | {
5
+ kind: "local";
6
+ name: string;
7
+ } | {
8
+ kind: "global";
9
+ name: string;
10
+ } | {
11
+ kind: "const_i32";
12
+ val: number;
13
+ } | {
14
+ kind: "const_f64";
15
+ val: number;
16
+ } | {
17
+ kind: "const_str";
18
+ val: string;
19
+ } | {
20
+ kind: "const_bool";
21
+ val: boolean;
22
+ };
23
+ export type IrInst = {
24
+ kind: "assign";
25
+ dest: string;
26
+ src: IrValue;
27
+ } | {
28
+ kind: "binop";
29
+ dest: string;
30
+ op: string;
31
+ left: IrValue;
32
+ right: IrValue;
33
+ } | {
34
+ kind: "unop";
35
+ dest: string;
36
+ op: string;
37
+ src: IrValue;
38
+ } | {
39
+ kind: "label";
40
+ name: string;
41
+ } | {
42
+ kind: "jump";
43
+ target: string;
44
+ } | {
45
+ kind: "jump_if_false";
46
+ cond: IrValue;
47
+ target: string;
48
+ } | {
49
+ kind: "call";
50
+ dest: string | null;
51
+ fn: string;
52
+ args: IrValue[];
53
+ } | {
54
+ kind: "call_builtin";
55
+ dest: string | null;
56
+ name: string;
57
+ args: IrValue[];
58
+ } | {
59
+ kind: "return";
60
+ value: IrValue | null;
61
+ } | {
62
+ kind: "array_new";
63
+ dest: string;
64
+ elements: IrValue[];
65
+ } | {
66
+ kind: "array_get";
67
+ dest: string;
68
+ arr: IrValue;
69
+ idx: IrValue;
70
+ } | {
71
+ kind: "array_set";
72
+ arr: IrValue;
73
+ idx: IrValue;
74
+ value: IrValue;
75
+ } | {
76
+ kind: "struct_new";
77
+ dest: string;
78
+ sname: string;
79
+ fields: {
80
+ name: string;
81
+ value: IrValue;
82
+ }[];
83
+ } | {
84
+ kind: "struct_get";
85
+ dest: string;
86
+ obj: IrValue;
87
+ field: string;
88
+ } | {
89
+ kind: "struct_set";
90
+ obj: IrValue;
91
+ field: string;
92
+ value: IrValue;
93
+ } | {
94
+ kind: "wrap_ok";
95
+ dest: string;
96
+ value: IrValue;
97
+ } | {
98
+ kind: "wrap_err";
99
+ dest: string;
100
+ value: IrValue;
101
+ } | {
102
+ kind: "unwrap";
103
+ dest: string;
104
+ value: IrValue;
105
+ };
106
+ export type IrFunction = {
107
+ name: string;
108
+ params: string[];
109
+ insts: IrInst[];
110
+ };
111
+ export type IrProgram = {
112
+ functions: IrFunction[];
113
+ main: IrInst[];
114
+ };
package/dist/ir.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // FreeLang v4 — IR (Intermediate Representation)
3
+ // Three-Address Code 형태의 중간 언어
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=ir.js.map
package/dist/ir.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ir.js","sourceRoot":"","sources":["../src/ir.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,+BAA+B"}
@@ -0,0 +1,110 @@
1
+ export declare enum TokenType {
2
+ VAR = "VAR",
3
+ LET = "LET",
4
+ CONST = "CONST",
5
+ FN = "FN",
6
+ ASYNC = "ASYNC",
7
+ AWAIT = "AWAIT",
8
+ STRUCT = "STRUCT",
9
+ TRAIT = "TRAIT",
10
+ IMPL = "IMPL",
11
+ IF = "IF",
12
+ ELSE = "ELSE",
13
+ MATCH = "MATCH",
14
+ FOR = "FOR",
15
+ IN = "IN",
16
+ OF = "OF",
17
+ WHILE = "WHILE",
18
+ BREAK = "BREAK",
19
+ CONTINUE = "CONTINUE",
20
+ RETURN = "RETURN",
21
+ SPAWN = "SPAWN",
22
+ TRUE = "TRUE",
23
+ FALSE = "FALSE",
24
+ AS = "AS",
25
+ IMPORT = "IMPORT",
26
+ EXPORT = "EXPORT",
27
+ FROM = "FROM",
28
+ TYPE_I32 = "TYPE_I32",
29
+ TYPE_I64 = "TYPE_I64",
30
+ TYPE_F64 = "TYPE_F64",
31
+ TYPE_BOOL = "TYPE_BOOL",
32
+ TYPE_STRING = "TYPE_STRING",
33
+ TYPE_VOID = "TYPE_VOID",
34
+ TYPE_CHANNEL = "TYPE_CHANNEL",
35
+ INT_LIT = "INT_LIT",
36
+ FLOAT_LIT = "FLOAT_LIT",
37
+ STRING_LIT = "STRING_LIT",
38
+ PLUS = "PLUS",// +
39
+ MINUS = "MINUS",// -
40
+ STAR = "STAR",// *
41
+ SLASH = "SLASH",// /
42
+ PERCENT = "PERCENT",// %
43
+ EQ = "EQ",// =
44
+ EQEQ = "EQEQ",// ==
45
+ NEQ = "NEQ",// !=
46
+ LT = "LT",// <
47
+ GT = "GT",// >
48
+ LTEQ = "LTEQ",// <=
49
+ GTEQ = "GTEQ",// >=
50
+ AND = "AND",// &&
51
+ OR = "OR",// ||
52
+ NOT = "NOT",// !
53
+ QUESTION = "QUESTION",// ?
54
+ ARROW = "ARROW",// =>
55
+ RARROW = "RARROW",// ->
56
+ LARROW = "LARROW",// <-
57
+ COLON = "COLON",// :
58
+ COMMA = "COMMA",// ,
59
+ DOT = "DOT",// .
60
+ DOTDOT = "DOTDOT",// ..
61
+ LPAREN = "LPAREN",// (
62
+ RPAREN = "RPAREN",// )
63
+ LBRACKET = "LBRACKET",// [
64
+ RBRACKET = "RBRACKET",// ]
65
+ LBRACE = "LBRACE",// {
66
+ RBRACE = "RBRACE",// }
67
+ SEMICOLON = "SEMICOLON",// ;
68
+ IDENT = "IDENT",
69
+ EOF = "EOF"
70
+ }
71
+ export type Token = {
72
+ type: TokenType;
73
+ lexeme: string;
74
+ line: number;
75
+ col: number;
76
+ };
77
+ export type LexError = {
78
+ message: string;
79
+ line: number;
80
+ col: number;
81
+ };
82
+ export declare class Lexer {
83
+ private source;
84
+ private pos;
85
+ private line;
86
+ private col;
87
+ private tokens;
88
+ private errors;
89
+ constructor(source: string);
90
+ tokenize(): {
91
+ tokens: Token[];
92
+ errors: LexError[];
93
+ };
94
+ private scanToken;
95
+ private scanIdentOrKeyword;
96
+ private scanNumber;
97
+ private consumeDigits;
98
+ private scanString;
99
+ private skipLineComment;
100
+ private skipHashComment;
101
+ private isAtEnd;
102
+ private peek;
103
+ private peekNext;
104
+ private advance;
105
+ private isAlpha;
106
+ private isDigit;
107
+ private isAlphaNum;
108
+ private addToken;
109
+ private addError;
110
+ }