tova 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.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/bin/tova.js +1530 -0
- package/package.json +38 -0
- package/src/analyzer/analyzer.js +2053 -0
- package/src/analyzer/scope.js +60 -0
- package/src/codegen/base-codegen.js +1351 -0
- package/src/codegen/client-codegen.js +876 -0
- package/src/codegen/codegen.js +148 -0
- package/src/codegen/server-codegen.js +2506 -0
- package/src/codegen/shared-codegen.js +29 -0
- package/src/diagnostics/formatter.js +139 -0
- package/src/formatter/formatter.js +559 -0
- package/src/index.js +6 -0
- package/src/lexer/lexer.js +886 -0
- package/src/lexer/tokens.js +214 -0
- package/src/lsp/server.js +738 -0
- package/src/parser/ast.js +1135 -0
- package/src/parser/parser.js +2803 -0
- package/src/runtime/db.js +106 -0
- package/src/runtime/embedded.js +8 -0
- package/src/runtime/reactivity.js +1366 -0
- package/src/runtime/router.js +200 -0
- package/src/runtime/rpc.js +46 -0
- package/src/runtime/ssr.js +134 -0
- package/src/runtime/string-proto.js +27 -0
- package/src/stdlib/collections.js +90 -0
- package/src/stdlib/core.js +98 -0
- package/src/stdlib/inline.js +172 -0
- package/src/stdlib/string.js +100 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// Token type definitions for the Tova language
|
|
2
|
+
|
|
3
|
+
export const TokenType = {
|
|
4
|
+
// Literals
|
|
5
|
+
NUMBER: 'NUMBER',
|
|
6
|
+
STRING: 'STRING',
|
|
7
|
+
STRING_TEMPLATE: 'STRING_TEMPLATE',
|
|
8
|
+
BOOLEAN: 'BOOLEAN',
|
|
9
|
+
NIL: 'NIL',
|
|
10
|
+
IDENTIFIER: 'IDENTIFIER',
|
|
11
|
+
|
|
12
|
+
// Keywords
|
|
13
|
+
VAR: 'VAR',
|
|
14
|
+
LET: 'LET',
|
|
15
|
+
FN: 'FN',
|
|
16
|
+
RETURN: 'RETURN',
|
|
17
|
+
IF: 'IF',
|
|
18
|
+
ELIF: 'ELIF',
|
|
19
|
+
ELSE: 'ELSE',
|
|
20
|
+
FOR: 'FOR',
|
|
21
|
+
WHILE: 'WHILE',
|
|
22
|
+
MATCH: 'MATCH',
|
|
23
|
+
TYPE: 'TYPE',
|
|
24
|
+
IMPORT: 'IMPORT',
|
|
25
|
+
FROM: 'FROM',
|
|
26
|
+
EXPORT: 'EXPORT',
|
|
27
|
+
AS: 'AS',
|
|
28
|
+
|
|
29
|
+
// Boolean / logic keywords
|
|
30
|
+
AND: 'AND',
|
|
31
|
+
OR: 'OR',
|
|
32
|
+
NOT: 'NOT',
|
|
33
|
+
IN: 'IN',
|
|
34
|
+
TRUE: 'TRUE',
|
|
35
|
+
FALSE: 'FALSE',
|
|
36
|
+
|
|
37
|
+
// Control flow
|
|
38
|
+
BREAK: 'BREAK',
|
|
39
|
+
CONTINUE: 'CONTINUE',
|
|
40
|
+
|
|
41
|
+
// Error handling
|
|
42
|
+
TRY: 'TRY',
|
|
43
|
+
CATCH: 'CATCH',
|
|
44
|
+
FINALLY: 'FINALLY',
|
|
45
|
+
|
|
46
|
+
// Async
|
|
47
|
+
ASYNC: 'ASYNC',
|
|
48
|
+
AWAIT: 'AWAIT',
|
|
49
|
+
|
|
50
|
+
// Guard
|
|
51
|
+
GUARD: 'GUARD',
|
|
52
|
+
|
|
53
|
+
// Interface
|
|
54
|
+
INTERFACE: 'INTERFACE',
|
|
55
|
+
DERIVE: 'DERIVE',
|
|
56
|
+
|
|
57
|
+
// Visibility
|
|
58
|
+
PUB: 'PUB',
|
|
59
|
+
|
|
60
|
+
// Impl blocks / traits
|
|
61
|
+
IMPL: 'IMPL',
|
|
62
|
+
TRAIT: 'TRAIT',
|
|
63
|
+
|
|
64
|
+
// Defer
|
|
65
|
+
DEFER: 'DEFER',
|
|
66
|
+
|
|
67
|
+
// Generators
|
|
68
|
+
YIELD: 'YIELD',
|
|
69
|
+
|
|
70
|
+
// Extern
|
|
71
|
+
EXTERN: 'EXTERN',
|
|
72
|
+
|
|
73
|
+
// Full-stack keywords
|
|
74
|
+
SERVER: 'SERVER',
|
|
75
|
+
CLIENT: 'CLIENT',
|
|
76
|
+
SHARED: 'SHARED',
|
|
77
|
+
ROUTE: 'ROUTE',
|
|
78
|
+
STATE: 'STATE',
|
|
79
|
+
COMPUTED: 'COMPUTED',
|
|
80
|
+
EFFECT: 'EFFECT',
|
|
81
|
+
COMPONENT: 'COMPONENT',
|
|
82
|
+
STORE: 'STORE',
|
|
83
|
+
STYLE_BLOCK: 'STYLE_BLOCK',
|
|
84
|
+
|
|
85
|
+
// HTTP methods (used in route declarations)
|
|
86
|
+
GET: 'GET',
|
|
87
|
+
POST: 'POST',
|
|
88
|
+
PUT: 'PUT',
|
|
89
|
+
DELETE: 'DELETE',
|
|
90
|
+
PATCH: 'PATCH',
|
|
91
|
+
|
|
92
|
+
// Operators
|
|
93
|
+
PLUS: 'PLUS', // +
|
|
94
|
+
MINUS: 'MINUS', // -
|
|
95
|
+
STAR: 'STAR', // *
|
|
96
|
+
SLASH: 'SLASH', // /
|
|
97
|
+
PERCENT: 'PERCENT', // %
|
|
98
|
+
POWER: 'POWER', // **
|
|
99
|
+
ASSIGN: 'ASSIGN', // =
|
|
100
|
+
EQUAL: 'EQUAL', // ==
|
|
101
|
+
NOT_EQUAL: 'NOT_EQUAL', // !=
|
|
102
|
+
LESS: 'LESS', // <
|
|
103
|
+
LESS_EQUAL: 'LESS_EQUAL', // <=
|
|
104
|
+
GREATER: 'GREATER', // >
|
|
105
|
+
GREATER_EQUAL: 'GREATER_EQUAL', // >=
|
|
106
|
+
AND_AND: 'AND_AND', // &&
|
|
107
|
+
OR_OR: 'OR_OR', // ||
|
|
108
|
+
BANG: 'BANG', // !
|
|
109
|
+
PIPE: 'PIPE', // |>
|
|
110
|
+
ARROW: 'ARROW', // =>
|
|
111
|
+
THIN_ARROW: 'THIN_ARROW', // ->
|
|
112
|
+
DOT: 'DOT', // .
|
|
113
|
+
DOT_DOT: 'DOT_DOT', // ..
|
|
114
|
+
DOT_DOT_EQUAL: 'DOT_DOT_EQUAL', // ..=
|
|
115
|
+
SPREAD: 'SPREAD', // ...
|
|
116
|
+
COLON: 'COLON', // :
|
|
117
|
+
DOUBLE_COLON: 'DOUBLE_COLON', // ::
|
|
118
|
+
QUESTION: 'QUESTION', // ?
|
|
119
|
+
QUESTION_DOT: 'QUESTION_DOT', // ?.
|
|
120
|
+
QUESTION_QUESTION: 'QUESTION_QUESTION', // ??
|
|
121
|
+
PLUS_ASSIGN: 'PLUS_ASSIGN', // +=
|
|
122
|
+
MINUS_ASSIGN: 'MINUS_ASSIGN', // -=
|
|
123
|
+
STAR_ASSIGN: 'STAR_ASSIGN', // *=
|
|
124
|
+
SLASH_ASSIGN: 'SLASH_ASSIGN', // /=
|
|
125
|
+
|
|
126
|
+
// Delimiters
|
|
127
|
+
LPAREN: 'LPAREN', // (
|
|
128
|
+
RPAREN: 'RPAREN', // )
|
|
129
|
+
LBRACE: 'LBRACE', // {
|
|
130
|
+
RBRACE: 'RBRACE', // }
|
|
131
|
+
LBRACKET: 'LBRACKET', // [
|
|
132
|
+
RBRACKET: 'RBRACKET', // ]
|
|
133
|
+
COMMA: 'COMMA', // ,
|
|
134
|
+
SEMICOLON: 'SEMICOLON', // ;
|
|
135
|
+
NEWLINE: 'NEWLINE', // \n (significant in some contexts)
|
|
136
|
+
|
|
137
|
+
// JSX
|
|
138
|
+
JSX_OPEN: 'JSX_OPEN', // <tag
|
|
139
|
+
JSX_CLOSE: 'JSX_CLOSE', // </tag>
|
|
140
|
+
JSX_SELF_CLOSE: 'JSX_SELF_CLOSE', // />
|
|
141
|
+
JSX_TEXT: 'JSX_TEXT',
|
|
142
|
+
|
|
143
|
+
// Regex
|
|
144
|
+
REGEX: 'REGEX', // /pattern/flags
|
|
145
|
+
|
|
146
|
+
// Special
|
|
147
|
+
EOF: 'EOF',
|
|
148
|
+
DOCSTRING: 'DOCSTRING', // /// comment
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// Keywords map for quick lookup during lexing
|
|
152
|
+
export const Keywords = {
|
|
153
|
+
'var': TokenType.VAR,
|
|
154
|
+
'let': TokenType.LET,
|
|
155
|
+
'fn': TokenType.FN,
|
|
156
|
+
'return': TokenType.RETURN,
|
|
157
|
+
'if': TokenType.IF,
|
|
158
|
+
'elif': TokenType.ELIF,
|
|
159
|
+
'else': TokenType.ELSE,
|
|
160
|
+
'for': TokenType.FOR,
|
|
161
|
+
'while': TokenType.WHILE,
|
|
162
|
+
'match': TokenType.MATCH,
|
|
163
|
+
'type': TokenType.TYPE,
|
|
164
|
+
'import': TokenType.IMPORT,
|
|
165
|
+
'from': TokenType.FROM,
|
|
166
|
+
'export': TokenType.EXPORT,
|
|
167
|
+
'as': TokenType.AS,
|
|
168
|
+
'and': TokenType.AND,
|
|
169
|
+
'or': TokenType.OR,
|
|
170
|
+
'not': TokenType.NOT,
|
|
171
|
+
'in': TokenType.IN,
|
|
172
|
+
'true': TokenType.TRUE,
|
|
173
|
+
'false': TokenType.FALSE,
|
|
174
|
+
'nil': TokenType.NIL,
|
|
175
|
+
'break': TokenType.BREAK,
|
|
176
|
+
'continue': TokenType.CONTINUE,
|
|
177
|
+
'try': TokenType.TRY,
|
|
178
|
+
'catch': TokenType.CATCH,
|
|
179
|
+
'finally': TokenType.FINALLY,
|
|
180
|
+
'async': TokenType.ASYNC,
|
|
181
|
+
'await': TokenType.AWAIT,
|
|
182
|
+
'guard': TokenType.GUARD,
|
|
183
|
+
'interface': TokenType.INTERFACE,
|
|
184
|
+
'derive': TokenType.DERIVE,
|
|
185
|
+
'pub': TokenType.PUB,
|
|
186
|
+
'impl': TokenType.IMPL,
|
|
187
|
+
'trait': TokenType.TRAIT,
|
|
188
|
+
'defer': TokenType.DEFER,
|
|
189
|
+
'yield': TokenType.YIELD,
|
|
190
|
+
'extern': TokenType.EXTERN,
|
|
191
|
+
'server': TokenType.SERVER,
|
|
192
|
+
'client': TokenType.CLIENT,
|
|
193
|
+
'shared': TokenType.SHARED,
|
|
194
|
+
'route': TokenType.ROUTE,
|
|
195
|
+
'state': TokenType.STATE,
|
|
196
|
+
'computed': TokenType.COMPUTED,
|
|
197
|
+
'effect': TokenType.EFFECT,
|
|
198
|
+
'component': TokenType.COMPONENT,
|
|
199
|
+
'store': TokenType.STORE,
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// Token class
|
|
203
|
+
export class Token {
|
|
204
|
+
constructor(type, value, line, column) {
|
|
205
|
+
this.type = type;
|
|
206
|
+
this.value = value;
|
|
207
|
+
this.line = line;
|
|
208
|
+
this.column = column;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
toString() {
|
|
212
|
+
return `Token(${this.type}, ${JSON.stringify(this.value)}, ${this.line}:${this.column})`;
|
|
213
|
+
}
|
|
214
|
+
}
|