Author: Michael Davis [mcarsondavis@gmail.com]
Hash: 5d3e631a08a878e52c8545bff5e1558010ccab15
Timestamp: Thu, 23 Dec 2021 23:54:18 +0000 (2 years ago)

+1356 -41 +/-6 browse
parse a simple text-file based example
1diff --git a/grammar.js b/grammar.js
2index f37fde0..d9f22a9 100644
3--- a/grammar.js
4+++ b/grammar.js
5 @@ -1,13 +1,54 @@
6 const NEWLINE = /\r?\n/;
7+ const WHITE_SPACE = /[\t\f\v ]+/;
8+ const ANYTHING = /[^\r\n]+/;
9+
10+ const COMMAND_PRELUDE = prec(30, token.immediate("diff"));
11+ const INDEX_PRELUDE = prec(25, token.immediate("index"));
12+ const FILE_PRELUDE = prec(
13+ 20,
14+ token.immediate(field("kind", choice("---", "+++")))
15+ );
16+ const LOCATION_PRELUDE = prec(15, token.immediate("@@"));
17+ const ADDITION_PRELUDE = prec(10, token.immediate("+"));
18+ const DELETION_PRELUDE = prec(5, token.immediate("-"));
19
20 module.exports = grammar({
21 name: "gitdiff",
22
23- extras: ($) => [],
24+ extras: ($) => [WHITE_SPACE],
25
26 rules: {
27- source: ($) => repeat($._line),
28+ source: ($) => repeat(seq($._line, NEWLINE)),
29+
30+ _line: ($) =>
31+ choice(
32+ $.command,
33+ $.index,
34+ $.file,
35+ $.location,
36+ $.addition,
37+ $.deletion,
38+ $.context
39+ ),
40+
41+ command: ($) => seq(COMMAND_PRELUDE, "--git", $.filename),
42+
43+ index: ($) => seq(INDEX_PRELUDE, $.commit, "..", $.commit, $.mode),
44+
45+ file: ($) => seq(FILE_PRELUDE, $.filename),
46+
47+ location: ($) =>
48+ seq(LOCATION_PRELUDE, $.linerange, $.linerange, "@@", ANYTHING),
49+
50+ addition: ($) => seq(ADDITION_PRELUDE, optional(ANYTHING)),
51+
52+ deletion: ($) => seq(DELETION_PRELUDE, optional(ANYTHING)),
53+
54+ context: ($) => token(prec(-1, ANYTHING)),
55
56- _line: ($) => choice(),
57+ linerange: ($) => /[-\+]\d+,\d+/,
58+ filename: ($) => ANYTHING,
59+ commit: ($) => /[a-f0-9]{7,40}/,
60+ mode: ($) => /\d+/,
61 },
62 });
63 diff --git a/src/grammar.json b/src/grammar.json
64index 4559391..b9061f6 100644
65--- a/src/grammar.json
66+++ b/src/grammar.json
67 @@ -2,11 +2,265 @@
68 "name": "gitdiff",
69 "rules": {
70 "source": {
71- "type": "STRING",
72- "value": "hello"
73+ "type": "REPEAT",
74+ "content": {
75+ "type": "SEQ",
76+ "members": [
77+ {
78+ "type": "SYMBOL",
79+ "name": "_line"
80+ },
81+ {
82+ "type": "PATTERN",
83+ "value": "\\r?\\n"
84+ }
85+ ]
86+ }
87+ },
88+ "_line": {
89+ "type": "CHOICE",
90+ "members": [
91+ {
92+ "type": "SYMBOL",
93+ "name": "command"
94+ },
95+ {
96+ "type": "SYMBOL",
97+ "name": "index"
98+ },
99+ {
100+ "type": "SYMBOL",
101+ "name": "file"
102+ },
103+ {
104+ "type": "SYMBOL",
105+ "name": "location"
106+ },
107+ {
108+ "type": "SYMBOL",
109+ "name": "addition"
110+ },
111+ {
112+ "type": "SYMBOL",
113+ "name": "deletion"
114+ },
115+ {
116+ "type": "SYMBOL",
117+ "name": "context"
118+ }
119+ ]
120+ },
121+ "command": {
122+ "type": "SEQ",
123+ "members": [
124+ {
125+ "type": "PREC",
126+ "value": 30,
127+ "content": {
128+ "type": "IMMEDIATE_TOKEN",
129+ "content": {
130+ "type": "STRING",
131+ "value": "diff"
132+ }
133+ }
134+ },
135+ {
136+ "type": "STRING",
137+ "value": "--git"
138+ },
139+ {
140+ "type": "SYMBOL",
141+ "name": "filename"
142+ }
143+ ]
144+ },
145+ "index": {
146+ "type": "SEQ",
147+ "members": [
148+ {
149+ "type": "PREC",
150+ "value": 25,
151+ "content": {
152+ "type": "IMMEDIATE_TOKEN",
153+ "content": {
154+ "type": "STRING",
155+ "value": "index"
156+ }
157+ }
158+ },
159+ {
160+ "type": "SYMBOL",
161+ "name": "commit"
162+ },
163+ {
164+ "type": "STRING",
165+ "value": ".."
166+ },
167+ {
168+ "type": "SYMBOL",
169+ "name": "commit"
170+ },
171+ {
172+ "type": "SYMBOL",
173+ "name": "mode"
174+ }
175+ ]
176+ },
177+ "file": {
178+ "type": "SEQ",
179+ "members": [
180+ {
181+ "type": "PREC",
182+ "value": 20,
183+ "content": {
184+ "type": "IMMEDIATE_TOKEN",
185+ "content": {
186+ "type": "FIELD",
187+ "name": "kind",
188+ "content": {
189+ "type": "CHOICE",
190+ "members": [
191+ {
192+ "type": "STRING",
193+ "value": "---"
194+ },
195+ {
196+ "type": "STRING",
197+ "value": "+++"
198+ }
199+ ]
200+ }
201+ }
202+ }
203+ },
204+ {
205+ "type": "SYMBOL",
206+ "name": "filename"
207+ }
208+ ]
209+ },
210+ "location": {
211+ "type": "SEQ",
212+ "members": [
213+ {
214+ "type": "PREC",
215+ "value": 15,
216+ "content": {
217+ "type": "IMMEDIATE_TOKEN",
218+ "content": {
219+ "type": "STRING",
220+ "value": "@@"
221+ }
222+ }
223+ },
224+ {
225+ "type": "SYMBOL",
226+ "name": "linerange"
227+ },
228+ {
229+ "type": "SYMBOL",
230+ "name": "linerange"
231+ },
232+ {
233+ "type": "STRING",
234+ "value": "@@"
235+ },
236+ {
237+ "type": "PATTERN",
238+ "value": "[^\\r\\n]+"
239+ }
240+ ]
241+ },
242+ "addition": {
243+ "type": "SEQ",
244+ "members": [
245+ {
246+ "type": "PREC",
247+ "value": 10,
248+ "content": {
249+ "type": "IMMEDIATE_TOKEN",
250+ "content": {
251+ "type": "STRING",
252+ "value": "+"
253+ }
254+ }
255+ },
256+ {
257+ "type": "CHOICE",
258+ "members": [
259+ {
260+ "type": "PATTERN",
261+ "value": "[^\\r\\n]+"
262+ },
263+ {
264+ "type": "BLANK"
265+ }
266+ ]
267+ }
268+ ]
269+ },
270+ "deletion": {
271+ "type": "SEQ",
272+ "members": [
273+ {
274+ "type": "PREC",
275+ "value": 5,
276+ "content": {
277+ "type": "IMMEDIATE_TOKEN",
278+ "content": {
279+ "type": "STRING",
280+ "value": "-"
281+ }
282+ }
283+ },
284+ {
285+ "type": "CHOICE",
286+ "members": [
287+ {
288+ "type": "PATTERN",
289+ "value": "[^\\r\\n]+"
290+ },
291+ {
292+ "type": "BLANK"
293+ }
294+ ]
295+ }
296+ ]
297+ },
298+ "context": {
299+ "type": "TOKEN",
300+ "content": {
301+ "type": "PREC",
302+ "value": -1,
303+ "content": {
304+ "type": "PATTERN",
305+ "value": "[^\\r\\n]+"
306+ }
307+ }
308+ },
309+ "linerange": {
310+ "type": "PATTERN",
311+ "value": "[-\\+]\\d+,\\d+"
312+ },
313+ "filename": {
314+ "type": "PATTERN",
315+ "value": "[^\\r\\n]+"
316+ },
317+ "commit": {
318+ "type": "PATTERN",
319+ "value": "[a-f0-9]{7,40}"
320+ },
321+ "mode": {
322+ "type": "PATTERN",
323+ "value": "\\d+"
324 }
325 },
326- "extras": [],
327+ "extras": [
328+ {
329+ "type": "PATTERN",
330+ "value": "[\\t\\f\\v ]+"
331+ }
332+ ],
333 "conflicts": [],
334 "precedences": [],
335 "externals": [],
336 diff --git a/src/node-types.json b/src/node-types.json
337index c3b80ca..51fc099 100644
338--- a/src/node-types.json
339+++ b/src/node-types.json
340 @@ -1,11 +1,164 @@
341 [
342 {
343- "type": "source",
344+ "type": "addition",
345+ "named": true,
346+ "fields": {}
347+ },
348+ {
349+ "type": "command",
350+ "named": true,
351+ "fields": {},
352+ "children": {
353+ "multiple": false,
354+ "required": true,
355+ "types": [
356+ {
357+ "type": "filename",
358+ "named": true
359+ }
360+ ]
361+ }
362+ },
363+ {
364+ "type": "deletion",
365+ "named": true,
366+ "fields": {}
367+ },
368+ {
369+ "type": "file",
370+ "named": true,
371+ "fields": {},
372+ "children": {
373+ "multiple": false,
374+ "required": true,
375+ "types": [
376+ {
377+ "type": "filename",
378+ "named": true
379+ }
380+ ]
381+ }
382+ },
383+ {
384+ "type": "filename",
385 "named": true,
386 "fields": {}
387 },
388 {
389- "type": "hello",
390+ "type": "index",
391+ "named": true,
392+ "fields": {},
393+ "children": {
394+ "multiple": true,
395+ "required": true,
396+ "types": [
397+ {
398+ "type": "commit",
399+ "named": true
400+ },
401+ {
402+ "type": "mode",
403+ "named": true
404+ }
405+ ]
406+ }
407+ },
408+ {
409+ "type": "location",
410+ "named": true,
411+ "fields": {},
412+ "children": {
413+ "multiple": true,
414+ "required": true,
415+ "types": [
416+ {
417+ "type": "linerange",
418+ "named": true
419+ }
420+ ]
421+ }
422+ },
423+ {
424+ "type": "source",
425+ "named": true,
426+ "fields": {},
427+ "children": {
428+ "multiple": true,
429+ "required": false,
430+ "types": [
431+ {
432+ "type": "addition",
433+ "named": true
434+ },
435+ {
436+ "type": "command",
437+ "named": true
438+ },
439+ {
440+ "type": "context",
441+ "named": true
442+ },
443+ {
444+ "type": "deletion",
445+ "named": true
446+ },
447+ {
448+ "type": "file",
449+ "named": true
450+ },
451+ {
452+ "type": "index",
453+ "named": true
454+ },
455+ {
456+ "type": "location",
457+ "named": true
458+ }
459+ ]
460+ }
461+ },
462+ {
463+ "type": "+",
464 "named": false
465+ },
466+ {
467+ "type": "-",
468+ "named": false
469+ },
470+ {
471+ "type": "--git",
472+ "named": false
473+ },
474+ {
475+ "type": "..",
476+ "named": false
477+ },
478+ {
479+ "type": "@@",
480+ "named": false
481+ },
482+ {
483+ "type": "commit",
484+ "named": true
485+ },
486+ {
487+ "type": "context",
488+ "named": true
489+ },
490+ {
491+ "type": "diff",
492+ "named": false
493+ },
494+ {
495+ "type": "index",
496+ "named": false
497+ },
498+ {
499+ "type": "linerange",
500+ "named": true
501+ },
502+ {
503+ "type": "mode",
504+ "named": true
505 }
506 ]
507\ No newline at end of file
508 diff --git a/src/parser.c b/src/parser.c
509index 4dee83b..f5f5299 100644
510--- a/src/parser.c
511+++ b/src/parser.c
512 @@ -6,31 +6,100 @@
513 #endif
514
515 #define LANGUAGE_VERSION 13
516- #define STATE_COUNT 4
517- #define LARGE_STATE_COUNT 2
518- #define SYMBOL_COUNT 3
519+ #define STATE_COUNT 27
520+ #define LARGE_STATE_COUNT 4
521+ #define SYMBOL_COUNT 26
522 #define ALIAS_COUNT 0
523- #define TOKEN_COUNT 2
524+ #define TOKEN_COUNT 16
525 #define EXTERNAL_TOKEN_COUNT 0
526 #define FIELD_COUNT 0
527- #define MAX_ALIAS_SEQUENCE_LENGTH 1
528+ #define MAX_ALIAS_SEQUENCE_LENGTH 5
529 #define PRODUCTION_ID_COUNT 1
530
531 enum {
532- anon_sym_hello = 1,
533- sym_source = 2,
534+ aux_sym_source_token1 = 1,
535+ anon_sym_diff = 2,
536+ anon_sym_DASH_DASHgit = 3,
537+ anon_sym_index = 4,
538+ anon_sym_DOT_DOT = 5,
539+ aux_sym_file_token1 = 6,
540+ anon_sym_AT_AT = 7,
541+ anon_sym_AT_AT2 = 8,
542+ aux_sym_location_token1 = 9,
543+ anon_sym_PLUS = 10,
544+ anon_sym_DASH = 11,
545+ sym_context = 12,
546+ sym_linerange = 13,
547+ sym_commit = 14,
548+ sym_mode = 15,
549+ sym_source = 16,
550+ sym__line = 17,
551+ sym_command = 18,
552+ sym_index = 19,
553+ sym_file = 20,
554+ sym_location = 21,
555+ sym_addition = 22,
556+ sym_deletion = 23,
557+ sym_filename = 24,
558+ aux_sym_source_repeat1 = 25,
559 };
560
561 static const char * const ts_symbol_names[] = {
562 [ts_builtin_sym_end] = "end",
563- [anon_sym_hello] = "hello",
564+ [aux_sym_source_token1] = "source_token1",
565+ [anon_sym_diff] = "diff",
566+ [anon_sym_DASH_DASHgit] = "--git",
567+ [anon_sym_index] = "index",
568+ [anon_sym_DOT_DOT] = "..",
569+ [aux_sym_file_token1] = "file_token1",
570+ [anon_sym_AT_AT] = "@@",
571+ [anon_sym_AT_AT2] = "@@",
572+ [aux_sym_location_token1] = "location_token1",
573+ [anon_sym_PLUS] = "+",
574+ [anon_sym_DASH] = "-",
575+ [sym_context] = "context",
576+ [sym_linerange] = "linerange",
577+ [sym_commit] = "commit",
578+ [sym_mode] = "mode",
579 [sym_source] = "source",
580+ [sym__line] = "_line",
581+ [sym_command] = "command",
582+ [sym_index] = "index",
583+ [sym_file] = "file",
584+ [sym_location] = "location",
585+ [sym_addition] = "addition",
586+ [sym_deletion] = "deletion",
587+ [sym_filename] = "filename",
588+ [aux_sym_source_repeat1] = "source_repeat1",
589 };
590
591 static const TSSymbol ts_symbol_map[] = {
592 [ts_builtin_sym_end] = ts_builtin_sym_end,
593- [anon_sym_hello] = anon_sym_hello,
594+ [aux_sym_source_token1] = aux_sym_source_token1,
595+ [anon_sym_diff] = anon_sym_diff,
596+ [anon_sym_DASH_DASHgit] = anon_sym_DASH_DASHgit,
597+ [anon_sym_index] = anon_sym_index,
598+ [anon_sym_DOT_DOT] = anon_sym_DOT_DOT,
599+ [aux_sym_file_token1] = aux_sym_file_token1,
600+ [anon_sym_AT_AT] = anon_sym_AT_AT,
601+ [anon_sym_AT_AT2] = anon_sym_AT_AT,
602+ [aux_sym_location_token1] = aux_sym_location_token1,
603+ [anon_sym_PLUS] = anon_sym_PLUS,
604+ [anon_sym_DASH] = anon_sym_DASH,
605+ [sym_context] = sym_context,
606+ [sym_linerange] = sym_linerange,
607+ [sym_commit] = sym_commit,
608+ [sym_mode] = sym_mode,
609 [sym_source] = sym_source,
610+ [sym__line] = sym__line,
611+ [sym_command] = sym_command,
612+ [sym_index] = sym_index,
613+ [sym_file] = sym_file,
614+ [sym_location] = sym_location,
615+ [sym_addition] = sym_addition,
616+ [sym_deletion] = sym_deletion,
617+ [sym_filename] = sym_filename,
618+ [aux_sym_source_repeat1] = aux_sym_source_repeat1,
619 };
620
621 static const TSSymbolMetadata ts_symbol_metadata[] = {
622 @@ -38,14 +107,106 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
623 .visible = false,
624 .named = true,
625 },
626- [anon_sym_hello] = {
627+ [aux_sym_source_token1] = {
628+ .visible = false,
629+ .named = false,
630+ },
631+ [anon_sym_diff] = {
632+ .visible = true,
633+ .named = false,
634+ },
635+ [anon_sym_DASH_DASHgit] = {
636+ .visible = true,
637+ .named = false,
638+ },
639+ [anon_sym_index] = {
640+ .visible = true,
641+ .named = false,
642+ },
643+ [anon_sym_DOT_DOT] = {
644+ .visible = true,
645+ .named = false,
646+ },
647+ [aux_sym_file_token1] = {
648+ .visible = false,
649+ .named = false,
650+ },
651+ [anon_sym_AT_AT] = {
652+ .visible = true,
653+ .named = false,
654+ },
655+ [anon_sym_AT_AT2] = {
656+ .visible = true,
657+ .named = false,
658+ },
659+ [aux_sym_location_token1] = {
660+ .visible = false,
661+ .named = false,
662+ },
663+ [anon_sym_PLUS] = {
664+ .visible = true,
665+ .named = false,
666+ },
667+ [anon_sym_DASH] = {
668 .visible = true,
669 .named = false,
670 },
671+ [sym_context] = {
672+ .visible = true,
673+ .named = true,
674+ },
675+ [sym_linerange] = {
676+ .visible = true,
677+ .named = true,
678+ },
679+ [sym_commit] = {
680+ .visible = true,
681+ .named = true,
682+ },
683+ [sym_mode] = {
684+ .visible = true,
685+ .named = true,
686+ },
687 [sym_source] = {
688 .visible = true,
689 .named = true,
690 },
691+ [sym__line] = {
692+ .visible = false,
693+ .named = true,
694+ },
695+ [sym_command] = {
696+ .visible = true,
697+ .named = true,
698+ },
699+ [sym_index] = {
700+ .visible = true,
701+ .named = true,
702+ },
703+ [sym_file] = {
704+ .visible = true,
705+ .named = true,
706+ },
707+ [sym_location] = {
708+ .visible = true,
709+ .named = true,
710+ },
711+ [sym_addition] = {
712+ .visible = true,
713+ .named = true,
714+ },
715+ [sym_deletion] = {
716+ .visible = true,
717+ .named = true,
718+ },
719+ [sym_filename] = {
720+ .visible = true,
721+ .named = true,
722+ },
723+ [aux_sym_source_repeat1] = {
724+ .visible = false,
725+ .named = false,
726+ },
727 };
728
729 static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = {
730 @@ -61,26 +222,468 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
731 eof = lexer->eof(lexer);
732 switch (state) {
733 case 0:
734- if (eof) ADVANCE(5);
735- if (lookahead == 'h') ADVANCE(1);
736+ if (eof) ADVANCE(31);
737+ if (lookahead == '\n') ADVANCE(32);
738+ if (lookahead == '\r') ADVANCE(1);
739+ if (lookahead == '+') ADVANCE(42);
740+ if (lookahead == '-') ADVANCE(44);
741+ if (lookahead == '.') ADVANCE(8);
742+ if (lookahead == '@') ADVANCE(9);
743+ if (lookahead == 'd') ADVANCE(16);
744+ if (lookahead == 'i') ADVANCE(18);
745+ if (('\t' <= lookahead && lookahead <= '\f') ||
746+ lookahead == ' ') SKIP(29)
747+ if (('0' <= lookahead && lookahead <= '9') ||
748+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(28);
749 END_STATE();
750 case 1:
751- if (lookahead == 'e') ADVANCE(3);
752+ if (lookahead == '\n') ADVANCE(32);
753 END_STATE();
754 case 2:
755- if (lookahead == 'l') ADVANCE(4);
756+ if (lookahead == '\n') ADVANCE(32);
757+ if (lookahead == '\r') ADVANCE(1);
758+ if (('\t' <= lookahead && lookahead <= '\f') ||
759+ lookahead == ' ') ADVANCE(40);
760+ if (lookahead != 0) ADVANCE(41);
761 END_STATE();
762 case 3:
763- if (lookahead == 'l') ADVANCE(2);
764+ if (lookahead == '+') ADVANCE(37);
765 END_STATE();
766 case 4:
767- if (lookahead == 'o') ADVANCE(6);
768+ if (lookahead == '+') ADVANCE(21);
769+ if (lookahead == '-') ADVANCE(7);
770+ if (lookahead == '@') ADVANCE(10);
771+ if (lookahead == '\t' ||
772+ lookahead == 11 ||
773+ lookahead == '\f' ||
774+ lookahead == ' ') SKIP(4)
775+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(93);
776 END_STATE();
777 case 5:
778- ACCEPT_TOKEN(ts_builtin_sym_end);
779+ if (lookahead == ',') ADVANCE(22);
780+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(5);
781 END_STATE();
782 case 6:
783- ACCEPT_TOKEN(anon_sym_hello);
784+ if (lookahead == '-') ADVANCE(37);
785+ END_STATE();
786+ case 7:
787+ if (lookahead == '-') ADVANCE(15);
788+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(5);
789+ END_STATE();
790+ case 8:
791+ if (lookahead == '.') ADVANCE(36);
792+ END_STATE();
793+ case 9:
794+ if (lookahead == '@') ADVANCE(38);
795+ END_STATE();
796+ case 10:
797+ if (lookahead == '@') ADVANCE(39);
798+ END_STATE();
799+ case 11:
800+ if (lookahead == 'd') ADVANCE(12);
801+ END_STATE();
802+ case 12:
803+ if (lookahead == 'e') ADVANCE(20);
804+ END_STATE();
805+ case 13:
806+ if (lookahead == 'f') ADVANCE(33);
807+ END_STATE();
808+ case 14:
809+ if (lookahead == 'f') ADVANCE(13);
810+ END_STATE();
811+ case 15:
812+ if (lookahead == 'g') ADVANCE(17);
813+ END_STATE();
814+ case 16:
815+ if (lookahead == 'i') ADVANCE(14);
816+ if (('0' <= lookahead && lookahead <= '9') ||
817+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(27);
818+ END_STATE();
819+ case 17:
820+ if (lookahead == 'i') ADVANCE(19);
821+ END_STATE();
822+ case 18:
823+ if (lookahead == 'n') ADVANCE(11);
824+ END_STATE();
825+ case 19:
826+ if (lookahead == 't') ADVANCE(34);
827+ END_STATE();
828+ case 20:
829+ if (lookahead == 'x') ADVANCE(35);
830+ END_STATE();
831+ case 21:
832+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(5);
833+ END_STATE();
834+ case 22:
835+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(58);
836+ END_STATE();
837+ case 23:
838+ if (('0' <= lookahead && lookahead <= '9') ||
839+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(92);
840+ END_STATE();
841+ case 24:
842+ if (('0' <= lookahead && lookahead <= '9') ||
843+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(23);
844+ END_STATE();
845+ case 25:
846+ if (('0' <= lookahead && lookahead <= '9') ||
847+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(24);
848+ END_STATE();
849+ case 26:
850+ if (('0' <= lookahead && lookahead <= '9') ||
851+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(25);
852+ END_STATE();
853+ case 27:
854+ if (('0' <= lookahead && lookahead <= '9') ||
855+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(26);
856+ END_STATE();
857+ case 28:
858+ if (('0' <= lookahead && lookahead <= '9') ||
859+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(27);
860+ END_STATE();
861+ case 29:
862+ if (eof) ADVANCE(31);
863+ if (lookahead == '\n') ADVANCE(32);
864+ if (lookahead == '\r') ADVANCE(1);
865+ if (lookahead == '.') ADVANCE(8);
866+ if (lookahead == '@') ADVANCE(10);
867+ if (('\t' <= lookahead && lookahead <= '\f') ||
868+ lookahead == ' ') SKIP(29)
869+ if (('0' <= lookahead && lookahead <= '9') ||
870+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(28);
871+ END_STATE();
872+ case 30:
873+ if (eof) ADVANCE(31);
874+ if (lookahead == '+') ADVANCE(43);
875+ if (lookahead == '-') ADVANCE(45);
876+ if (lookahead == '@') ADVANCE(48);
877+ if (lookahead == 'd') ADVANCE(53);
878+ if (lookahead == 'i') ADVANCE(54);
879+ if (lookahead == '\t' ||
880+ lookahead == 11 ||
881+ lookahead == '\f' ||
882+ lookahead == ' ') ADVANCE(56);
883+ if (lookahead != 0 &&
884+ (lookahead < '\n' || '\r' < lookahead)) ADVANCE(57);
885+ END_STATE();
886+ case 31:
887+ ACCEPT_TOKEN(ts_builtin_sym_end);
888+ END_STATE();
889+ case 32:
890+ ACCEPT_TOKEN(aux_sym_source_token1);
891+ END_STATE();
892+ case 33:
893+ ACCEPT_TOKEN(anon_sym_diff);
894+ END_STATE();
895+ case 34:
896+ ACCEPT_TOKEN(anon_sym_DASH_DASHgit);
897+ END_STATE();
898+ case 35:
899+ ACCEPT_TOKEN(anon_sym_index);
900+ END_STATE();
901+ case 36:
902+ ACCEPT_TOKEN(anon_sym_DOT_DOT);
903+ END_STATE();
904+ case 37:
905+ ACCEPT_TOKEN(aux_sym_file_token1);
906+ END_STATE();
907+ case 38:
908+ ACCEPT_TOKEN(anon_sym_AT_AT);
909+ END_STATE();
910+ case 39:
911+ ACCEPT_TOKEN(anon_sym_AT_AT2);
912+ END_STATE();
913+ case 40:
914+ ACCEPT_TOKEN(aux_sym_location_token1);
915+ if (lookahead == '\t' ||
916+ lookahead == 11 ||
917+ lookahead == '\f' ||
918+ lookahead == ' ') ADVANCE(40);
919+ if (lookahead != 0 &&
920+ (lookahead < '\n' || '\r' < lookahead)) ADVANCE(41);
921+ END_STATE();
922+ case 41:
923+ ACCEPT_TOKEN(aux_sym_location_token1);
924+ if (lookahead != 0 &&
925+ lookahead != '\n' &&
926+ lookahead != '\r') ADVANCE(41);
927+ END_STATE();
928+ case 42:
929+ ACCEPT_TOKEN(anon_sym_PLUS);
930+ if (lookahead == '+') ADVANCE(3);
931+ END_STATE();
932+ case 43:
933+ ACCEPT_TOKEN(anon_sym_PLUS);
934+ if (lookahead == '+') ADVANCE(46);
935+ END_STATE();
936+ case 44:
937+ ACCEPT_TOKEN(anon_sym_DASH);
938+ if (lookahead == '-') ADVANCE(6);
939+ END_STATE();
940+ case 45:
941+ ACCEPT_TOKEN(anon_sym_DASH);
942+ if (lookahead == '-') ADVANCE(47);
943+ END_STATE();
944+ case 46:
945+ ACCEPT_TOKEN(sym_context);
946+ if (lookahead == '+') ADVANCE(37);
947+ if (lookahead != 0 &&
948+ lookahead != '\n' &&
949+ lookahead != '\r') ADVANCE(57);
950+ END_STATE();
951+ case 47:
952+ ACCEPT_TOKEN(sym_context);
953+ if (lookahead == '-') ADVANCE(37);
954+ if (lookahead != 0 &&
955+ lookahead != '\n' &&
956+ lookahead != '\r') ADVANCE(57);
957+ END_STATE();
958+ case 48:
959+ ACCEPT_TOKEN(sym_context);
960+ if (lookahead == '@') ADVANCE(38);
961+ if (lookahead != 0 &&
962+ lookahead != '\n' &&
963+ lookahead != '\r') ADVANCE(57);
964+ END_STATE();
965+ case 49:
966+ ACCEPT_TOKEN(sym_context);
967+ if (lookahead == 'd') ADVANCE(50);
968+ if (lookahead != 0 &&
969+ lookahead != '\n' &&
970+ lookahead != '\r') ADVANCE(57);
971+ END_STATE();
972+ case 50:
973+ ACCEPT_TOKEN(sym_context);
974+ if (lookahead == 'e') ADVANCE(55);
975+ if (lookahead != 0 &&
976+ lookahead != '\n' &&
977+ lookahead != '\r') ADVANCE(57);
978+ END_STATE();
979+ case 51:
980+ ACCEPT_TOKEN(sym_context);
981+ if (lookahead == 'f') ADVANCE(33);
982+ if (lookahead != 0 &&
983+ lookahead != '\n' &&
984+ lookahead != '\r') ADVANCE(57);
985+ END_STATE();
986+ case 52:
987+ ACCEPT_TOKEN(sym_context);
988+ if (lookahead == 'f') ADVANCE(51);
989+ if (lookahead != 0 &&
990+ lookahead != '\n' &&
991+ lookahead != '\r') ADVANCE(57);
992+ END_STATE();
993+ case 53:
994+ ACCEPT_TOKEN(sym_context);
995+ if (lookahead == 'i') ADVANCE(52);
996+ if (lookahead != 0 &&
997+ lookahead != '\n' &&
998+ lookahead != '\r') ADVANCE(57);
999+ END_STATE();
1000+ case 54:
1001+ ACCEPT_TOKEN(sym_context);
1002+ if (lookahead == 'n') ADVANCE(49);
1003+ if (lookahead != 0 &&
1004+ lookahead != '\n' &&
1005+ lookahead != '\r') ADVANCE(57);
1006+ END_STATE();
1007+ case 55:
1008+ ACCEPT_TOKEN(sym_context);
1009+ if (lookahead == 'x') ADVANCE(35);
1010+ if (lookahead != 0 &&
1011+ lookahead != '\n' &&
1012+ lookahead != '\r') ADVANCE(57);
1013+ END_STATE();
1014+ case 56:
1015+ ACCEPT_TOKEN(sym_context);
1016+ if (lookahead == '\t' ||
1017+ lookahead == 11 ||
1018+ lookahead == '\f' ||
1019+ lookahead == ' ') ADVANCE(56);
1020+ if (lookahead != 0 &&
1021+ (lookahead < '\n' || '\r' < lookahead)) ADVANCE(57);
1022+ END_STATE();
1023+ case 57:
1024+ ACCEPT_TOKEN(sym_context);
1025+ if (lookahead != 0 &&
1026+ lookahead != '\n' &&
1027+ lookahead != '\r') ADVANCE(57);
1028+ END_STATE();
1029+ case 58:
1030+ ACCEPT_TOKEN(sym_linerange);
1031+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(58);
1032+ END_STATE();
1033+ case 59:
1034+ ACCEPT_TOKEN(sym_commit);
1035+ END_STATE();
1036+ case 60:
1037+ ACCEPT_TOKEN(sym_commit);
1038+ if (('0' <= lookahead && lookahead <= '9') ||
1039+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(59);
1040+ END_STATE();
1041+ case 61:
1042+ ACCEPT_TOKEN(sym_commit);
1043+ if (('0' <= lookahead && lookahead <= '9') ||
1044+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(60);
1045+ END_STATE();
1046+ case 62:
1047+ ACCEPT_TOKEN(sym_commit);
1048+ if (('0' <= lookahead && lookahead <= '9') ||
1049+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(61);
1050+ END_STATE();
1051+ case 63:
1052+ ACCEPT_TOKEN(sym_commit);
1053+ if (('0' <= lookahead && lookahead <= '9') ||
1054+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(62);
1055+ END_STATE();
1056+ case 64:
1057+ ACCEPT_TOKEN(sym_commit);
1058+ if (('0' <= lookahead && lookahead <= '9') ||
1059+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(63);
1060+ END_STATE();
1061+ case 65:
1062+ ACCEPT_TOKEN(sym_commit);
1063+ if (('0' <= lookahead && lookahead <= '9') ||
1064+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(64);
1065+ END_STATE();
1066+ case 66:
1067+ ACCEPT_TOKEN(sym_commit);
1068+ if (('0' <= lookahead && lookahead <= '9') ||
1069+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(65);
1070+ END_STATE();
1071+ case 67:
1072+ ACCEPT_TOKEN(sym_commit);
1073+ if (('0' <= lookahead && lookahead <= '9') ||
1074+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(66);
1075+ END_STATE();
1076+ case 68:
1077+ ACCEPT_TOKEN(sym_commit);
1078+ if (('0' <= lookahead && lookahead <= '9') ||
1079+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(67);
1080+ END_STATE();
1081+ case 69:
1082+ ACCEPT_TOKEN(sym_commit);
1083+ if (('0' <= lookahead && lookahead <= '9') ||
1084+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(68);
1085+ END_STATE();
1086+ case 70:
1087+ ACCEPT_TOKEN(sym_commit);
1088+ if (('0' <= lookahead && lookahead <= '9') ||
1089+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(69);
1090+ END_STATE();
1091+ case 71:
1092+ ACCEPT_TOKEN(sym_commit);
1093+ if (('0' <= lookahead && lookahead <= '9') ||
1094+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(70);
1095+ END_STATE();
1096+ case 72:
1097+ ACCEPT_TOKEN(sym_commit);
1098+ if (('0' <= lookahead && lookahead <= '9') ||
1099+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(71);
1100+ END_STATE();
1101+ case 73:
1102+ ACCEPT_TOKEN(sym_commit);
1103+ if (('0' <= lookahead && lookahead <= '9') ||
1104+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(72);
1105+ END_STATE();
1106+ case 74:
1107+ ACCEPT_TOKEN(sym_commit);
1108+ if (('0' <= lookahead && lookahead <= '9') ||
1109+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(73);
1110+ END_STATE();
1111+ case 75:
1112+ ACCEPT_TOKEN(sym_commit);
1113+ if (('0' <= lookahead && lookahead <= '9') ||
1114+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(74);
1115+ END_STATE();
1116+ case 76:
1117+ ACCEPT_TOKEN(sym_commit);
1118+ if (('0' <= lookahead && lookahead <= '9') ||
1119+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(75);
1120+ END_STATE();
1121+ case 77:
1122+ ACCEPT_TOKEN(sym_commit);
1123+ if (('0' <= lookahead && lookahead <= '9') ||
1124+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(76);
1125+ END_STATE();
1126+ case 78:
1127+ ACCEPT_TOKEN(sym_commit);
1128+ if (('0' <= lookahead && lookahead <= '9') ||
1129+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(77);
1130+ END_STATE();
1131+ case 79:
1132+ ACCEPT_TOKEN(sym_commit);
1133+ if (('0' <= lookahead && lookahead <= '9') ||
1134+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(78);
1135+ END_STATE();
1136+ case 80:
1137+ ACCEPT_TOKEN(sym_commit);
1138+ if (('0' <= lookahead && lookahead <= '9') ||
1139+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(79);
1140+ END_STATE();
1141+ case 81:
1142+ ACCEPT_TOKEN(sym_commit);
1143+ if (('0' <= lookahead && lookahead <= '9') ||
1144+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(80);
1145+ END_STATE();
1146+ case 82:
1147+ ACCEPT_TOKEN(sym_commit);
1148+ if (('0' <= lookahead && lookahead <= '9') ||
1149+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(81);
1150+ END_STATE();
1151+ case 83:
1152+ ACCEPT_TOKEN(sym_commit);
1153+ if (('0' <= lookahead && lookahead <= '9') ||
1154+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(82);
1155+ END_STATE();
1156+ case 84:
1157+ ACCEPT_TOKEN(sym_commit);
1158+ if (('0' <= lookahead && lookahead <= '9') ||
1159+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(83);
1160+ END_STATE();
1161+ case 85:
1162+ ACCEPT_TOKEN(sym_commit);
1163+ if (('0' <= lookahead && lookahead <= '9') ||
1164+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(84);
1165+ END_STATE();
1166+ case 86:
1167+ ACCEPT_TOKEN(sym_commit);
1168+ if (('0' <= lookahead && lookahead <= '9') ||
1169+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(85);
1170+ END_STATE();
1171+ case 87:
1172+ ACCEPT_TOKEN(sym_commit);
1173+ if (('0' <= lookahead && lookahead <= '9') ||
1174+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(86);
1175+ END_STATE();
1176+ case 88:
1177+ ACCEPT_TOKEN(sym_commit);
1178+ if (('0' <= lookahead && lookahead <= '9') ||
1179+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(87);
1180+ END_STATE();
1181+ case 89:
1182+ ACCEPT_TOKEN(sym_commit);
1183+ if (('0' <= lookahead && lookahead <= '9') ||
1184+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(88);
1185+ END_STATE();
1186+ case 90:
1187+ ACCEPT_TOKEN(sym_commit);
1188+ if (('0' <= lookahead && lookahead <= '9') ||
1189+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(89);
1190+ END_STATE();
1191+ case 91:
1192+ ACCEPT_TOKEN(sym_commit);
1193+ if (('0' <= lookahead && lookahead <= '9') ||
1194+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(90);
1195+ END_STATE();
1196+ case 92:
1197+ ACCEPT_TOKEN(sym_commit);
1198+ if (('0' <= lookahead && lookahead <= '9') ||
1199+ ('a' <= lookahead && lookahead <= 'f')) ADVANCE(91);
1200+ END_STATE();
1201+ case 93:
1202+ ACCEPT_TOKEN(sym_mode);
1203+ if (('0' <= lookahead && lookahead <= '9')) ADVANCE(93);
1204 END_STATE();
1205 default:
1206 return false;
1207 @@ -89,42 +692,263 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
1208
1209 static const TSLexMode ts_lex_modes[STATE_COUNT] = {
1210 [0] = {.lex_state = 0},
1211- [1] = {.lex_state = 0},
1212- [2] = {.lex_state = 0},
1213- [3] = {.lex_state = 0},
1214+ [1] = {.lex_state = 30},
1215+ [2] = {.lex_state = 30},
1216+ [3] = {.lex_state = 30},
1217+ [4] = {.lex_state = 30},
1218+ [5] = {.lex_state = 2},
1219+ [6] = {.lex_state = 2},
1220+ [7] = {.lex_state = 2},
1221+ [8] = {.lex_state = 2},
1222+ [9] = {.lex_state = 0},
1223+ [10] = {.lex_state = 0},
1224+ [11] = {.lex_state = 0},
1225+ [12] = {.lex_state = 0},
1226+ [13] = {.lex_state = 0},
1227+ [14] = {.lex_state = 0},
1228+ [15] = {.lex_state = 4},
1229+ [16] = {.lex_state = 4},
1230+ [17] = {.lex_state = 0},
1231+ [18] = {.lex_state = 4},
1232+ [19] = {.lex_state = 0},
1233+ [20] = {.lex_state = 0},
1234+ [21] = {.lex_state = 0},
1235+ [22] = {.lex_state = 4},
1236+ [23] = {.lex_state = 4},
1237+ [24] = {.lex_state = 2},
1238+ [25] = {.lex_state = 0},
1239+ [26] = {.lex_state = 0},
1240 };
1241
1242 static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = {
1243 [0] = {
1244 [ts_builtin_sym_end] = ACTIONS(1),
1245- [anon_sym_hello] = ACTIONS(1),
1246+ [aux_sym_source_token1] = ACTIONS(1),
1247+ [anon_sym_diff] = ACTIONS(1),
1248+ [anon_sym_index] = ACTIONS(1),
1249+ [anon_sym_DOT_DOT] = ACTIONS(1),
1250+ [aux_sym_file_token1] = ACTIONS(1),
1251+ [anon_sym_AT_AT] = ACTIONS(1),
1252+ [anon_sym_AT_AT2] = ACTIONS(1),
1253+ [anon_sym_PLUS] = ACTIONS(1),
1254+ [anon_sym_DASH] = ACTIONS(1),
1255+ [sym_commit] = ACTIONS(1),
1256 },
1257 [1] = {
1258- [sym_source] = STATE(3),
1259- [anon_sym_hello] = ACTIONS(3),
1260+ [sym_source] = STATE(10),
1261+ [sym__line] = STATE(11),
1262+ [sym_command] = STATE(11),
1263+ [sym_index] = STATE(11),
1264+ [sym_file] = STATE(11),
1265+ [sym_location] = STATE(11),
1266+ [sym_addition] = STATE(11),
1267+ [sym_deletion] = STATE(11),
1268+ [aux_sym_source_repeat1] = STATE(2),
1269+ [ts_builtin_sym_end] = ACTIONS(3),
1270+ [anon_sym_diff] = ACTIONS(5),
1271+ [anon_sym_index] = ACTIONS(7),
1272+ [aux_sym_file_token1] = ACTIONS(9),
1273+ [anon_sym_AT_AT] = ACTIONS(11),
1274+ [anon_sym_PLUS] = ACTIONS(13),
1275+ [anon_sym_DASH] = ACTIONS(15),
1276+ [sym_context] = ACTIONS(17),
1277+ },
1278+ [2] = {
1279+ [sym__line] = STATE(11),
1280+ [sym_command] = STATE(11),
1281+ [sym_index] = STATE(11),
1282+ [sym_file] = STATE(11),
1283+ [sym_location] = STATE(11),
1284+ [sym_addition] = STATE(11),
1285+ [sym_deletion] = STATE(11),
1286+ [aux_sym_source_repeat1] = STATE(3),
1287+ [ts_builtin_sym_end] = ACTIONS(19),
1288+ [anon_sym_diff] = ACTIONS(5),
1289+ [anon_sym_index] = ACTIONS(7),
1290+ [aux_sym_file_token1] = ACTIONS(9),
1291+ [anon_sym_AT_AT] = ACTIONS(11),
1292+ [anon_sym_PLUS] = ACTIONS(13),
1293+ [anon_sym_DASH] = ACTIONS(15),
1294+ [sym_context] = ACTIONS(17),
1295+ },
1296+ [3] = {
1297+ [sym__line] = STATE(11),
1298+ [sym_command] = STATE(11),
1299+ [sym_index] = STATE(11),
1300+ [sym_file] = STATE(11),
1301+ [sym_location] = STATE(11),
1302+ [sym_addition] = STATE(11),
1303+ [sym_deletion] = STATE(11),
1304+ [aux_sym_source_repeat1] = STATE(3),
1305+ [ts_builtin_sym_end] = ACTIONS(21),
1306+ [anon_sym_diff] = ACTIONS(23),
1307+ [anon_sym_index] = ACTIONS(26),
1308+ [aux_sym_file_token1] = ACTIONS(29),
1309+ [anon_sym_AT_AT] = ACTIONS(32),
1310+ [anon_sym_PLUS] = ACTIONS(35),
1311+ [anon_sym_DASH] = ACTIONS(38),
1312+ [sym_context] = ACTIONS(41),
1313 },
1314 };
1315
1316 static const uint16_t ts_small_parse_table[] = {
1317- [0] = 1,
1318- ACTIONS(5), 1,
1319+ [0] = 2,
1320+ ACTIONS(44), 3,
1321+ anon_sym_PLUS,
1322+ anon_sym_DASH,
1323+ sym_context,
1324+ ACTIONS(21), 5,
1325 ts_builtin_sym_end,
1326- [4] = 1,
1327- ACTIONS(7), 1,
1328+ anon_sym_diff,
1329+ anon_sym_index,
1330+ aux_sym_file_token1,
1331+ anon_sym_AT_AT,
1332+ [13] = 2,
1333+ ACTIONS(46), 1,
1334+ aux_sym_source_token1,
1335+ ACTIONS(48), 1,
1336+ aux_sym_location_token1,
1337+ [20] = 2,
1338+ ACTIONS(50), 1,
1339+ aux_sym_location_token1,
1340+ STATE(20), 1,
1341+ sym_filename,
1342+ [27] = 2,
1343+ ACTIONS(50), 1,
1344+ aux_sym_location_token1,
1345+ STATE(14), 1,
1346+ sym_filename,
1347+ [34] = 2,
1348+ ACTIONS(52), 1,
1349+ aux_sym_source_token1,
1350+ ACTIONS(54), 1,
1351+ aux_sym_location_token1,
1352+ [41] = 1,
1353+ ACTIONS(56), 1,
1354+ aux_sym_source_token1,
1355+ [45] = 1,
1356+ ACTIONS(58), 1,
1357 ts_builtin_sym_end,
1358+ [49] = 1,
1359+ ACTIONS(60), 1,
1360+ aux_sym_source_token1,
1361+ [53] = 1,
1362+ ACTIONS(62), 1,
1363+ anon_sym_DOT_DOT,
1364+ [57] = 1,
1365+ ACTIONS(64), 1,
1366+ aux_sym_source_token1,
1367+ [61] = 1,
1368+ ACTIONS(66), 1,
1369+ aux_sym_source_token1,
1370+ [65] = 1,
1371+ ACTIONS(68), 1,
1372+ sym_linerange,
1373+ [69] = 1,
1374+ ACTIONS(70), 1,
1375+ sym_linerange,
1376+ [73] = 1,
1377+ ACTIONS(72), 1,
1378+ aux_sym_source_token1,
1379+ [77] = 1,
1380+ ACTIONS(74), 1,
1381+ anon_sym_DASH_DASHgit,
1382+ [81] = 1,
1383+ ACTIONS(76), 1,
1384+ sym_commit,
1385+ [85] = 1,
1386+ ACTIONS(78), 1,
1387+ aux_sym_source_token1,
1388+ [89] = 1,
1389+ ACTIONS(80), 1,
1390+ sym_commit,
1391+ [93] = 1,
1392+ ACTIONS(82), 1,
1393+ anon_sym_AT_AT2,
1394+ [97] = 1,
1395+ ACTIONS(84), 1,
1396+ sym_mode,
1397+ [101] = 1,
1398+ ACTIONS(86), 1,
1399+ aux_sym_location_token1,
1400+ [105] = 1,
1401+ ACTIONS(88), 1,
1402+ aux_sym_source_token1,
1403+ [109] = 1,
1404+ ACTIONS(90), 1,
1405+ aux_sym_source_token1,
1406 };
1407
1408 static const uint32_t ts_small_parse_table_map[] = {
1409- [SMALL_STATE(2)] = 0,
1410- [SMALL_STATE(3)] = 4,
1411+ [SMALL_STATE(4)] = 0,
1412+ [SMALL_STATE(5)] = 13,
1413+ [SMALL_STATE(6)] = 20,
1414+ [SMALL_STATE(7)] = 27,
1415+ [SMALL_STATE(8)] = 34,
1416+ [SMALL_STATE(9)] = 41,
1417+ [SMALL_STATE(10)] = 45,
1418+ [SMALL_STATE(11)] = 49,
1419+ [SMALL_STATE(12)] = 53,
1420+ [SMALL_STATE(13)] = 57,
1421+ [SMALL_STATE(14)] = 61,
1422+ [SMALL_STATE(15)] = 65,
1423+ [SMALL_STATE(16)] = 69,
1424+ [SMALL_STATE(17)] = 73,
1425+ [SMALL_STATE(18)] = 77,
1426+ [SMALL_STATE(19)] = 81,
1427+ [SMALL_STATE(20)] = 85,
1428+ [SMALL_STATE(21)] = 89,
1429+ [SMALL_STATE(22)] = 93,
1430+ [SMALL_STATE(23)] = 97,
1431+ [SMALL_STATE(24)] = 101,
1432+ [SMALL_STATE(25)] = 105,
1433+ [SMALL_STATE(26)] = 109,
1434 };
1435
1436 static const TSParseActionEntry ts_parse_actions[] = {
1437 [0] = {.entry = {.count = 0, .reusable = false}},
1438 [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(),
1439- [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2),
1440- [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source, 1),
1441- [7] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(),
1442+ [3] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source, 0),
1443+ [5] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18),
1444+ [7] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19),
1445+ [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7),
1446+ [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(16),
1447+ [13] = {.entry = {.count = 1, .reusable = false}}, SHIFT(5),
1448+ [15] = {.entry = {.count = 1, .reusable = false}}, SHIFT(8),
1449+ [17] = {.entry = {.count = 1, .reusable = false}}, SHIFT(11),
1450+ [19] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source, 1),
1451+ [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_source_repeat1, 2),
1452+ [23] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(18),
1453+ [26] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(19),
1454+ [29] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(7),
1455+ [32] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(16),
1456+ [35] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(5),
1457+ [38] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(8),
1458+ [41] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_source_repeat1, 2), SHIFT_REPEAT(11),
1459+ [44] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_source_repeat1, 2),
1460+ [46] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_addition, 1),
1461+ [48] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9),
1462+ [50] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13),
1463+ [52] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_deletion, 1),
1464+ [54] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17),
1465+ [56] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_addition, 2),
1466+ [58] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(),
1467+ [60] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4),
1468+ [62] = {.entry = {.count = 1, .reusable = true}}, SHIFT(21),
1469+ [64] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_filename, 1),
1470+ [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_file, 2),
1471+ [68] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22),
1472+ [70] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15),
1473+ [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_deletion, 2),
1474+ [74] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6),
1475+ [76] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12),
1476+ [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_command, 3),
1477+ [80] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23),
1478+ [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24),
1479+ [84] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25),
1480+ [86] = {.entry = {.count = 1, .reusable = true}}, SHIFT(26),
1481+ [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_index, 5),
1482+ [90] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_location, 5),
1483 };
1484
1485 #ifdef __cplusplus
1486 diff --git a/test/corpus/text.txt b/test/corpus/text.txt
1487index e69de29..1f85731 100644
1488--- a/test/corpus/text.txt
1489+++ b/test/corpus/text.txt
1490 @@ -0,0 +1,43 @@
1491+ ================================================================================
1492+ Single-file small change
1493+ ================================================================================
1494+ diff --git a/grammar.js b/grammar.js
1495+ index dc36969..f37fde0 100644
1496+ --- a/grammar.js
1497+ +++ b/grammar.js
1498+ @@ -6,6 +6,8 @@ module.exports = grammar({
1499+ extras: ($) => [],
1500+
1501+ rules: {
1502+ - source: ($) => "hello",
1503+ + source: ($) => repeat($._line),
1504+ +
1505+ + _line: ($) => choice(),
1506+ },
1507+ });
1508+
1509+ --------------------------------------------------------------------------------
1510+
1511+ (source
1512+ (command
1513+ (filename))
1514+ (index
1515+ (commit)
1516+ (commit)
1517+ (mode))
1518+ (file
1519+ (filename))
1520+ (file
1521+ (filename))
1522+ (location
1523+ (linerange)
1524+ (linerange))
1525+ (context)
1526+ (context)
1527+ (context)
1528+ (deletion)
1529+ (addition)
1530+ (addition)
1531+ (addition)
1532+ (context)
1533+ (context))
1534 diff --git a/tree-sitter-gitdiff.wasm b/tree-sitter-gitdiff.wasm
1535new file mode 100755
1536index 0000000..0e9e828
1537 Binary files /dev/null and b/tree-sitter-gitdiff.wasm differ