xbintsc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/bin/xbintsc.js +26 -0
  4. package/dist/src/ast/factory.d.ts +11 -0
  5. package/dist/src/ast/factory.js +36 -0
  6. package/dist/src/ast/factory.js.map +1 -0
  7. package/dist/src/ast/nodes.d.ts +848 -0
  8. package/dist/src/ast/nodes.js +247 -0
  9. package/dist/src/ast/nodes.js.map +1 -0
  10. package/dist/src/ast/visitor.d.ts +18 -0
  11. package/dist/src/ast/visitor.js +52 -0
  12. package/dist/src/ast/visitor.js.map +1 -0
  13. package/dist/src/binder/binder.d.ts +82 -0
  14. package/dist/src/binder/binder.js +443 -0
  15. package/dist/src/binder/binder.js.map +1 -0
  16. package/dist/src/cli/main.d.ts +16 -0
  17. package/dist/src/cli/main.js +191 -0
  18. package/dist/src/cli/main.js.map +1 -0
  19. package/dist/src/codegen/llvm.d.ts +31 -0
  20. package/dist/src/codegen/llvm.js +1178 -0
  21. package/dist/src/codegen/llvm.js.map +1 -0
  22. package/dist/src/codegen/values.d.ts +23 -0
  23. package/dist/src/codegen/values.js +32 -0
  24. package/dist/src/codegen/values.js.map +1 -0
  25. package/dist/src/diagnostics/diagnostic.d.ts +69 -0
  26. package/dist/src/diagnostics/diagnostic.js +104 -0
  27. package/dist/src/diagnostics/diagnostic.js.map +1 -0
  28. package/dist/src/diagnostics/source.d.ts +43 -0
  29. package/dist/src/diagnostics/source.js +73 -0
  30. package/dist/src/diagnostics/source.js.map +1 -0
  31. package/dist/src/driver/cache.d.ts +37 -0
  32. package/dist/src/driver/cache.js +82 -0
  33. package/dist/src/driver/cache.js.map +1 -0
  34. package/dist/src/driver/compiler.d.ts +41 -0
  35. package/dist/src/driver/compiler.js +128 -0
  36. package/dist/src/driver/compiler.js.map +1 -0
  37. package/dist/src/driver/index.d.ts +4 -0
  38. package/dist/src/driver/index.js +5 -0
  39. package/dist/src/driver/index.js.map +1 -0
  40. package/dist/src/driver/paths.d.ts +4 -0
  41. package/dist/src/driver/paths.js +22 -0
  42. package/dist/src/driver/paths.js.map +1 -0
  43. package/dist/src/driver/toolchain.d.ts +43 -0
  44. package/dist/src/driver/toolchain.js +76 -0
  45. package/dist/src/driver/toolchain.js.map +1 -0
  46. package/dist/src/extensions/node.d.ts +9 -0
  47. package/dist/src/extensions/node.js +20 -0
  48. package/dist/src/extensions/node.js.map +1 -0
  49. package/dist/src/extensions/registry.d.ts +45 -0
  50. package/dist/src/extensions/registry.js +76 -0
  51. package/dist/src/extensions/registry.js.map +1 -0
  52. package/dist/src/index.d.ts +18 -0
  53. package/dist/src/index.js +19 -0
  54. package/dist/src/index.js.map +1 -0
  55. package/dist/src/lexer/scanner.d.ts +48 -0
  56. package/dist/src/lexer/scanner.js +650 -0
  57. package/dist/src/lexer/scanner.js.map +1 -0
  58. package/dist/src/lexer/token.d.ts +170 -0
  59. package/dist/src/lexer/token.js +250 -0
  60. package/dist/src/lexer/token.js.map +1 -0
  61. package/dist/src/parser/parser.d.ts +127 -0
  62. package/dist/src/parser/parser.js +2334 -0
  63. package/dist/src/parser/parser.js.map +1 -0
  64. package/dist/tests/binder/binder.test.d.ts +1 -0
  65. package/dist/tests/binder/binder.test.js +89 -0
  66. package/dist/tests/binder/binder.test.js.map +1 -0
  67. package/dist/tests/cli/main.test.d.ts +1 -0
  68. package/dist/tests/cli/main.test.js +68 -0
  69. package/dist/tests/cli/main.test.js.map +1 -0
  70. package/dist/tests/cli/process.test.d.ts +9 -0
  71. package/dist/tests/cli/process.test.js +57 -0
  72. package/dist/tests/cli/process.test.js.map +1 -0
  73. package/dist/tests/codegen/llvm.test.d.ts +1 -0
  74. package/dist/tests/codegen/llvm.test.js +93 -0
  75. package/dist/tests/codegen/llvm.test.js.map +1 -0
  76. package/dist/tests/driver/cache.test.d.ts +1 -0
  77. package/dist/tests/driver/cache.test.js +66 -0
  78. package/dist/tests/driver/cache.test.js.map +1 -0
  79. package/dist/tests/driver/compiler.test.d.ts +1 -0
  80. package/dist/tests/driver/compiler.test.js +80 -0
  81. package/dist/tests/driver/compiler.test.js.map +1 -0
  82. package/dist/tests/driver/toolchain.test.d.ts +1 -0
  83. package/dist/tests/driver/toolchain.test.js +60 -0
  84. package/dist/tests/driver/toolchain.test.js.map +1 -0
  85. package/dist/tests/e2e/compile.test.d.ts +5 -0
  86. package/dist/tests/e2e/compile.test.js +93 -0
  87. package/dist/tests/e2e/compile.test.js.map +1 -0
  88. package/dist/tests/extensions/registry.test.d.ts +1 -0
  89. package/dist/tests/extensions/registry.test.js +47 -0
  90. package/dist/tests/extensions/registry.test.js.map +1 -0
  91. package/dist/tests/helpers.d.ts +23 -0
  92. package/dist/tests/helpers.js +41 -0
  93. package/dist/tests/helpers.js.map +1 -0
  94. package/dist/tests/lexer/scanner.test.d.ts +1 -0
  95. package/dist/tests/lexer/scanner.test.js +95 -0
  96. package/dist/tests/lexer/scanner.test.js.map +1 -0
  97. package/dist/tests/parser/parser.test.d.ts +1 -0
  98. package/dist/tests/parser/parser.test.js +137 -0
  99. package/dist/tests/parser/parser.test.js.map +1 -0
  100. package/package.json +49 -0
  101. package/runtime/ext_node.c +42 -0
  102. package/runtime/rt.h +177 -0
  103. package/runtime/xt_runtime.c +682 -0
  104. package/scripts/build-runtime.mjs +34 -0
  105. package/src/ast/factory.ts +37 -0
  106. package/src/ast/nodes.ts +1111 -0
  107. package/src/ast/visitor.ts +60 -0
  108. package/src/binder/binder.ts +549 -0
  109. package/src/cli/main.ts +210 -0
  110. package/src/codegen/llvm.ts +1324 -0
  111. package/src/codegen/values.ts +36 -0
  112. package/src/diagnostics/diagnostic.ts +132 -0
  113. package/src/diagnostics/source.ts +97 -0
  114. package/src/driver/cache.ts +96 -0
  115. package/src/driver/compiler.ts +197 -0
  116. package/src/driver/index.ts +4 -0
  117. package/src/driver/paths.ts +24 -0
  118. package/src/driver/toolchain.ts +103 -0
  119. package/src/extensions/node.ts +23 -0
  120. package/src/extensions/registry.ts +101 -0
  121. package/src/index.ts +33 -0
  122. package/src/lexer/scanner.ts +650 -0
  123. package/src/lexer/token.ts +266 -0
  124. package/src/parser/parser.ts +2396 -0
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Token taxonomy for the xbintsc lexer. Kept close to the TypeScript grammar so
3
+ * the parser can stay a direct recursive-descent transcription of the spec.
4
+ */
5
+
6
+ export enum TokenKind {
7
+ EndOfFile = "EndOfFile",
8
+ Identifier = "Identifier",
9
+ PrivateIdentifier = "PrivateIdentifier",
10
+ NumericLiteral = "NumericLiteral",
11
+ BigIntLiteral = "BigIntLiteral",
12
+ StringLiteral = "StringLiteral",
13
+ NoSubstitutionTemplateLiteral = "NoSubstitutionTemplateLiteral",
14
+ TemplateHead = "TemplateHead",
15
+ TemplateMiddle = "TemplateMiddle",
16
+ TemplateTail = "TemplateTail",
17
+ RegularExpressionLiteral = "RegularExpressionLiteral",
18
+
19
+ // Punctuation
20
+ OpenBrace = "{",
21
+ CloseBrace = "}",
22
+ OpenParen = "(",
23
+ CloseParen = ")",
24
+ OpenBracket = "[",
25
+ CloseBracket = "]",
26
+ Dot = ".",
27
+ DotDotDot = "...",
28
+ Semicolon = ";",
29
+ Comma = ",",
30
+ LessThan = "<",
31
+ GreaterThan = ">",
32
+ LessThanEquals = "<=",
33
+ GreaterThanEquals = ">=",
34
+ EqualsEquals = "==",
35
+ ExclamationEquals = "!=",
36
+ EqualsEqualsEquals = "===",
37
+ ExclamationEqualsEquals = "!==",
38
+ EqualsGreaterThan = "=>",
39
+ Plus = "+",
40
+ Minus = "-",
41
+ Asterisk = "*",
42
+ AsteriskAsterisk = "**",
43
+ Slash = "/",
44
+ Percent = "%",
45
+ PlusPlus = "++",
46
+ MinusMinus = "--",
47
+ LessThanLessThan = "<<",
48
+ GreaterThanGreaterThan = ">>",
49
+ GreaterThanGreaterThanGreaterThan = ">>>",
50
+ Ampersand = "&",
51
+ Bar = "|",
52
+ Caret = "^",
53
+ Exclamation = "!",
54
+ Tilde = "~",
55
+ AmpersandAmpersand = "&&",
56
+ BarBar = "||",
57
+ Question = "?",
58
+ Colon = ":",
59
+ Equals = "=",
60
+ PlusEquals = "+=",
61
+ MinusEquals = "-=",
62
+ AsteriskEquals = "*=",
63
+ AsteriskAsteriskEquals = "**=",
64
+ SlashEquals = "/=",
65
+ PercentEquals = "%=",
66
+ LessThanLessThanEquals = "<<=",
67
+ GreaterThanGreaterThanEquals = ">>=",
68
+ GreaterThanGreaterThanGreaterThanEquals = ">>>=",
69
+ AmpersandEquals = "&=",
70
+ BarEquals = "|=",
71
+ CaretEquals = "^=",
72
+ AmpersandAmpersandEquals = "&&=",
73
+ BarBarEquals = "||=",
74
+ QuestionQuestionEquals = "??=",
75
+ QuestionQuestion = "??",
76
+ QuestionDot = "?.",
77
+ At = "@",
78
+ Hash = "#",
79
+ Backtick = "`",
80
+
81
+ // Keywords (subset that xbintsc understands today, but the full set is tokenized
82
+ // so the parser can produce good "unsupported" diagnostics rather than
83
+ // confusing "unexpected token" errors).
84
+ AbstractKeyword = "abstract",
85
+ AnyKeyword = "any",
86
+ AsKeyword = "as",
87
+ AssertsKeyword = "asserts",
88
+ AsyncKeyword = "async",
89
+ AwaitKeyword = "await",
90
+ BigIntKeyword = "bigint",
91
+ BooleanKeyword = "boolean",
92
+ BreakKeyword = "break",
93
+ CaseKeyword = "case",
94
+ CatchKeyword = "catch",
95
+ ClassKeyword = "class",
96
+ ConstKeyword = "const",
97
+ ConstructorKeyword = "constructor",
98
+ ContinueKeyword = "continue",
99
+ DebuggerKeyword = "debugger",
100
+ DeclareKeyword = "declare",
101
+ DefaultKeyword = "default",
102
+ DeleteKeyword = "delete",
103
+ DoKeyword = "do",
104
+ ElseKeyword = "else",
105
+ EnumKeyword = "enum",
106
+ ExportKeyword = "export",
107
+ ExtendsKeyword = "extends",
108
+ FalseKeyword = "false",
109
+ FinallyKeyword = "finally",
110
+ ForKeyword = "for",
111
+ FromKeyword = "from",
112
+ FunctionKeyword = "function",
113
+ GetKeyword = "get",
114
+ IfKeyword = "if",
115
+ ImplementsKeyword = "implements",
116
+ ImportKeyword = "import",
117
+ InKeyword = "in",
118
+ InferKeyword = "infer",
119
+ InstanceOfKeyword = "instanceof",
120
+ InterfaceKeyword = "interface",
121
+ IsKeyword = "is",
122
+ KeyOfKeyword = "keyof",
123
+ LetKeyword = "let",
124
+ ModuleKeyword = "module",
125
+ NamespaceKeyword = "namespace",
126
+ NeverKeyword = "never",
127
+ NewKeyword = "new",
128
+ NullKeyword = "null",
129
+ NumberKeyword = "number",
130
+ ObjectKeyword = "object",
131
+ PackageKeyword = "package",
132
+ PrivateKeyword = "private",
133
+ ProtectedKeyword = "protected",
134
+ PublicKeyword = "public",
135
+ ReadonlyKeyword = "readonly",
136
+ ReturnKeyword = "return",
137
+ SatisfiesKeyword = "satisfies",
138
+ SetKeyword = "set",
139
+ StaticKeyword = "static",
140
+ StringKeyword = "string",
141
+ SuperKeyword = "super",
142
+ SwitchKeyword = "switch",
143
+ SymbolKeyword = "symbol",
144
+ ThisKeyword = "this",
145
+ ThrowKeyword = "throw",
146
+ TrueKeyword = "true",
147
+ TryKeyword = "try",
148
+ TypeKeyword = "type",
149
+ TypeOfKeyword = "typeof",
150
+ UndefinedKeyword = "undefined",
151
+ UniqueKeyword = "unique",
152
+ UnknownKeyword = "unknown",
153
+ VarKeyword = "var",
154
+ VoidKeyword = "void",
155
+ WhileKeyword = "while",
156
+ WithKeyword = "with",
157
+ YieldKeyword = "yield",
158
+ }
159
+
160
+ export interface Token {
161
+ readonly kind: TokenKind;
162
+ readonly start: number;
163
+ readonly end: number;
164
+ /** Raw source text of the token. */
165
+ readonly text: string;
166
+ /** Decoded value for string/number/template tokens. */
167
+ readonly value?: string | number | bigint;
168
+ /** True when a newline appeared between the previous token and this one. */
169
+ readonly precededByLineBreak: boolean;
170
+ }
171
+
172
+ export const KEYWORDS = new Map<string, TokenKind>([
173
+ ["abstract", TokenKind.AbstractKeyword],
174
+ ["any", TokenKind.AnyKeyword],
175
+ ["as", TokenKind.AsKeyword],
176
+ ["asserts", TokenKind.AssertsKeyword],
177
+ ["async", TokenKind.AsyncKeyword],
178
+ ["await", TokenKind.AwaitKeyword],
179
+ ["bigint", TokenKind.BigIntKeyword],
180
+ ["boolean", TokenKind.BooleanKeyword],
181
+ ["break", TokenKind.BreakKeyword],
182
+ ["case", TokenKind.CaseKeyword],
183
+ ["catch", TokenKind.CatchKeyword],
184
+ ["class", TokenKind.ClassKeyword],
185
+ ["const", TokenKind.ConstKeyword],
186
+ ["constructor", TokenKind.ConstructorKeyword],
187
+ ["continue", TokenKind.ContinueKeyword],
188
+ ["debugger", TokenKind.DebuggerKeyword],
189
+ ["declare", TokenKind.DeclareKeyword],
190
+ ["default", TokenKind.DefaultKeyword],
191
+ ["delete", TokenKind.DeleteKeyword],
192
+ ["do", TokenKind.DoKeyword],
193
+ ["else", TokenKind.ElseKeyword],
194
+ ["enum", TokenKind.EnumKeyword],
195
+ ["export", TokenKind.ExportKeyword],
196
+ ["extends", TokenKind.ExtendsKeyword],
197
+ ["false", TokenKind.FalseKeyword],
198
+ ["finally", TokenKind.FinallyKeyword],
199
+ ["for", TokenKind.ForKeyword],
200
+ ["from", TokenKind.FromKeyword],
201
+ ["function", TokenKind.FunctionKeyword],
202
+ ["get", TokenKind.GetKeyword],
203
+ ["if", TokenKind.IfKeyword],
204
+ ["implements", TokenKind.ImplementsKeyword],
205
+ ["import", TokenKind.ImportKeyword],
206
+ ["in", TokenKind.InKeyword],
207
+ ["infer", TokenKind.InferKeyword],
208
+ ["instanceof", TokenKind.InstanceOfKeyword],
209
+ ["interface", TokenKind.InterfaceKeyword],
210
+ ["is", TokenKind.IsKeyword],
211
+ ["keyof", TokenKind.KeyOfKeyword],
212
+ ["let", TokenKind.LetKeyword],
213
+ ["module", TokenKind.ModuleKeyword],
214
+ ["namespace", TokenKind.NamespaceKeyword],
215
+ ["never", TokenKind.NeverKeyword],
216
+ ["new", TokenKind.NewKeyword],
217
+ ["null", TokenKind.NullKeyword],
218
+ ["number", TokenKind.NumberKeyword],
219
+ ["object", TokenKind.ObjectKeyword],
220
+ ["package", TokenKind.PackageKeyword],
221
+ ["private", TokenKind.PrivateKeyword],
222
+ ["protected", TokenKind.ProtectedKeyword],
223
+ ["public", TokenKind.PublicKeyword],
224
+ ["readonly", TokenKind.ReadonlyKeyword],
225
+ ["return", TokenKind.ReturnKeyword],
226
+ ["satisfies", TokenKind.SatisfiesKeyword],
227
+ ["set", TokenKind.SetKeyword],
228
+ ["static", TokenKind.StaticKeyword],
229
+ ["string", TokenKind.StringKeyword],
230
+ ["super", TokenKind.SuperKeyword],
231
+ ["switch", TokenKind.SwitchKeyword],
232
+ ["symbol", TokenKind.SymbolKeyword],
233
+ ["this", TokenKind.ThisKeyword],
234
+ ["throw", TokenKind.ThrowKeyword],
235
+ ["true", TokenKind.TrueKeyword],
236
+ ["try", TokenKind.TryKeyword],
237
+ ["type", TokenKind.TypeKeyword],
238
+ ["typeof", TokenKind.TypeOfKeyword],
239
+ ["undefined", TokenKind.UndefinedKeyword],
240
+ ["unique", TokenKind.UniqueKeyword],
241
+ ["unknown", TokenKind.UnknownKeyword],
242
+ ["var", TokenKind.VarKeyword],
243
+ ["void", TokenKind.VoidKeyword],
244
+ ["while", TokenKind.WhileKeyword],
245
+ ["with", TokenKind.WithKeyword],
246
+ ["yield", TokenKind.YieldKeyword],
247
+ ]);
248
+
249
+ /**
250
+ * Keywords that are allowed in identifier position in some contexts and should
251
+ * therefore not be treated as hard errors when used as a name.
252
+ */
253
+ export const CONTEXTUAL_KEYWORDS: ReadonlySet<TokenKind> = new Set([
254
+ TokenKind.AsKeyword,
255
+ TokenKind.SatisfiesKeyword,
256
+ TokenKind.FromKeyword,
257
+ TokenKind.TypeKeyword,
258
+ TokenKind.GetKeyword,
259
+ TokenKind.SetKeyword,
260
+ TokenKind.AsyncKeyword,
261
+ ]);
262
+
263
+ /** True when the token text is the contextual `of` keyword. */
264
+ export function isOfKeyword(token: Token): boolean {
265
+ return token.kind === TokenKind.Identifier && token.text === "of";
266
+ }