diff --git a/src/languages/prism-prql.ts b/src/languages/prism-prql.ts new file mode 100644 index 000000000..48a7ce784 --- /dev/null +++ b/src/languages/prism-prql.ts @@ -0,0 +1,51 @@ +import { rest } from '../shared/symbols'; +import type { LanguageProto } from '../types'; + +export default { + id: 'prql', + grammar: { + 'doc-comment': { + pattern: /(^|[^\\])#!.*/, + lookbehind: true, + greedy: true + }, + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + greedy: true + }, + 'string-interpolation': { + pattern: /(?:[frs])(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=\}$)/, + lookbehind: true + }, + [rest]: 'prql' + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[frs]?("""|''')[\s\S]*?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[frs])?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'keyword': /\b(?:_(?=\s*:)aggregate|derive|filter|from|group|join|select|sort|take|window|let|into|case|prql|type|module|internal)\b/, + 'builtin': /\b(?:min|max|sum|average|stddev|every|any|concat_array|count|lag|lead|first|last|rank|rank_dense|row_number|round|as|in|tuple_every|tuple_map|tuple_zip|_eq|_is_null|from_text|lower|upper|read_parquet|read_csv)\b/, + 'boolean': /\b(?:false|null|true)\b/, + 'number': /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i, + 'operator': /[-+%=]=?|!=|~=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\](),.:]/ + } +} as LanguageProto<'prql'>; diff --git a/tests/languages/prql/boolean_feature.test b/tests/languages/prql/boolean_feature.test new file mode 100644 index 000000000..c75f89470 --- /dev/null +++ b/tests/languages/prql/boolean_feature.test @@ -0,0 +1,15 @@ +true +false +null + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"], + ["boolean", "null"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/tests/languages/prql/builtin_feature.test b/tests/languages/prql/builtin_feature.test new file mode 100644 index 000000000..3fee7c11c --- /dev/null +++ b/tests/languages/prql/builtin_feature.test @@ -0,0 +1,15 @@ +min max sum +average stddev +every any + +---------------------------------------------------- + +[ + ["builtin", "min"], ["builtin", "max"], ["builtin", "sum"], + ["builtin", "average"], ["builtin", "stddev"], + ["builtin", "every"], ["builtin", "any"] +] + +---------------------------------------------------- + +Checks for builtins. \ No newline at end of file diff --git a/tests/languages/prql/comment_feature.test b/tests/languages/prql/comment_feature.test new file mode 100644 index 000000000..054d6023d --- /dev/null +++ b/tests/languages/prql/comment_feature.test @@ -0,0 +1,13 @@ +# +# foobar + +---------------------------------------------------- + +[ + ["comment", "#"], + ["comment", "# foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/tests/languages/prql/keyword_feature.test b/tests/languages/prql/keyword_feature.test new file mode 100644 index 000000000..bbcb2925d --- /dev/null +++ b/tests/languages/prql/keyword_feature.test @@ -0,0 +1,15 @@ +aggregate derive filter +from group join +select sort take + +---------------------------------------------------- + +[ + ["keyword", "aggregate"], ["keyword", "derive"], ["keyword", "filter"] + ["keyword", "from"], ["keyword", "group"], ["keyword", "join"], + ["keyword", "select"], ["keyword", "sort"], ["keyword", "take"] +] + +---------------------------------------------------- + +Checks for keywords. diff --git a/website/examples/prism-prql.html b/website/examples/prism-prql.html new file mode 100644 index 000000000..e8a4d66c5 --- /dev/null +++ b/website/examples/prism-prql.html @@ -0,0 +1,45 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+""" "Multi-line" strings
+are supported."""
+''' 'Multi-line' strings
+are supported.'''
+ +

Numbers

+
7
+2147483647
+3
+79228162514264337593543950336
+3.14
+1e100
+3.14e-10
+0e0
+
+ +

Full example

+
from invoices
+filter invoice_date >= @1970-01-16
+derive {
+  transaction_fees = 0.8,
+  income = total - transaction_fees
+}
+filter income > 1
+group customer_id (
+  aggregate {
+    average total,
+    sum_income = sum income,
+    ct = count total,
+  }
+)
+sort {-sum_income}
+take 10
+join c=customers (==customer_id)
+derive name = f"{c.last_name}, {c.first_name}"
+select {
+  c.customer_id, name, sum_income
+}
+derive db_version = s"version()"