@no22/dison 1.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/LICENSE +15 -0
- package/README.md +194 -0
- package/dist/analysis.d.ts +21 -0
- package/dist/analysis.d.ts.map +1 -0
- package/dist/analysis.js +267 -0
- package/dist/analysis.js.map +1 -0
- package/dist/ast.d.ts +46 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +5 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +98 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen.d.ts +10 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +181 -0
- package/dist/codegen.js.map +1 -0
- package/dist/collisions.d.ts +26 -0
- package/dist/collisions.d.ts.map +1 -0
- package/dist/collisions.js +120 -0
- package/dist/collisions.js.map +1 -0
- package/dist/core.d.ts +229 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +247 -0
- package/dist/core.js.map +1 -0
- package/dist/generated-runtime.d.ts +7 -0
- package/dist/generated-runtime.d.ts.map +1 -0
- package/dist/generated-runtime.js +51 -0
- package/dist/generated-runtime.js.map +1 -0
- package/dist/lexer.d.ts +16 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +93 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +39 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +594 -0
- package/dist/parser.js.map +1 -0
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +79 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +56 -0
package/dist/lexer.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// =====================================================================
|
|
2
|
+
// 1. Lexer(トークナイザ)
|
|
3
|
+
// =====================================================================
|
|
4
|
+
//
|
|
5
|
+
// ソース全体をトークン列に分解する。文字列リテラルとコメントは中身ごと
|
|
6
|
+
// 1トークンとして丸呑みするため、その中の `{` や `injectable` などの
|
|
7
|
+
// 文字列がDSLキーワードとして誤検出されることはない。
|
|
8
|
+
// DSLとして特別扱いする予約語。
|
|
9
|
+
// これら以外の識別子は普通の ident として扱われ、無条件にパススルーされる。
|
|
10
|
+
export const KEYWORDS = new Set(["configuration", "override", "injectable", "activate", "bind", "token"]);
|
|
11
|
+
export class Lexer {
|
|
12
|
+
src;
|
|
13
|
+
i = 0;
|
|
14
|
+
tokens = [];
|
|
15
|
+
constructor(src) {
|
|
16
|
+
this.src = src;
|
|
17
|
+
}
|
|
18
|
+
tokenize() {
|
|
19
|
+
while (this.i < this.src.length) {
|
|
20
|
+
const start = this.i;
|
|
21
|
+
const ch = this.src[this.i];
|
|
22
|
+
// --- 空白・改行 ---
|
|
23
|
+
if (/\s/.test(ch)) {
|
|
24
|
+
while (this.i < this.src.length && /\s/.test(this.src[this.i]))
|
|
25
|
+
this.i++;
|
|
26
|
+
this.emit("whitespace", start);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// --- 行コメント ---
|
|
30
|
+
if (ch === "/" && this.src[this.i + 1] === "/") {
|
|
31
|
+
while (this.i < this.src.length && this.src[this.i] !== "\n")
|
|
32
|
+
this.i++;
|
|
33
|
+
this.emit("comment", start);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
// --- ブロックコメント ---
|
|
37
|
+
if (ch === "/" && this.src[this.i + 1] === "*") {
|
|
38
|
+
this.i += 2;
|
|
39
|
+
while (this.i < this.src.length && !(this.src[this.i] === "*" && this.src[this.i + 1] === "/")) {
|
|
40
|
+
this.i++;
|
|
41
|
+
}
|
|
42
|
+
this.i = Math.min(this.i + 2, this.src.length);
|
|
43
|
+
this.emit("comment", start);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// --- 文字列リテラル('..' "..", `..`。テンプレートの ${..} 入れ子にも対応) ---
|
|
47
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
48
|
+
const quote = ch;
|
|
49
|
+
this.i++;
|
|
50
|
+
while (this.i < this.src.length && this.src[this.i] !== quote) {
|
|
51
|
+
if (this.src[this.i] === "\\") {
|
|
52
|
+
this.i += 2; // エスケープ文字はまとめて読み飛ばす
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (quote === "`" && this.src[this.i] === "$" && this.src[this.i + 1] === "{") {
|
|
56
|
+
// テンプレートリテラル内の ${ ... } はネスト深度を数えて丸ごとスキップする
|
|
57
|
+
this.i += 2;
|
|
58
|
+
let depth = 1;
|
|
59
|
+
while (this.i < this.src.length && depth > 0) {
|
|
60
|
+
if (this.src[this.i] === "{")
|
|
61
|
+
depth++;
|
|
62
|
+
else if (this.src[this.i] === "}")
|
|
63
|
+
depth--;
|
|
64
|
+
this.i++;
|
|
65
|
+
}
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
this.i++;
|
|
69
|
+
}
|
|
70
|
+
this.i++; // 閉じクォート
|
|
71
|
+
this.emit("string", start);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// --- 識別子 / 予約語 ---
|
|
75
|
+
if (/[A-Za-z_$]/.test(ch)) {
|
|
76
|
+
while (this.i < this.src.length && /[A-Za-z0-9_$]/.test(this.src[this.i]))
|
|
77
|
+
this.i++;
|
|
78
|
+
const text = this.src.slice(start, this.i);
|
|
79
|
+
this.tokens.push({ type: KEYWORDS.has(text) ? "keyword" : "ident", text, pos: start });
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// --- それ以外は1文字ずつ記号トークンとして扱う ---
|
|
83
|
+
this.i++;
|
|
84
|
+
this.emit("punct", start);
|
|
85
|
+
}
|
|
86
|
+
this.tokens.push({ type: "eof", text: "", pos: this.i });
|
|
87
|
+
return this.tokens;
|
|
88
|
+
}
|
|
89
|
+
emit(type, start) {
|
|
90
|
+
this.tokens.push({ type, text: this.src.slice(start, this.i), pos: start });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Token } from "./lexer.js";
|
|
2
|
+
import type { Node } from "./ast.js";
|
|
3
|
+
import { type DeclaredTypeKinds } from "./analysis.js";
|
|
4
|
+
export declare class DisonParseError extends Error {
|
|
5
|
+
constructor(message: string, pos: number);
|
|
6
|
+
}
|
|
7
|
+
export declare class Parser {
|
|
8
|
+
private readonly tokens;
|
|
9
|
+
private readonly knownConfigNames;
|
|
10
|
+
private readonly typeKinds;
|
|
11
|
+
private readonly blockContext;
|
|
12
|
+
private pos;
|
|
13
|
+
constructor(tokens: Token[], typeKinds: DeclaredTypeKinds);
|
|
14
|
+
private peek;
|
|
15
|
+
private next;
|
|
16
|
+
private isTrivia;
|
|
17
|
+
private skipTrivia;
|
|
18
|
+
private peekSignificant;
|
|
19
|
+
private expectPunct;
|
|
20
|
+
parseProgram(): Node[];
|
|
21
|
+
private looksLikeConfiguration;
|
|
22
|
+
private looksLikeToken;
|
|
23
|
+
private parseToken;
|
|
24
|
+
private looksLikeOverride;
|
|
25
|
+
private looksLikeBind;
|
|
26
|
+
private looksLikeInjectable;
|
|
27
|
+
private parseInjectable;
|
|
28
|
+
private parseOptionalAsToken;
|
|
29
|
+
private parseInjectableDefaultExpr;
|
|
30
|
+
private looksLikeActivate;
|
|
31
|
+
private parseActivate;
|
|
32
|
+
private parseTypeExpr;
|
|
33
|
+
private parseConfiguration;
|
|
34
|
+
private parseOverride;
|
|
35
|
+
private parseBind;
|
|
36
|
+
private parseGenericTypeRef;
|
|
37
|
+
private parseAssignment;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAyC,MAAM,UAAU,CAAC;AAC5E,OAAO,EACL,KAAK,iBAAiB,EAOvB,MAAM,eAAe,CAAC;AAEvB,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAEvC;CACF;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAc;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,GAAG,CAAK;IAEhB,YAAY,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAWxD;IAED,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,WAAW;IAOnB,YAAY,IAAI,IAAI,EAAE,CAgErB;IAMD,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,eAAe;IAwDvB,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,0BAA0B;IA6BlC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;IAqFrB,OAAO,CAAC,aAAa;IA4DrB,OAAO,CAAC,kBAAkB;IAoD1B,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,mBAAmB;IA0C3B,OAAO,CAAC,eAAe;CAsCxB"}
|