about summary refs log tree commit diff stats
path: root/tree-sitter-yts/grammar.js
diff options
context:
space:
mode:
Diffstat (limited to 'tree-sitter-yts/grammar.js')
-rw-r--r--tree-sitter-yts/grammar.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/tree-sitter-yts/grammar.js b/tree-sitter-yts/grammar.js
new file mode 100644
index 0000000..8a9d61f
--- /dev/null
+++ b/tree-sitter-yts/grammar.js
@@ -0,0 +1,42 @@
+module.exports = grammar({
+  name: "yts",
+
+  rules: {
+    source_file: ($) => repeat(choice($.line, $.comment)),
+    line: ($) =>
+      seq($.command, repeat($.flag), $.id, $.title, $.date, $.author, $.duration, $.url, "\n"),
+
+    command: ($) => choice("pick", "p", "watch", "w", "drop", "d", "url", "u"),
+    flag: ($) =>
+      choice(
+              /-\w [^\s]+/,
+              /-\w '[^']*'/,
+              /-\w "[^"]*"/,
+              /-\w=[^\s]+/,
+              /-\w='[^']*'/,
+              /-\w="[^"]*"/,
+
+              /--\w[\w-]+ [^\s]+/,
+              /--\w[\w-]+ '[^']*'/,
+              /--\w[\w-]+ "[^"]*"/,
+              /--\w[\w-]+=[^\s]+/,
+              /--\w[\w-]+='[^']*'/,
+              /--\w[\w-]+="[^"]*"/,
+              ),
+    id: ($) => /[a-z0-9]+/,
+    title: ($) => seq($._q, /[^"]+/, $._q),
+    date: ($) => seq($._q, /\d{4}-\d{2}-\d{2}/, $._q),
+    author: ($) => seq($._q, /[^"]+/, $._q),
+    duration: ($) =>
+      seq(
+        $._q,
+        seq(choice("[No Duration]", /\d+m \d+s/, /\d+h \d+m/)),
+        $._q,
+      ),
+    url: ($) => seq($._q, /[^"]+/, $._q),
+    comment: ($) => /#.*/,
+    _q: ($) => $.quote,
+    quote: ($) => /"/,
+  },
+  extras: ($) => [/\s/],
+});