@barishnamazov/gsql 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/src/lexer.ts ADDED
@@ -0,0 +1,636 @@
1
+ /**
2
+ * GSQL Lexer
3
+ *
4
+ * Defines all tokens used in the GSQL language using Chevrotain.
5
+ * Tokens are organized by category for clarity and maintainability.
6
+ */
7
+
8
+ import { createToken, Lexer } from "chevrotain";
9
+
10
+ // ============================================================================
11
+ // Whitespace & Comments
12
+ // ============================================================================
13
+
14
+ export const WhiteSpace = createToken({
15
+ name: "WhiteSpace",
16
+ pattern: /\s+/,
17
+ group: Lexer.SKIPPED,
18
+ });
19
+
20
+ export const LineComment = createToken({
21
+ name: "LineComment",
22
+ pattern: /\/\/[^\n]*/,
23
+ group: Lexer.SKIPPED,
24
+ });
25
+
26
+ export const BlockComment = createToken({
27
+ name: "BlockComment",
28
+ pattern: /\/\*[\s\S]*?\*\//,
29
+ group: Lexer.SKIPPED,
30
+ });
31
+
32
+ // ============================================================================
33
+ // Identifiers (must be defined first for longer_alt references)
34
+ // ============================================================================
35
+
36
+ export const Identifier = createToken({
37
+ name: "Identifier",
38
+ pattern: /[a-zA-Z_][a-zA-Z0-9_]*/,
39
+ });
40
+
41
+ export const TemplateIdentifier = createToken({
42
+ name: "TemplateIdentifier",
43
+ pattern: /\{[a-zA-Z_][a-zA-Z0-9_]*\}/,
44
+ });
45
+
46
+ // ============================================================================
47
+ // Keywords (use longer_alt to avoid conflicts)
48
+ // ============================================================================
49
+
50
+ export const Concept = createToken({
51
+ name: "Concept",
52
+ pattern: /concept/,
53
+ longer_alt: Identifier,
54
+ });
55
+
56
+ export const Schema = createToken({
57
+ name: "Schema",
58
+ pattern: /schema/,
59
+ longer_alt: Identifier,
60
+ });
61
+
62
+ export const Mixin = createToken({
63
+ name: "Mixin",
64
+ pattern: /mixin/,
65
+ longer_alt: Identifier,
66
+ });
67
+
68
+ export const Enum = createToken({
69
+ name: "Enum",
70
+ pattern: /enum/,
71
+ longer_alt: Identifier,
72
+ });
73
+
74
+ export const Extension = createToken({
75
+ name: "Extension",
76
+ pattern: /extension/,
77
+ longer_alt: Identifier,
78
+ });
79
+
80
+ export const Function = createToken({
81
+ name: "Function",
82
+ pattern: /function/,
83
+ longer_alt: Identifier,
84
+ });
85
+
86
+ export const Func = createToken({
87
+ name: "Func",
88
+ pattern: /func/,
89
+ longer_alt: Identifier,
90
+ });
91
+
92
+ export const Trigger = createToken({
93
+ name: "Trigger",
94
+ pattern: /trigger/,
95
+ longer_alt: Identifier,
96
+ });
97
+
98
+ export const Index = createToken({
99
+ name: "Index",
100
+ pattern: /index/,
101
+ longer_alt: Identifier,
102
+ });
103
+
104
+ export const Check = createToken({
105
+ name: "Check",
106
+ pattern: /check/,
107
+ longer_alt: Identifier,
108
+ });
109
+
110
+ export const Before = createToken({
111
+ name: "Before",
112
+ pattern: /before/,
113
+ longer_alt: Identifier,
114
+ });
115
+
116
+ export const After = createToken({
117
+ name: "After",
118
+ pattern: /after/,
119
+ longer_alt: Identifier,
120
+ });
121
+
122
+ export const Ondelete = createToken({
123
+ name: "Ondelete",
124
+ pattern: /ondelete/,
125
+ longer_alt: Identifier,
126
+ });
127
+
128
+ export const On = createToken({
129
+ name: "On",
130
+ pattern: /on/,
131
+ longer_alt: Identifier,
132
+ });
133
+
134
+ export const Each = createToken({
135
+ name: "Each",
136
+ pattern: /each/,
137
+ longer_alt: Identifier,
138
+ });
139
+
140
+ export const Row = createToken({
141
+ name: "Row",
142
+ pattern: /row/,
143
+ longer_alt: Identifier,
144
+ });
145
+
146
+ export const Statement = createToken({
147
+ name: "Statement",
148
+ pattern: /statement/,
149
+ longer_alt: Identifier,
150
+ });
151
+
152
+ export const Execute = createToken({
153
+ name: "Execute",
154
+ pattern: /execute/,
155
+ longer_alt: Identifier,
156
+ });
157
+
158
+ export const Unique = createToken({
159
+ name: "Unique",
160
+ pattern: /unique/,
161
+ longer_alt: Identifier,
162
+ });
163
+
164
+ export const Gin = createToken({
165
+ name: "Gin",
166
+ pattern: /gin/,
167
+ longer_alt: Identifier,
168
+ });
169
+
170
+ export const Gist = createToken({
171
+ name: "Gist",
172
+ pattern: /gist/,
173
+ longer_alt: Identifier,
174
+ });
175
+
176
+ export const Btree = createToken({
177
+ name: "Btree",
178
+ pattern: /btree/,
179
+ longer_alt: Identifier,
180
+ });
181
+
182
+ export const Hash = createToken({
183
+ name: "Hash",
184
+ pattern: /hash/,
185
+ longer_alt: Identifier,
186
+ });
187
+
188
+ export const Pkey = createToken({
189
+ name: "Pkey",
190
+ pattern: /pkey/,
191
+ longer_alt: Identifier,
192
+ });
193
+
194
+ export const Nonull = createToken({
195
+ name: "Nonull",
196
+ pattern: /nonull/,
197
+ longer_alt: Identifier,
198
+ });
199
+
200
+ export const Default = createToken({
201
+ name: "Default",
202
+ pattern: /default/,
203
+ longer_alt: Identifier,
204
+ });
205
+
206
+ export const Ref = createToken({
207
+ name: "Ref",
208
+ pattern: /ref/,
209
+ longer_alt: Identifier,
210
+ });
211
+
212
+ export const Cascade = createToken({
213
+ name: "Cascade",
214
+ pattern: /cascade/,
215
+ longer_alt: Identifier,
216
+ });
217
+
218
+ export const Restrict = createToken({
219
+ name: "Restrict",
220
+ pattern: /restrict/,
221
+ longer_alt: Identifier,
222
+ });
223
+
224
+ export const SetNull = createToken({
225
+ name: "SetNull",
226
+ pattern: /setnull/,
227
+ longer_alt: Identifier,
228
+ });
229
+
230
+ export const SetDefault = createToken({
231
+ name: "SetDefault",
232
+ pattern: /setdefault/,
233
+ longer_alt: Identifier,
234
+ });
235
+
236
+ export const NoAction = createToken({
237
+ name: "NoAction",
238
+ pattern: /noaction/,
239
+ longer_alt: Identifier,
240
+ });
241
+
242
+ export const Update = createToken({
243
+ name: "Update",
244
+ pattern: /update/,
245
+ longer_alt: Identifier,
246
+ });
247
+
248
+ export const Insert = createToken({
249
+ name: "Insert",
250
+ pattern: /insert/,
251
+ longer_alt: Identifier,
252
+ });
253
+
254
+ export const Delete = createToken({
255
+ name: "Delete",
256
+ pattern: /delete/,
257
+ longer_alt: Identifier,
258
+ });
259
+
260
+ export const Return = createToken({
261
+ name: "Return",
262
+ pattern: /return/,
263
+ longer_alt: Identifier,
264
+ });
265
+
266
+ export const New = createToken({
267
+ name: "New",
268
+ pattern: /NEW/,
269
+ longer_alt: Identifier,
270
+ });
271
+
272
+ export const Old = createToken({
273
+ name: "Old",
274
+ pattern: /OLD/,
275
+ longer_alt: Identifier,
276
+ });
277
+
278
+ // ============================================================================
279
+ // Data Types
280
+ // ============================================================================
281
+
282
+ export const Serial = createToken({
283
+ name: "Serial",
284
+ pattern: /serial/i,
285
+ longer_alt: Identifier,
286
+ });
287
+
288
+ export const BigSerial = createToken({
289
+ name: "BigSerial",
290
+ pattern: /bigserial/i,
291
+ longer_alt: Identifier,
292
+ });
293
+
294
+ export const Integer = createToken({
295
+ name: "Integer",
296
+ pattern: /integer/i,
297
+ longer_alt: Identifier,
298
+ });
299
+
300
+ export const Bigint = createToken({
301
+ name: "Bigint",
302
+ pattern: /bigint/i,
303
+ longer_alt: Identifier,
304
+ });
305
+
306
+ export const SmallInt = createToken({
307
+ name: "SmallInt",
308
+ pattern: /smallint/i,
309
+ longer_alt: Identifier,
310
+ });
311
+
312
+ export const Text = createToken({
313
+ name: "Text",
314
+ pattern: /text/i,
315
+ longer_alt: Identifier,
316
+ });
317
+
318
+ export const Varchar = createToken({
319
+ name: "Varchar",
320
+ pattern: /varchar/i,
321
+ longer_alt: Identifier,
322
+ });
323
+
324
+ export const Char = createToken({
325
+ name: "Char",
326
+ pattern: /char/i,
327
+ longer_alt: Identifier,
328
+ });
329
+
330
+ export const Boolean = createToken({
331
+ name: "Boolean",
332
+ pattern: /boolean/i,
333
+ longer_alt: Identifier,
334
+ });
335
+
336
+ export const Timestamptz = createToken({
337
+ name: "Timestamptz",
338
+ pattern: /timestamptz/i,
339
+ longer_alt: Identifier,
340
+ });
341
+
342
+ export const Timestamp = createToken({
343
+ name: "Timestamp",
344
+ pattern: /timestamp/i,
345
+ longer_alt: Identifier,
346
+ });
347
+
348
+ export const Date = createToken({
349
+ name: "Date",
350
+ pattern: /date/i,
351
+ longer_alt: Identifier,
352
+ });
353
+
354
+ export const Time = createToken({
355
+ name: "Time",
356
+ pattern: /time/i,
357
+ longer_alt: Identifier,
358
+ });
359
+
360
+ export const Jsonb = createToken({
361
+ name: "Jsonb",
362
+ pattern: /jsonb/i,
363
+ longer_alt: Identifier,
364
+ });
365
+
366
+ export const Json = createToken({
367
+ name: "Json",
368
+ pattern: /json/i,
369
+ longer_alt: Identifier,
370
+ });
371
+
372
+ export const Uuid = createToken({
373
+ name: "Uuid",
374
+ pattern: /uuid/i,
375
+ longer_alt: Identifier,
376
+ });
377
+
378
+ export const Inet = createToken({
379
+ name: "Inet",
380
+ pattern: /inet/i,
381
+ longer_alt: Identifier,
382
+ });
383
+
384
+ export const Citext = createToken({
385
+ name: "Citext",
386
+ pattern: /citext/i,
387
+ longer_alt: Identifier,
388
+ });
389
+
390
+ export const Decimal = createToken({
391
+ name: "Decimal",
392
+ pattern: /decimal/i,
393
+ longer_alt: Identifier,
394
+ });
395
+
396
+ export const Numeric = createToken({
397
+ name: "Numeric",
398
+ pattern: /numeric/i,
399
+ longer_alt: Identifier,
400
+ });
401
+
402
+ export const Real = createToken({
403
+ name: "Real",
404
+ pattern: /real/i,
405
+ longer_alt: Identifier,
406
+ });
407
+
408
+ export const DoublePrecision = createToken({
409
+ name: "DoublePrecision",
410
+ pattern: /double\s+precision/i,
411
+ longer_alt: Identifier,
412
+ });
413
+
414
+ export const Bytea = createToken({
415
+ name: "Bytea",
416
+ pattern: /bytea/i,
417
+ longer_alt: Identifier,
418
+ });
419
+
420
+ // ============================================================================
421
+ // Literals
422
+ // ============================================================================
423
+
424
+ export const StringLiteral = createToken({
425
+ name: "StringLiteral",
426
+ pattern: /'(?:[^'\\]|\\.)*'/,
427
+ });
428
+
429
+ export const NumberLiteral = createToken({
430
+ name: "NumberLiteral",
431
+ pattern: /-?\d+(?:\.\d+)?/,
432
+ });
433
+
434
+ export const BooleanLiteral = createToken({
435
+ name: "BooleanLiteral",
436
+ pattern: /true|false/,
437
+ longer_alt: Identifier,
438
+ });
439
+
440
+ export const NullLiteral = createToken({
441
+ name: "NullLiteral",
442
+ pattern: /null/i,
443
+ longer_alt: Identifier,
444
+ });
445
+
446
+ // ============================================================================
447
+ // Operators & Punctuation
448
+ // ============================================================================
449
+
450
+ export const Arrow = createToken({
451
+ name: "Arrow",
452
+ pattern: /->/,
453
+ });
454
+
455
+ export const DoubleColon = createToken({
456
+ name: "DoubleColon",
457
+ pattern: /::/,
458
+ });
459
+
460
+ export const LBrace = createToken({
461
+ name: "LBrace",
462
+ pattern: /\{/,
463
+ });
464
+
465
+ export const RBrace = createToken({
466
+ name: "RBrace",
467
+ pattern: /\}/,
468
+ });
469
+
470
+ export const LParen = createToken({
471
+ name: "LParen",
472
+ pattern: /\(/,
473
+ });
474
+
475
+ export const RParen = createToken({
476
+ name: "RParen",
477
+ pattern: /\)/,
478
+ });
479
+
480
+ export const LBracket = createToken({
481
+ name: "LBracket",
482
+ pattern: /\[/,
483
+ });
484
+
485
+ export const RBracket = createToken({
486
+ name: "RBracket",
487
+ pattern: /\]/,
488
+ });
489
+
490
+ export const LAngle = createToken({
491
+ name: "LAngle",
492
+ pattern: /</,
493
+ });
494
+
495
+ export const RAngle = createToken({
496
+ name: "RAngle",
497
+ pattern: />/,
498
+ });
499
+
500
+ export const Semicolon = createToken({
501
+ name: "Semicolon",
502
+ pattern: /;/,
503
+ });
504
+
505
+ export const Comma = createToken({
506
+ name: "Comma",
507
+ pattern: /,/,
508
+ });
509
+
510
+ export const Dot = createToken({
511
+ name: "Dot",
512
+ pattern: /\./,
513
+ });
514
+
515
+ export const Equals = createToken({
516
+ name: "Equals",
517
+ pattern: /=/,
518
+ });
519
+
520
+ // ============================================================================
521
+ // Token Array (order matters - more specific patterns first)
522
+ // ============================================================================
523
+
524
+ export const allTokens = [
525
+ // Whitespace and comments (highest priority, skipped)
526
+ WhiteSpace,
527
+ LineComment,
528
+ BlockComment,
529
+
530
+ // Multi-character operators
531
+ Arrow,
532
+ DoubleColon,
533
+
534
+ // Keywords - longer ones first to avoid prefix matching issues
535
+ Concept,
536
+ Schema,
537
+ Mixin,
538
+ Enum,
539
+ Extension,
540
+ Function,
541
+ Func,
542
+ Trigger,
543
+ Index,
544
+ Check,
545
+ Before,
546
+ After,
547
+ Ondelete,
548
+ On,
549
+ Each,
550
+ Row,
551
+ Statement,
552
+ Execute,
553
+ Unique,
554
+ Gin,
555
+ Gist,
556
+ Btree,
557
+ Hash,
558
+ Pkey,
559
+ Nonull,
560
+ Default,
561
+ Ref,
562
+ SetDefault,
563
+ SetNull,
564
+ Cascade,
565
+ Restrict,
566
+ NoAction,
567
+ Update,
568
+ Insert,
569
+ Delete,
570
+ Return,
571
+ New,
572
+ Old,
573
+
574
+ // Data types (longer ones first)
575
+ DoublePrecision,
576
+ Timestamptz,
577
+ Timestamp,
578
+ BigSerial,
579
+ Serial,
580
+ SmallInt,
581
+ Bigint,
582
+ Integer,
583
+ Varchar,
584
+ Char,
585
+ Text,
586
+ Boolean,
587
+ Date,
588
+ Time,
589
+ Jsonb,
590
+ Json,
591
+ Uuid,
592
+ Inet,
593
+ Citext,
594
+ Decimal,
595
+ Numeric,
596
+ Real,
597
+ Bytea,
598
+
599
+ // Literals
600
+ StringLiteral,
601
+ NumberLiteral,
602
+ BooleanLiteral,
603
+ NullLiteral,
604
+
605
+ // Template identifier (before regular Identifier)
606
+ TemplateIdentifier,
607
+
608
+ // Regular identifier (catch-all)
609
+ Identifier,
610
+
611
+ // Punctuation
612
+ LBrace,
613
+ RBrace,
614
+ LParen,
615
+ RParen,
616
+ LBracket,
617
+ RBracket,
618
+ LAngle,
619
+ RAngle,
620
+ Semicolon,
621
+ Comma,
622
+ Dot,
623
+ Equals,
624
+ ];
625
+
626
+ // ============================================================================
627
+ // Create Lexer Instance
628
+ // ============================================================================
629
+
630
+ export const GSQLLexer = new Lexer(allTokens, {
631
+ ensureOptimizations: true,
632
+ });
633
+
634
+ export function tokenize(input: string): ReturnType<typeof GSQLLexer.tokenize> {
635
+ return GSQLLexer.tokenize(input);
636
+ }