summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/pygments/lexers/prql.py
diff options
context:
space:
mode:
Diffstat (limited to 'venv/lib/python3.11/site-packages/pygments/lexers/prql.py')
-rw-r--r--venv/lib/python3.11/site-packages/pygments/lexers/prql.py252
1 files changed, 252 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/pygments/lexers/prql.py b/venv/lib/python3.11/site-packages/pygments/lexers/prql.py
new file mode 100644
index 0000000..4c2f12e
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/pygments/lexers/prql.py
@@ -0,0 +1,252 @@
+"""
+ pygments.lexers.prql
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Lexer for the PRQL query language.
+
+ :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, combined, words, include, bygroups
+from pygments.token import Comment, Literal, Keyword, Name, Number, Operator, \
+ Punctuation, String, Text, Whitespace
+
+__all__ = ['PrqlLexer']
+
+
+class PrqlLexer(RegexLexer):
+ """
+ For PRQL source code.
+
+ .. versionadded:: 2.17
+
+ grammar: https://github.com/PRQL/prql/tree/main/grammars
+ """
+
+ name = 'PRQL'
+ url = 'https://prql-lang.org/'
+ aliases = ['prql']
+ filenames = ['*.prql']
+ mimetypes = ['application/prql', 'application/x-prql']
+
+ builtinTypes = words((
+ "bool",
+ "int",
+ "int8", "int16", "int32", "int64", "int128",
+ "float",
+ "text",
+ "set"), suffix=r'\b')
+
+ def innerstring_rules(ttype):
+ return [
+ # the new style '{}'.format(...) string formatting
+ (r'\{'
+ r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?' # field name
+ r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?'
+ r'\}', String.Interpol),
+
+ (r'[^\\\'"%{\n]+', ttype),
+ (r'[\'"\\]', ttype),
+ (r'%|(\{{1,2})', ttype)
+ ]
+
+ def fstring_rules(ttype):
+ return [
+ (r'\}', String.Interpol),
+ (r'\{', String.Interpol, 'expr-inside-fstring'),
+ (r'[^\\\'"{}\n]+', ttype),
+ (r'[\'"\\]', ttype),
+ ]
+
+ tokens = {
+ 'root': [
+
+ # Comments
+ (r'#!.*', String.Doc),
+ (r'#.*', Comment.Single),
+
+ # Whitespace
+ (r'\s+', Whitespace),
+
+ # Modules
+ (r'^(\s*)(module)(\s*)',
+ bygroups(Whitespace, Keyword.Namespace, Whitespace),
+ 'imports'),
+
+ (builtinTypes, Keyword.Type),
+
+ # Main
+ (r'^prql ', Keyword.Reserved),
+
+ ('let', Keyword.Declaration),
+
+ include('keywords'),
+ include('expr'),
+
+ # Transforms
+ (r'^[A-Za-z_][a-zA-Z0-9_]*', Keyword),
+ ],
+ 'expr': [
+ # non-raw f-strings
+ ('(f)(""")', bygroups(String.Affix, String.Double),
+ combined('fstringescape', 'tdqf')),
+ ("(f)(''')", bygroups(String.Affix, String.Single),
+ combined('fstringescape', 'tsqf')),
+ ('(f)(")', bygroups(String.Affix, String.Double),
+ combined('fstringescape', 'dqf')),
+ ("(f)(')", bygroups(String.Affix, String.Single),
+ combined('fstringescape', 'sqf')),
+
+ # non-raw s-strings
+ ('(s)(""")', bygroups(String.Affix, String.Double),
+ combined('stringescape', 'tdqf')),
+ ("(s)(''')", bygroups(String.Affix, String.Single),
+ combined('stringescape', 'tsqf')),
+ ('(s)(")', bygroups(String.Affix, String.Double),
+ combined('stringescape', 'dqf')),
+ ("(s)(')", bygroups(String.Affix, String.Single),
+ combined('stringescape', 'sqf')),
+
+ # raw strings
+ ('(?i)(r)(""")',
+ bygroups(String.Affix, String.Double), 'tdqs'),
+ ("(?i)(r)(''')",
+ bygroups(String.Affix, String.Single), 'tsqs'),
+ ('(?i)(r)(")',
+ bygroups(String.Affix, String.Double), 'dqs'),
+ ("(?i)(r)(')",
+ bygroups(String.Affix, String.Single), 'sqs'),
+
+ # non-raw strings
+ ('"""', String.Double, combined('stringescape', 'tdqs')),
+ ("'''", String.Single, combined('stringescape', 'tsqs')),
+ ('"', String.Double, combined('stringescape', 'dqs')),
+ ("'", String.Single, combined('stringescape', 'sqs')),
+
+ # Time and dates
+ (r'@\d{4}-\d{2}-\d{2}T\d{2}(:\d{2})?(:\d{2})?(\.\d{1,6})?(Z|[+-]\d{1,2}(:\d{1,2})?)?', Literal.Date),
+ (r'@\d{4}-\d{2}-\d{2}', Literal.Date),
+ (r'@\d{2}(:\d{2})?(:\d{2})?(\.\d{1,6})?(Z|[+-]\d{1,2}(:\d{1,2})?)?', Literal.Date),
+
+ (r'[^\S\n]+', Text),
+ include('numbers'),
+ (r'->|=>|==|!=|>=|<=|~=|&&|\|\||\?\?|\/\/', Operator),
+ (r'[-~+/*%=<>&^|.@]', Operator),
+ (r'[]{}:(),;[]', Punctuation),
+ include('functions'),
+
+ # Variable Names
+ (r'[A-Za-z_][a-zA-Z0-9_]*', Name.Variable),
+ ],
+ 'numbers': [
+ (r'(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)'
+ r'([eE][+-]?\d(?:_?\d)*)?', Number.Float),
+ (r'\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?', Number.Float),
+ (r'0[oO](?:_?[0-7])+', Number.Oct),
+ (r'0[bB](?:_?[01])+', Number.Bin),
+ (r'0[xX](?:_?[a-fA-F0-9])+', Number.Hex),
+ (r'\d(?:_?\d)*', Number.Integer),
+ ],
+ 'fstringescape': [
+ include('stringescape'),
+ ],
+ 'bytesescape': [
+ (r'\\([\\bfnrt"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+ ],
+ 'stringescape': [
+ (r'\\(N\{.*?\}|u\{[a-fA-F0-9]{1,6}\})', String.Escape),
+ include('bytesescape')
+ ],
+ 'fstrings-single': fstring_rules(String.Single),
+ 'fstrings-double': fstring_rules(String.Double),
+ 'strings-single': innerstring_rules(String.Single),
+ 'strings-double': innerstring_rules(String.Double),
+ 'dqf': [
+ (r'"', String.Double, '#pop'),
+ (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings
+ include('fstrings-double')
+ ],
+ 'sqf': [
+ (r"'", String.Single, '#pop'),
+ (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings
+ include('fstrings-single')
+ ],
+ 'dqs': [
+ (r'"', String.Double, '#pop'),
+ (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings
+ include('strings-double')
+ ],
+ 'sqs': [
+ (r"'", String.Single, '#pop'),
+ (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings
+ include('strings-single')
+ ],
+ 'tdqf': [
+ (r'"""', String.Double, '#pop'),
+ include('fstrings-double'),
+ (r'\n', String.Double)
+ ],
+ 'tsqf': [
+ (r"'''", String.Single, '#pop'),
+ include('fstrings-single'),
+ (r'\n', String.Single)
+ ],
+ 'tdqs': [
+ (r'"""', String.Double, '#pop'),
+ include('strings-double'),
+ (r'\n', String.Double)
+ ],
+ 'tsqs': [
+ (r"'''", String.Single, '#pop'),
+ include('strings-single'),
+ (r'\n', String.Single)
+ ],
+
+ 'expr-inside-fstring': [
+ (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+ # without format specifier
+ (r'(=\s*)?' # debug (https://bugs.python.org/issue36817)
+ r'\}', String.Interpol, '#pop'),
+ # with format specifier
+ # we'll catch the remaining '}' in the outer scope
+ (r'(=\s*)?' # debug (https://bugs.python.org/issue36817)
+ r':', String.Interpol, '#pop'),
+ (r'\s+', Whitespace), # allow new lines
+ include('expr'),
+ ],
+ 'expr-inside-fstring-inner': [
+ (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+ (r'[])}]', Punctuation, '#pop'),
+ (r'\s+', Whitespace), # allow new lines
+ include('expr'),
+ ],
+ 'keywords': [
+ (words((
+ 'into', 'case', 'type', 'module', 'internal',
+ ), suffix=r'\b'),
+ Keyword),
+ (words(('true', 'false', 'null'), suffix=r'\b'), Keyword.Constant),
+ ],
+ 'functions': [
+ (words((
+ "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"),
+ suffix=r'\b'),
+ Name.Function),
+ ],
+
+ 'comment': [
+ (r'-(?!\})', Comment.Multiline),
+ (r'\{-', Comment.Multiline, 'comment'),
+ (r'[^-}]', Comment.Multiline),
+ (r'-\}', Comment.Multiline, '#pop'),
+ ],
+
+ 'imports': [
+ (r'\w+(\.\w+)*', Name.Class, '#pop'),
+ ],
+ }