diff --git a/.gitignore b/.gitignore index 05bb2024..51105a24 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,3 @@ dist-ssr package/readme.md package/LICENSE -package/src/grammars diff --git a/package/index.html b/package/index.html index a58f6a58..af9b33fd 100644 --- a/package/index.html +++ b/package/index.html @@ -76,7 +76,7 @@
Thank you very much!
+The message were send successfully
'; + + // Sessionvariablen löschen + unset($_SESSION['company']); + unset($_SESSION['name']); + unset($_SESSION['address']); + unset($_SESSION['zip_code']); + unset($_SESSION['city']); + unset($_SESSION['county']); + unset($_SESSION['country']); + unset($_SESSION['phone']); + unset($_SESSION['fax']); + unset($_SESSION['email']); + unset($_SESSION['nachricht']); + } + + } else { + echo 'Error
'; + echo 'Please fill in all the $fehler field. back
'; + } + echo 'Thank you very much!
\n\t\t\t\tThe message were send successfully
';\n\n\t\t\t// Sessionvariablen löschen\n\t\t\tunset($_SESSION['company']);\n\t\t\tunset($_SESSION['name']);\n\t\t\tunset($_SESSION['address']);\n\t\t\tunset($_SESSION['zip_code']);\n\t\t\tunset($_SESSION['city']);\n\t\t\tunset($_SESSION['county']);\n\t\t\tunset($_SESSION['country']);\n\t\t\tunset($_SESSION['phone']);\n\t\t\tunset($_SESSION['fax']);\n\t\t\tunset($_SESSION['email']);\n\t\t\tunset($_SESSION['nachricht']);\n\t\t\t}\n\n\t} else {\n\techo 'Error
';\n\techo 'Please fill in all the $fehler field. back
';\n\t}\n\techo '")
+
+a.button
+.content
+
+a#main-link
+#content
+
+div#test-id.test-class1.test-class2
+.test-class1#test-id.test-class2
+
+a: span
+
+----------------------------------------------------
+
+[
+ ["tag", ["div"]],
+ ["tag", [
+ "span",
+ ["attributes", [
+ ["operator", "&"],
+ ["function", ["attributes"]],
+ ["punctuation", "("],
+ ["punctuation", "{"],
+ ["string-property", "'data-foo'"],
+ ["operator", ":"],
+ ["string", "'bar'"],
+ ["punctuation", "}"],
+ ["punctuation", ")"]
+ ]]
+ ]],
+
+ ["tag", [
+ "input",
+ ["attributes", [
+ ["punctuation", "("],
+ ["attr-name", "data-bar"],
+ ["punctuation", "="],
+ ["attr-value", [
+ ["string", "\"foo\""]
+ ]],
+ ["punctuation", ","],
+ ["attr-name", "type"],
+ ["punctuation", "="],
+ ["attr-value", [
+ ["string", "'checkbox'"]
+ ]],
+ ["punctuation", ","],
+ ["attr-name", "checked"],
+ ["punctuation", ")"]
+ ]]
+ ]],
+
+ ["tag", [
+ "a",
+ ["attributes", [
+ ["punctuation", "("],
+ ["attr-name", "style"],
+ ["punctuation", "="],
+ ["attr-value", [
+ ["punctuation", "{"],
+ ["literal-property", "color"],
+ ["operator", ":"],
+ ["string", "'red'"],
+ ["punctuation", ","],
+ ["literal-property", "background"],
+ ["operator", ":"],
+ ["string", "'green'"],
+ ["punctuation", "}"]
+ ]],
+ ["punctuation", ")"]
+ ]]
+ ]],
+
+ ["tag", [
+ "div",
+ ["attributes", [
+ ["punctuation", "("],
+ ["attr-name", "unescaped"],
+ ["punctuation", "!="],
+ ["attr-value", [
+ ["string", "\"\""]
+ ]],
+ ["punctuation", ")"]
+ ]]
+ ]],
+
+ ["tag", [
+ "a",
+ ["attr-class", ".button"]
+ ]],
+ ["tag", [
+ ["attr-class", ".content"]
+ ]],
+
+ ["tag", [
+ "a",
+ ["attr-id", "#main-link"]
+ ]],
+ ["tag", [
+ ["attr-id", "#content"]
+ ]],
+
+ ["tag", [
+ "div",
+ ["attr-id", "#test-id"],
+ ["attr-class", ".test-class1"],
+ ["attr-class", ".test-class2"]
+ ]],
+ ["tag", [
+ ["attr-class", ".test-class1"],
+ ["attr-id", "#test-id"],
+ ["attr-class", ".test-class2"]
+ ]],
+
+ ["tag", [
+ "a",
+ ["punctuation", ":"]
+ ]],
+ ["tag", ["span"]]
+]
+
+----------------------------------------------------
+
+Checks for tags and attributes.
diff --git a/package/src/prism/tests/languages/puppet/attr-name_feature.test b/package/src/prism/tests/languages/puppet/attr-name_feature.test
new file mode 100644
index 00000000..566a6f5c
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/attr-name_feature.test
@@ -0,0 +1,19 @@
+foo {
+ bar => bar,
+ * => {}
+}
+
+----------------------------------------------------
+
+[
+ "foo ", ["punctuation", "{"],
+ ["attr-name", "bar"], ["operator", "=>"],
+ " bar", ["punctuation", ","],
+ ["attr-name", "*"], ["operator", "=>"],
+ ["punctuation", "{"], ["punctuation", "}"],
+ ["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for attributes.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/boolean_feature.test b/package/src/prism/tests/languages/puppet/boolean_feature.test
new file mode 100644
index 00000000..a40f8d95
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/boolean_feature.test
@@ -0,0 +1,13 @@
+true
+false
+
+----------------------------------------------------
+
+[
+ ["boolean", "true"],
+ ["boolean", "false"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/comment_feature.test b/package/src/prism/tests/languages/puppet/comment_feature.test
new file mode 100644
index 00000000..163abecf
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/comment_feature.test
@@ -0,0 +1,22 @@
+#
+# Foobar
+/* Foo
+bar */
+/* @(foo) */
+# @(foo)
+# foo /* bar */ baz
+
+----------------------------------------------------
+
+[
+ ["comment", "#"],
+ ["comment", "# Foobar"],
+ ["multiline-comment", "/* Foo\nbar */"],
+ ["multiline-comment", "/* @(foo) */"],
+ ["comment", "# @(foo)"],
+ ["comment", "# foo /* bar */ baz"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/datatype_feature.test b/package/src/prism/tests/languages/puppet/datatype_feature.test
new file mode 100644
index 00000000..ca504991
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/datatype_feature.test
@@ -0,0 +1,63 @@
+Any
+Array
+Boolean
+Callable
+Catalogentry
+Class
+Collection
+Data
+Default
+Enum
+Float
+Hash
+Integer
+NotUndef
+Numeric
+Optional
+Pattern
+Regexp
+Resource
+Runtime
+Scalar
+String
+Struct
+Tuple
+Type
+Undef
+Variant
+
+----------------------------------------------------
+
+[
+ ["datatype", "Any"],
+ ["datatype", "Array"],
+ ["datatype", "Boolean"],
+ ["datatype", "Callable"],
+ ["datatype", "Catalogentry"],
+ ["datatype", "Class"],
+ ["datatype", "Collection"],
+ ["datatype", "Data"],
+ ["datatype", "Default"],
+ ["datatype", "Enum"],
+ ["datatype", "Float"],
+ ["datatype", "Hash"],
+ ["datatype", "Integer"],
+ ["datatype", "NotUndef"],
+ ["datatype", "Numeric"],
+ ["datatype", "Optional"],
+ ["datatype", "Pattern"],
+ ["datatype", "Regexp"],
+ ["datatype", "Resource"],
+ ["datatype", "Runtime"],
+ ["datatype", "Scalar"],
+ ["datatype", "String"],
+ ["datatype", "Struct"],
+ ["datatype", "Tuple"],
+ ["datatype", "Type"],
+ ["datatype", "Undef"],
+ ["datatype", "Variant"]
+]
+
+----------------------------------------------------
+
+Checks for data types.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/function_feature.test b/package/src/prism/tests/languages/puppet/function_feature.test
new file mode 100644
index 00000000..561e2c50
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/function_feature.test
@@ -0,0 +1,37 @@
+$foo.foobar
+foo_bar_42()
+
+contain
+debug
+err
+fail
+include
+info
+notice
+realize
+require
+tag
+warning
+
+----------------------------------------------------
+
+[
+ ["variable", ["$foo"]], ["punctuation", "."], ["function", "foobar"],
+ ["function", "foo_bar_42"], ["punctuation", "("], ["punctuation", ")"],
+
+ ["function", "contain"],
+ ["function", "debug"],
+ ["function", "err"],
+ ["function", "fail"],
+ ["function", "include"],
+ ["function", "info"],
+ ["function", "notice"],
+ ["function", "realize"],
+ ["function", "require"],
+ ["function", "tag"],
+ ["function", "warning"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/heredoc_feature.test b/package/src/prism/tests/languages/puppet/heredoc_feature.test
new file mode 100644
index 00000000..0ab697f5
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/heredoc_feature.test
@@ -0,0 +1,51 @@
+@("FOO")
+ bar
+ $baz
+FOO
+
+@(FOO BAR/)
+ bar
+ $baz
+ | FOO BAR
+
+@(foo!)
+bar
+|-foo!
+
+@("some text..."/nrts$uL)
+some text
+some text..
+some text...
+
+$foo = @(FOOBAR) == $bar
+ Foobar
+ -FOOBAR
+
+----------------------------------------------------
+
+[
+ ["heredoc", ["@(", ["punctuation", "\"FOO\""], ")"]],
+ ["heredoc", [
+ "\tbar\n\t",
+ ["interpolation", ["$baz"]],
+ ["punctuation", "FOO"]
+ ]],
+ ["heredoc", ["@(", ["punctuation", "FOO BAR/"], ")"]],
+ ["heredoc", [
+ "\tbar\n\t$baz\n\t",
+ ["punctuation", "| FOO BAR"]
+ ]],
+ ["heredoc", ["@(", ["punctuation", "foo!"], ")"]],
+ ["heredoc", ["bar\n", ["punctuation", "|-foo!"]]],
+ ["heredoc", ["@(", ["punctuation", "\"some text...\"/nrts$uL"], ")"]],
+ ["heredoc", ["some text\nsome text..\n", ["punctuation", "some text..."]]],
+ ["variable", ["$foo"]], ["operator", "="],
+ ["heredoc", ["@(", ["punctuation", "FOOBAR"], ")"]],
+ ["operator", "=="], ["variable", ["$bar"]],
+ ["heredoc", ["\tFoobar\n\t", ["punctuation", "-FOOBAR"]]]
+]
+
+----------------------------------------------------
+
+Checks for heredoc strings.
+Also checks that string interpolation applies only inside quoted heredoc strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/interpolation_feature.test b/package/src/prism/tests/languages/puppet/interpolation_feature.test
new file mode 100644
index 00000000..e078ec57
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/interpolation_feature.test
@@ -0,0 +1,54 @@
+"$foo ${::foo} ${foo::bar.foobar}
+${foobar(42)} ${::interfaces.split(",")[3]}
+${[1,20,3].filter |$value| { $value < 10 }}"
+
+----------------------------------------------------
+
+[
+ ["string", [["double-quoted", [
+ "\"",
+ ["interpolation", ["$foo"]],
+ ["interpolation", [
+ ["delimiter", "$"], ["punctuation", "{"],
+ ["short-variable", [["punctuation", "::"], "foo"]],
+ ["punctuation", "}"]
+ ]],
+ ["interpolation", [
+ ["delimiter", "$"], ["punctuation", "{"],
+ ["short-variable", ["foo", ["punctuation", "::"], "bar"]],
+ ["punctuation", "."], ["function", "foobar"],
+ ["punctuation", "}"]
+ ]],
+ ["interpolation", [
+ ["delimiter", "$"], ["punctuation", "{"],
+ ["function", "foobar"], ["punctuation", "("],
+ ["number", "42"], ["punctuation", ")"],
+ ["punctuation", "}"]
+ ]],
+ ["interpolation", [
+ ["delimiter", "$"], ["punctuation", "{"],
+ ["short-variable", [["punctuation", "::"], "interfaces"]],
+ ["punctuation", "."], ["function", "split"],
+ ["punctuation", "("], ["string", [["double-quoted", ["\",\""]]]],
+ ["punctuation", ")"], ["punctuation", "["],
+ ["number", "3"], ["punctuation", "]"],
+ ["punctuation", "}"]
+ ]],
+ ["interpolation", [
+ ["delimiter", "$"], ["punctuation", "{"],
+ ["punctuation", "["], ["number", "1"],
+ ["punctuation", ","], ["number", "20"],
+ ["punctuation", ","], ["number", "3"], ["punctuation", "]"],
+ ["punctuation", "."], ["function", "filter"],
+ ["operator", "|"], ["variable", ["$value"]], ["operator", "|"],
+ ["punctuation", "{"], ["variable", ["$value"]],
+ ["operator", "<"], ["number", "10"], ["punctuation", "}"],
+ ["punctuation", "}"]
+ ]],
+ "\""
+ ]]]]
+]
+
+----------------------------------------------------
+
+Checks for interpolation.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/keyword_feature.test b/package/src/prism/tests/languages/puppet/keyword_feature.test
new file mode 100644
index 00000000..3bff46c7
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/keyword_feature.test
@@ -0,0 +1,47 @@
+application
+attr
+case
+class
+consumes
+default
+define
+else
+elsif
+function
+if
+import
+inherits
+node
+private
+produces
+type
+undef
+unless
+
+----------------------------------------------------
+
+[
+ ["keyword", "application"],
+ ["keyword", "attr"],
+ ["keyword", "case"],
+ ["keyword", "class"],
+ ["keyword", "consumes"],
+ ["keyword", "default"],
+ ["keyword", "define"],
+ ["keyword", "else"],
+ ["keyword", "elsif"],
+ ["keyword", "function"],
+ ["keyword", "if"],
+ ["keyword", "import"],
+ ["keyword", "inherits"],
+ ["keyword", "node"],
+ ["keyword", "private"],
+ ["keyword", "produces"],
+ ["keyword", "type"],
+ ["keyword", "undef"],
+ ["keyword", "unless"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/number_feature.test b/package/src/prism/tests/languages/puppet/number_feature.test
new file mode 100644
index 00000000..173733d5
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/number_feature.test
@@ -0,0 +1,25 @@
+0
+42
+3.14159
+3e8
+3.2E-7
+0777
+0xBadFace
+0XBADFACE
+
+----------------------------------------------------
+
+[
+ ["number", "0"],
+ ["number", "42"],
+ ["number", "3.14159"],
+ ["number", "3e8"],
+ ["number", "3.2E-7"],
+ ["number", "0777"],
+ ["number", "0xBadFace"],
+ ["number", "0XBADFACE"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/operator_feature.test b/package/src/prism/tests/languages/puppet/operator_feature.test
new file mode 100644
index 00000000..c3b9d394
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/operator_feature.test
@@ -0,0 +1,29 @@
+= == =~ =>
+! != !~
+< << <<|
+<= <~ <| <-
+> >> >=
+- ->
+~>
+| |> |>>
+* / % + ?
+and in or
+
+----------------------------------------------------
+
+[
+ ["operator", "="], ["operator", "=="], ["operator", "=~"], ["operator", "=>"],
+ ["operator", "!"], ["operator", "!="], ["operator", "!~"],
+ ["operator", "<"], ["operator", "<<"], ["operator", "<<|"],
+ ["operator", "<="], ["operator", "<~"], ["operator", "<|"], ["operator", "<-"],
+ ["operator", ">"], ["operator", ">>"], ["operator", ">="],
+ ["operator", "-"], ["operator", "->"],
+ ["operator", "~>"],
+ ["operator", "|"], ["operator", "|>"], ["operator", "|>>"],
+ ["operator", "*"], ["operator", "/"], ["operator", "%"], ["operator", "+"], ["operator", "?"],
+ ["operator", "and"], ["operator", "in"], ["operator", "or"]
+]
+
+----------------------------------------------------
+
+Checks for operators.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/regex_feature.test b/package/src/prism/tests/languages/puppet/regex_feature.test
new file mode 100644
index 00000000..076e9925
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/regex_feature.test
@@ -0,0 +1,32 @@
+node /f(o)"o"[b]?a\/r/
+$foo = /foo
+bar # baz
+/m
+$foo = /foo
+bar # baz
+/ixm
+$foo = /@(foo)/
+
+----------------------------------------------------
+
+[
+ ["keyword", "node"],
+ ["regex", ["/f(o)\"o\"[b]?a\\/r/"]],
+ ["variable", ["$foo"]], ["operator", "="],
+ ["regex", ["/foo\nbar # baz\n/m"]],
+ ["variable", ["$foo"]], ["operator", "="],
+ ["regex", [
+ ["extended-regex", [
+ "/foo\nbar ",
+ ["comment", "# baz"],
+ "\n/ixm"
+ ]]
+ ]],
+ ["variable", ["$foo"]], ["operator", "="],
+ ["regex", ["/@(foo)/"]]
+]
+
+----------------------------------------------------
+
+Checks for regular expressions.
+Also checks that extended-regex accept inline comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/string_feature.test b/package/src/prism/tests/languages/puppet/string_feature.test
new file mode 100644
index 00000000..27a25207
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/string_feature.test
@@ -0,0 +1,36 @@
+''
+'fo\'obar'
+'foo
+$bar
+baz'
+""
+"fo\"obar"
+"foo
+$bar
+baz"
+" @(foo) "
+"foo /* bar */ baz"
+"foo #bar baz"
+
+----------------------------------------------------
+
+[
+ ["string", ["''"]],
+ ["string", ["'fo\\'obar'"]],
+ ["string", ["'foo\n$bar\nbaz'"]],
+ ["string", [["double-quoted", ["\"\""]]]],
+ ["string", [["double-quoted", ["\"fo\\\"obar\""]]]],
+ ["string", [["double-quoted", [
+ "\"foo\n",
+ ["interpolation", ["$bar"]],
+ "\nbaz\""
+ ]]]],
+ ["string", [["double-quoted", ["\" @(foo) \""]]]],
+ ["string", [["double-quoted", ["\"foo /* bar */ baz\""]]]],
+ ["string", [["double-quoted", ["\"foo #bar baz\""]]]]
+]
+
+----------------------------------------------------
+
+Checks for strings.
+Also checks that string interpolation only applies to double-quoted strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/puppet/variable_feature.test b/package/src/prism/tests/languages/puppet/variable_feature.test
new file mode 100644
index 00000000..142e2070
--- /dev/null
+++ b/package/src/prism/tests/languages/puppet/variable_feature.test
@@ -0,0 +1,15 @@
+$foo
+$::foobar_42
+$Foo::Bar_42::baz
+
+----------------------------------------------------
+
+[
+ ["variable", ["$foo"]],
+ ["variable", ["$", ["punctuation", "::"], "foobar_42"]],
+ ["variable", ["$Foo", ["punctuation", "::"], "Bar_42", ["punctuation", "::"], "baz"]]
+]
+
+----------------------------------------------------
+
+Checks for variables.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/comment_feature.test b/package/src/prism/tests/languages/pure/comment_feature.test
new file mode 100644
index 00000000..474d904a
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/comment_feature.test
@@ -0,0 +1,20 @@
+//
+// Foobar
+/**/
+/* Foo
+bar */
+#! --nochecks
+
+----------------------------------------------------
+
+[
+ ["comment", "//"],
+ ["comment", "// Foobar"],
+ ["comment", "/**/"],
+ ["comment", "/* Foo\nbar */"],
+ ["comment", "#! --nochecks"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/function_feature.test b/package/src/prism/tests/languages/pure/function_feature.test
new file mode 100644
index 00000000..d89c5479
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/function_feature.test
@@ -0,0 +1,619 @@
+abs
+add_fundef
+add_fundef_at
+add_interface
+add_interface_at
+add_macdef
+add_macdef_at
+add_typedef
+add_typedef_at
+add_addr
+add_constdef
+add_vardef
+all
+any
+appl
+applp
+arity
+bigint
+bigintp
+blob
+blob_crc
+blob_size
+blobp
+bool
+boolp
+byte_matrix
+byte_pointer
+byte_string
+byte_cstring
+byte_string_pointer
+byte_cstring_pointer
+calloc
+cat
+catmap
+ceil
+char
+charp
+chars
+check_ptrtag
+chr
+clear_sentry
+clearsym
+closure
+closurep
+cmatrix
+cmatrixp
+col
+cols
+colcat
+colcatmap
+colmap
+colrev
+colvector
+colvectorp
+colvectorseq
+complex
+complex_float_matrix
+complex_float_pointer
+complex_matrix
+complex_matrix_view
+complex_pointer
+complexp
+conj
+cooked
+cookedp
+cst
+cstring
+cstring_dup
+cstring_list
+cstring_vector
+curry
+curry3
+cycle
+cyclen
+del_constdef
+del_fundef
+del_interface
+del_macdef
+del_typedef
+del_vardef
+delete
+diag
+diagmat
+dim
+dmatrix
+dmatrixp
+do
+double
+double_matrix
+double_matrix_view
+double_pointer
+doublep
+dowith
+dowith3
+drop
+dropwhile
+eval
+evalcmd
+exactp
+filter
+fix
+fixity
+flip
+float_matrix
+float_pointer
+floor
+foldl
+foldl1
+foldr
+foldr1
+frac
+free
+fun
+funp
+function
+functionp
+gcd
+get
+get_byte
+get_constdef
+get_double
+get_float
+get_fundef
+get_int
+get_int64
+get_interface
+get_interface_typedef
+get_long
+get_macdef
+get_pointer
+get_ptrtag
+get_short
+get_sentry
+get_string
+get_typedef
+get_vardef
+globsym
+hash
+head
+id
+im
+imatrix
+imatrixp
+index
+inexactp
+infp
+init
+insert
+int
+int_matrix
+int_matrix_view
+int_pointer
+intp
+int64_matrix
+int64_pointer
+integer
+integerp
+iterate
+iteraten
+iterwhile
+join
+key
+keys
+lambda
+lambdap
+last
+lasterr
+lasterrpos
+lcd
+list
+list2
+listp
+listmap
+make_ptrtag
+malloc
+map
+matcat
+matrix
+matrixp
+max
+member
+min
+nanp
+nargs
+nmatrix
+nmatrixp
+null
+number
+numberp
+ord
+pack
+packed
+pointer
+pointer_cast
+pointer_tag
+pointer_type
+pointerp
+pow
+pred
+ptrtag
+put
+put_byte
+put_double
+put_float
+put_int
+put_int64
+put_long
+put_pointer
+put_short
+put_string
+rational
+rationalp
+re
+real
+realp
+realloc
+record
+recordp
+redim
+reduce
+reduce_with
+ref
+refp
+repeat
+repeatn
+reverse
+rlist
+rlistp
+round
+row
+rows
+rowcat
+rowcatmap
+rowmap
+rowrev
+rowvector
+rowvectorp
+rowvectorseq
+same
+scanl
+scanl1
+scanr
+scanr1
+sentry
+sgn
+short_matrix
+short_pointer
+slice
+smatrix
+smatrixp
+sort
+split
+str
+strcat
+stream
+stride
+string
+string_dup
+string_list
+string_vector
+stringp
+subdiag
+subdiagmat
+submat
+subseq
+subseq2
+substr
+succ
+supdiag
+supdiagmat
+symbol
+symbolp
+tail
+take
+takewhile
+thunk
+thunkp
+transpose
+trunc
+tuple
+tuplep
+typep
+ubyte
+uint
+uint64
+ulong
+uncurry
+uncurry3
+unref
+unzip
+unzip3
+update
+ushort
+val
+vals
+var
+varp
+vector
+vectorp
+vectorseq
+void
+zip
+zip3
+zipwith
+zipwith3
+
+----------------------------------------------------
+
+[
+ ["function", "abs"],
+ ["function", "add_fundef"],
+ ["function", "add_fundef_at"],
+ ["function", "add_interface"],
+ ["function", "add_interface_at"],
+ ["function", "add_macdef"],
+ ["function", "add_macdef_at"],
+ ["function", "add_typedef"],
+ ["function", "add_typedef_at"],
+ ["function", "add_addr"],
+ ["function", "add_constdef"],
+ ["function", "add_vardef"],
+ ["function", "all"],
+ ["function", "any"],
+ ["function", "appl"],
+ ["function", "applp"],
+ ["function", "arity"],
+ ["function", "bigint"],
+ ["function", "bigintp"],
+ ["function", "blob"],
+ ["function", "blob_crc"],
+ ["function", "blob_size"],
+ ["function", "blobp"],
+ ["function", "bool"],
+ ["function", "boolp"],
+ ["function", "byte_matrix"],
+ ["function", "byte_pointer"],
+ ["function", "byte_string"],
+ ["function", "byte_cstring"],
+ ["function", "byte_string_pointer"],
+ ["function", "byte_cstring_pointer"],
+ ["function", "calloc"],
+ ["function", "cat"],
+ ["function", "catmap"],
+ ["function", "ceil"],
+ ["function", "char"],
+ ["function", "charp"],
+ ["function", "chars"],
+ ["function", "check_ptrtag"],
+ ["function", "chr"],
+ ["function", "clear_sentry"],
+ ["function", "clearsym"],
+ ["function", "closure"],
+ ["function", "closurep"],
+ ["function", "cmatrix"],
+ ["function", "cmatrixp"],
+ ["function", "col"],
+ ["function", "cols"],
+ ["function", "colcat"],
+ ["function", "colcatmap"],
+ ["function", "colmap"],
+ ["function", "colrev"],
+ ["function", "colvector"],
+ ["function", "colvectorp"],
+ ["function", "colvectorseq"],
+ ["function", "complex"],
+ ["function", "complex_float_matrix"],
+ ["function", "complex_float_pointer"],
+ ["function", "complex_matrix"],
+ ["function", "complex_matrix_view"],
+ ["function", "complex_pointer"],
+ ["function", "complexp"],
+ ["function", "conj"],
+ ["function", "cooked"],
+ ["function", "cookedp"],
+ ["function", "cst"],
+ ["function", "cstring"],
+ ["function", "cstring_dup"],
+ ["function", "cstring_list"],
+ ["function", "cstring_vector"],
+ ["function", "curry"],
+ ["function", "curry3"],
+ ["function", "cycle"],
+ ["function", "cyclen"],
+ ["function", "del_constdef"],
+ ["function", "del_fundef"],
+ ["function", "del_interface"],
+ ["function", "del_macdef"],
+ ["function", "del_typedef"],
+ ["function", "del_vardef"],
+ ["function", "delete"],
+ ["function", "diag"],
+ ["function", "diagmat"],
+ ["function", "dim"],
+ ["function", "dmatrix"],
+ ["function", "dmatrixp"],
+ ["function", "do"],
+ ["function", "double"],
+ ["function", "double_matrix"],
+ ["function", "double_matrix_view"],
+ ["function", "double_pointer"],
+ ["function", "doublep"],
+ ["function", "dowith"],
+ ["function", "dowith3"],
+ ["function", "drop"],
+ ["function", "dropwhile"],
+ ["function", "eval"],
+ ["function", "evalcmd"],
+ ["function", "exactp"],
+ ["function", "filter"],
+ ["function", "fix"],
+ ["function", "fixity"],
+ ["function", "flip"],
+ ["function", "float_matrix"],
+ ["function", "float_pointer"],
+ ["function", "floor"],
+ ["function", "foldl"],
+ ["function", "foldl1"],
+ ["function", "foldr"],
+ ["function", "foldr1"],
+ ["function", "frac"],
+ ["function", "free"],
+ ["function", "fun"],
+ ["function", "funp"],
+ ["function", "function"],
+ ["function", "functionp"],
+ ["function", "gcd"],
+ ["function", "get"],
+ ["function", "get_byte"],
+ ["function", "get_constdef"],
+ ["function", "get_double"],
+ ["function", "get_float"],
+ ["function", "get_fundef"],
+ ["function", "get_int"],
+ ["function", "get_int64"],
+ ["function", "get_interface"],
+ ["function", "get_interface_typedef"],
+ ["function", "get_long"],
+ ["function", "get_macdef"],
+ ["function", "get_pointer"],
+ ["function", "get_ptrtag"],
+ ["function", "get_short"],
+ ["function", "get_sentry"],
+ ["function", "get_string"],
+ ["function", "get_typedef"],
+ ["function", "get_vardef"],
+ ["function", "globsym"],
+ ["function", "hash"],
+ ["function", "head"],
+ ["function", "id"],
+ ["function", "im"],
+ ["function", "imatrix"],
+ ["function", "imatrixp"],
+ ["function", "index"],
+ ["function", "inexactp"],
+ ["function", "infp"],
+ ["function", "init"],
+ ["function", "insert"],
+ ["function", "int"],
+ ["function", "int_matrix"],
+ ["function", "int_matrix_view"],
+ ["function", "int_pointer"],
+ ["function", "intp"],
+ ["function", "int64_matrix"],
+ ["function", "int64_pointer"],
+ ["function", "integer"],
+ ["function", "integerp"],
+ ["function", "iterate"],
+ ["function", "iteraten"],
+ ["function", "iterwhile"],
+ ["function", "join"],
+ ["function", "key"],
+ ["function", "keys"],
+ ["function", "lambda"],
+ ["function", "lambdap"],
+ ["function", "last"],
+ ["function", "lasterr"],
+ ["function", "lasterrpos"],
+ ["function", "lcd"],
+ ["function", "list"],
+ ["function", "list2"],
+ ["function", "listp"],
+ ["function", "listmap"],
+ ["function", "make_ptrtag"],
+ ["function", "malloc"],
+ ["function", "map"],
+ ["function", "matcat"],
+ ["function", "matrix"],
+ ["function", "matrixp"],
+ ["function", "max"],
+ ["function", "member"],
+ ["function", "min"],
+ ["function", "nanp"],
+ ["function", "nargs"],
+ ["function", "nmatrix"],
+ ["function", "nmatrixp"],
+ ["function", "null"],
+ ["function", "number"],
+ ["function", "numberp"],
+ ["function", "ord"],
+ ["function", "pack"],
+ ["function", "packed"],
+ ["function", "pointer"],
+ ["function", "pointer_cast"],
+ ["function", "pointer_tag"],
+ ["function", "pointer_type"],
+ ["function", "pointerp"],
+ ["function", "pow"],
+ ["function", "pred"],
+ ["function", "ptrtag"],
+ ["function", "put"],
+ ["function", "put_byte"],
+ ["function", "put_double"],
+ ["function", "put_float"],
+ ["function", "put_int"],
+ ["function", "put_int64"],
+ ["function", "put_long"],
+ ["function", "put_pointer"],
+ ["function", "put_short"],
+ ["function", "put_string"],
+ ["function", "rational"],
+ ["function", "rationalp"],
+ ["function", "re"],
+ ["function", "real"],
+ ["function", "realp"],
+ ["function", "realloc"],
+ ["function", "record"],
+ ["function", "recordp"],
+ ["function", "redim"],
+ ["function", "reduce"],
+ ["function", "reduce_with"],
+ ["function", "ref"],
+ ["function", "refp"],
+ ["function", "repeat"],
+ ["function", "repeatn"],
+ ["function", "reverse"],
+ ["function", "rlist"],
+ ["function", "rlistp"],
+ ["function", "round"],
+ ["function", "row"],
+ ["function", "rows"],
+ ["function", "rowcat"],
+ ["function", "rowcatmap"],
+ ["function", "rowmap"],
+ ["function", "rowrev"],
+ ["function", "rowvector"],
+ ["function", "rowvectorp"],
+ ["function", "rowvectorseq"],
+ ["function", "same"],
+ ["function", "scanl"],
+ ["function", "scanl1"],
+ ["function", "scanr"],
+ ["function", "scanr1"],
+ ["function", "sentry"],
+ ["function", "sgn"],
+ ["function", "short_matrix"],
+ ["function", "short_pointer"],
+ ["function", "slice"],
+ ["function", "smatrix"],
+ ["function", "smatrixp"],
+ ["function", "sort"],
+ ["function", "split"],
+ ["function", "str"],
+ ["function", "strcat"],
+ ["function", "stream"],
+ ["function", "stride"],
+ ["function", "string"],
+ ["function", "string_dup"],
+ ["function", "string_list"],
+ ["function", "string_vector"],
+ ["function", "stringp"],
+ ["function", "subdiag"],
+ ["function", "subdiagmat"],
+ ["function", "submat"],
+ ["function", "subseq"],
+ ["function", "subseq2"],
+ ["function", "substr"],
+ ["function", "succ"],
+ ["function", "supdiag"],
+ ["function", "supdiagmat"],
+ ["function", "symbol"],
+ ["function", "symbolp"],
+ ["function", "tail"],
+ ["function", "take"],
+ ["function", "takewhile"],
+ ["function", "thunk"],
+ ["function", "thunkp"],
+ ["function", "transpose"],
+ ["function", "trunc"],
+ ["function", "tuple"],
+ ["function", "tuplep"],
+ ["function", "typep"],
+ ["function", "ubyte"],
+ ["function", "uint"],
+ ["function", "uint64"],
+ ["function", "ulong"],
+ ["function", "uncurry"],
+ ["function", "uncurry3"],
+ ["function", "unref"],
+ ["function", "unzip"],
+ ["function", "unzip3"],
+ ["function", "update"],
+ ["function", "ushort"],
+ ["function", "val"],
+ ["function", "vals"],
+ ["function", "var"],
+ ["function", "varp"],
+ ["function", "vector"],
+ ["function", "vectorp"],
+ ["function", "vectorseq"],
+ ["function", "void"],
+ ["function", "zip"],
+ ["function", "zip3"],
+ ["function", "zipwith"],
+ ["function", "zipwith3"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/keyword_feature.test b/package/src/prism/tests/languages/pure/keyword_feature.test
new file mode 100644
index 00000000..be0a4dec
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/keyword_feature.test
@@ -0,0 +1,113 @@
+ans
+break
+bt
+case
+catch
+cd
+clear
+const
+def
+del
+dump
+else
+end
+exit
+extern
+false
+force
+help
+if
+infix
+infixl
+infixr
+interface
+let
+ls
+mem
+namespace
+nonfix
+NULL
+of
+otherwise
+outfix
+override
+postfix
+prefix
+private
+public
+pwd
+quit
+run
+save
+show
+stats
+then
+throw
+trace
+true
+type
+underride
+using
+when
+with
+
+----------------------------------------------------
+
+[
+ ["keyword", "ans"],
+ ["keyword", "break"],
+ ["keyword", "bt"],
+ ["keyword", "case"],
+ ["keyword", "catch"],
+ ["keyword", "cd"],
+ ["keyword", "clear"],
+ ["keyword", "const"],
+ ["keyword", "def"],
+ ["keyword", "del"],
+ ["keyword", "dump"],
+ ["keyword", "else"],
+ ["keyword", "end"],
+ ["keyword", "exit"],
+ ["keyword", "extern"],
+ ["keyword", "false"],
+ ["keyword", "force"],
+ ["keyword", "help"],
+ ["keyword", "if"],
+ ["keyword", "infix"],
+ ["keyword", "infixl"],
+ ["keyword", "infixr"],
+ ["keyword", "interface"],
+ ["keyword", "let"],
+ ["keyword", "ls"],
+ ["keyword", "mem"],
+ ["keyword", "namespace"],
+ ["keyword", "nonfix"],
+ ["keyword", "NULL"],
+ ["keyword", "of"],
+ ["keyword", "otherwise"],
+ ["keyword", "outfix"],
+ ["keyword", "override"],
+ ["keyword", "postfix"],
+ ["keyword", "prefix"],
+ ["keyword", "private"],
+ ["keyword", "public"],
+ ["keyword", "pwd"],
+ ["keyword", "quit"],
+ ["keyword", "run"],
+ ["keyword", "save"],
+ ["keyword", "show"],
+ ["keyword", "stats"],
+ ["keyword", "then"],
+ ["keyword", "throw"],
+ ["keyword", "trace"],
+ ["keyword", "true"],
+ ["keyword", "type"],
+ ["keyword", "underride"],
+ ["keyword", "using"],
+ ["keyword", "when"],
+ ["keyword", "with"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/number_feature.test b/package/src/prism/tests/languages/pure/number_feature.test
new file mode 100644
index 00000000..e3a030a4
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/number_feature.test
@@ -0,0 +1,31 @@
+inf
+nan
+
+0xBadFace
+0b01010
+42
+4711L
+3.14159
+3e8
+4.2E-7
+0.9e+12
+
+----------------------------------------------------
+
+[
+ ["number", "inf"],
+ ["number", "nan"],
+
+ ["number", "0xBadFace"],
+ ["number", "0b01010"],
+ ["number", "42"],
+ ["number", "4711L"],
+ ["number", "3.14159"],
+ ["number", "3e8"],
+ ["number", "4.2E-7"],
+ ["number", "0.9e+12"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/operator_feature.test b/package/src/prism/tests/languages/pure/operator_feature.test
new file mode 100644
index 00000000..c48a3557
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/operator_feature.test
@@ -0,0 +1,29 @@
+and div mod not or
+
+! " # $ % &
+' * + - . /
+: < = > ? @
+\ ^ _ ` ~
+
+¡ ¢ × ÷
+
+<,|
+
+----------------------------------------------------
+
+[
+ ["operator", "and"], ["operator", "div"], ["operator", "mod"], ["operator", "not"], ["operator", "or"],
+
+ ["operator", "!"], ["operator", "\""], ["operator", "#"], ["operator", "$"], ["operator", "%"], ["operator", "&"],
+ ["operator", "'"], ["operator", "*"], ["operator", "+"], ["operator", "-"], ["operator", "."], ["operator", "/"],
+ ["operator", ":"], ["operator", "<"], ["operator", "="], ["operator", ">"], ["operator", "?"], ["operator", "@"],
+ ["operator", "\\"], ["operator", "^"], ["operator", "_"], ["operator", "`"], ["operator", "~"],
+
+ ["operator", "¡"], ["operator", "¢"], ["operator", "×"], ["operator", "÷"],
+
+ ["operator", "<,|"]
+]
+
+----------------------------------------------------
+
+Checks for some operators.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/punctuation_feature.test b/package/src/prism/tests/languages/pure/punctuation_feature.test
new file mode 100644
index 00000000..dfad5774
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/punctuation_feature.test
@@ -0,0 +1,13 @@
+( ) { } [ ] ;
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", ";"]
+]
diff --git a/package/src/prism/tests/languages/pure/special_feature.test b/package/src/prism/tests/languages/pure/special_feature.test
new file mode 100644
index 00000000..83f45595
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/special_feature.test
@@ -0,0 +1,15 @@
+__show__
+__cmd__
+__with__
+
+----------------------------------------------------
+
+[
+ ["special", "__show__"],
+ ["special", "__cmd__"],
+ ["special", "__with__"]
+]
+
+----------------------------------------------------
+
+Checks for special functions.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/pure/string_feature.test b/package/src/prism/tests/languages/pure/string_feature.test
new file mode 100644
index 00000000..b3c6ec95
--- /dev/null
+++ b/package/src/prism/tests/languages/pure/string_feature.test
@@ -0,0 +1,13 @@
+""
+"fo\"obar"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"fo\\\"obar\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purebasic/asm_feature.test b/package/src/prism/tests/languages/purebasic/asm_feature.test
new file mode 100644
index 00000000..a2646f50
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/asm_feature.test
@@ -0,0 +1,375 @@
+Procedure.i XorTwoBlocks2(*buffer1, *buffer2, length)
+ ; move all the required data to source reg, destination reg and counter reg
+ !mov esi, [p.p_buffer1] ; read 32-bit integer from p.p_buffer1 and move to esi
+ !mov edi, [p.p_buffer2] ; read 32-bit integer from p.p_buffer2 and move to edi
+ !mov ecx, [p.v_length] ; read 32-bit integer from p.v_length and move to ecx
+
+ !@@: ; anonymous label, can be reached by @b (back) or @f (forward)
+ !mov al, byte [edi + ecx - 1] ; read byte from destination
+ !xor byte [esi + ecx - 1], al ; xor source with destination (i.e. xor bytes from both blocks)
+ !dec ecx ; decrease counter
+ !jne @b ; jumb back to first anonymous label behind
+ ProcedureReturn 0
+EndProcedure
+
+!jne label1
+!jmp @b
+!EXTERN printf
+!DEFAULT rel
+
+; source: http://www.jose.it-berater.org/smfforum/index.php?topic=5091.0
+Procedure PopCount64(x.q)
+ !mov rax, [p.v_x]
+ !mov rdx, rax
+ !shr rdx, 1
+ !and rdx, [popcount64_v55]
+ !sub rax, rdx
+ ;x = (x & $3333333333333333) + ((x >> 2) & $3333333333333333)
+ !mov rdx, rax ;x
+ !and rax, [popcount64_v33]
+ !shr rdx, 2
+ !and rdx, [popcount64_v33]
+ !add rax, rdx
+ ;x = (x + (x >> 4)) & $0f0f0f0f0f0f0f0f0f0f
+ !mov rdx, rax
+ !shr rdx, 4
+ !add rax, rdx
+ !and rax, [popcount64_v0f]
+ ;x * $0101010101010101 >> 56
+ !imul rax, [popcount64_v01]
+ !shr rax, 56
+ ProcedureReturn
+ !popcount64_v01: dq 0x0101010101010101
+ !popcount64_v0f: dq 0x0f0f0f0f0f0f0f0f
+ !popcount64_v33: dq 0x3333333333333333
+ !popcount64_v55: dq 0x5555555555555555
+EndProcedure
+
+----------------------------------------------------
+
+[
+ ["keyword", "Procedure"],
+ ["punctuation", "."],
+ "i ",
+ ["function", "XorTwoBlocks2"],
+ ["punctuation", "("],
+ ["operator", "*buffer1"],
+ ["punctuation", ","],
+ ["operator", "*buffer2"],
+ ["punctuation", ","],
+ " length",
+ ["punctuation", ")"],
+
+ ["comment", "; move all the required data to source reg, destination reg and counter reg"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "esi"],
+ ["operator", ","],
+ ["operator", "["],
+ "p",
+ ["operator", "."],
+ "p_buffer1",
+ ["operator", "]"]
+ ]],
+ ["comment", "; read 32-bit integer from p.p_buffer1 and move to esi"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "edi"],
+ ["operator", ","],
+ ["operator", "["],
+ "p",
+ ["operator", "."],
+ "p_buffer2",
+ ["operator", "]"]
+ ]],
+ ["comment", "; read 32-bit integer from p.p_buffer2 and move to edi"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "ecx"],
+ ["operator", ","],
+ ["operator", "["],
+ "p",
+ ["operator", "."],
+ "v_length",
+ ["operator", "]"]
+ ]],
+ ["comment", "; read 32-bit integer from p.v_length and move to ecx"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["label", "@@"],
+ ["operator", ":"]
+ ]],
+ ["comment", "; anonymous label, can be reached by @b (back) or @f (forward)"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "al"],
+ ["operator", ","],
+ " byte ",
+ ["operator", "["],
+ ["register", "edi"],
+ ["operator", "+"],
+ ["register", "ecx"],
+ ["operator", "-"],
+ ["number", "1"],
+ ["operator", "]"]
+ ]],
+ ["comment", "; read byte from destination"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "xor"],
+ " byte ",
+ ["operator", "["],
+ ["register", "esi"],
+ ["operator", "+"],
+ ["register", "ecx"],
+ ["operator", "-"],
+ ["number", "1"],
+ ["operator", "]"],
+ ["operator", ","],
+ ["register", "al"]
+ ]],
+ ["comment", "; xor source with destination (i.e. xor bytes from both blocks)"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "dec"],
+ ["register", "ecx"]
+ ]],
+ ["comment", "; decrease counter"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "jne"],
+ ["label-reference-anonymous", "@b"]
+ ]],
+ ["comment", "; jumb back to first anonymous label behind"],
+
+ ["keyword", "ProcedureReturn"],
+ ["number", "0"],
+
+ ["keyword", "EndProcedure"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "jne"],
+ ["label-reference-addressed", "label1"]
+ ]],
+ ["asm", [
+ ["operator", "!"],
+ ["function", "jmp"],
+ ["label-reference-anonymous", "@b"]
+ ]],
+ ["asm", [
+ ["operator", "!"],
+ ["keyword", "EXTERN printf"]
+ ]],
+ ["asm", [
+ ["operator", "!"],
+ ["keyword", "DEFAULT rel"]
+ ]],
+
+ ["comment", "; source: http://www.jose.it-berater.org/smfforum/index.php?topic=5091.0"],
+
+ ["keyword", "Procedure"],
+ ["function", "PopCount64"],
+ ["punctuation", "("],
+ "x",
+ ["punctuation", "."],
+ "q",
+ ["punctuation", ")"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["operator", "["],
+ "p",
+ ["operator", "."],
+ "v_x",
+ ["operator", "]"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["register", "rax"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "shr"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["number", "1"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "and"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["operator", "["],
+ "popcount64_v55",
+ ["operator", "]"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "sub"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["register", "rdx"]
+ ]],
+
+ ["comment", ";x = (x & $3333333333333333) + ((x >> 2) & $3333333333333333)"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["register", "rax"]
+ ]],
+ ["comment", ";x"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "and"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["operator", "["],
+ "popcount64_v33",
+ ["operator", "]"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "shr"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["number", "2"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "and"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["operator", "["],
+ "popcount64_v33",
+ ["operator", "]"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "add"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["register", "rdx"]
+ ]],
+
+ ["comment", ";x = (x + (x >> 4)) & $0f0f0f0f0f0f0f0f0f0f"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "mov"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["register", "rax"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "shr"],
+ ["register", "rdx"],
+ ["operator", ","],
+ ["number", "4"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "add"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["register", "rdx"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "and"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["operator", "["],
+ "popcount64_v0f",
+ ["operator", "]"]
+ ]],
+
+ ["comment", ";x * $0101010101010101 >> 56"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "imul"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["operator", "["],
+ "popcount64_v01",
+ ["operator", "]"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["function", "shr"],
+ ["register", "rax"],
+ ["operator", ","],
+ ["number", "56"]
+ ]],
+
+ ["keyword", "ProcedureReturn"],
+
+ ["asm", [
+ ["operator", "!"],
+ ["label", "popcount64_v01"],
+ ["operator", ":"],
+ ["function-inline", "dq"],
+ ["number", "0x0101010101010101"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["label", "popcount64_v0f"],
+ ["operator", ":"],
+ ["function-inline", "dq"],
+ ["number", "0x0f0f0f0f0f0f0f0f"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["label", "popcount64_v33"],
+ ["operator", ":"],
+ ["function-inline", "dq"],
+ ["number", "0x3333333333333333"]
+ ]],
+
+ ["asm", [
+ ["operator", "!"],
+ ["label", "popcount64_v55"],
+ ["operator", ":"],
+ ["function-inline", "dq"],
+ ["number", "0x5555555555555555"]
+ ]],
+
+ ["keyword", "EndProcedure"]
+]
diff --git a/package/src/prism/tests/languages/purebasic/comment_feature.test b/package/src/prism/tests/languages/purebasic/comment_feature.test
new file mode 100644
index 00000000..a32b9cfb
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/comment_feature.test
@@ -0,0 +1,20 @@
+;
+; comment
+
+a$ = 2 ;Test
+
+----------------------------------------------------
+
+[
+ ["comment", ";"],
+ ["comment", "; comment"],
+
+ "\n\na$ ",
+ ["operator", "="],
+ ["number", "2"],
+ ["comment", ";Test"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
diff --git a/package/src/prism/tests/languages/purebasic/function_feature.test b/package/src/prism/tests/languages/purebasic/function_feature.test
new file mode 100644
index 00000000..896990e8
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/function_feature.test
@@ -0,0 +1,9 @@
+foo()
+
+----------------------------------------------------
+
+[
+ ["function", "foo"],
+ ["punctuation", "("],
+ ["punctuation", ")"]
+]
diff --git a/package/src/prism/tests/languages/purebasic/keyword_feature.test b/package/src/prism/tests/languages/purebasic/keyword_feature.test
new file mode 100644
index 00000000..c0aa789b
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/keyword_feature.test
@@ -0,0 +1,213 @@
+DECLARECDLL
+DECLAREDLL
+COMPILERSELECT
+COMPILERCASE
+COMPILERDEFAULT
+COMPILERENDSELECT
+COMPILERERROR
+ENABLEEXPLICIT
+DISABLEEXPLICIT
+NOT
+AND
+OR
+XOR
+CALLDEBUGGER
+DEBUGLEVEL
+ENABLEDEBUGGER
+DISABLEDEBUGGER
+RESTORE
+READ
+INCLUDEPATH
+INCLUDEBINARY
+THREADED
+RUNTIME
+WITH
+ENDWITH
+STRUCTUREUNION
+ENDSTRUCTUREUNION
+ALIGN
+NEWLIST
+NEWMAP
+INTERFACE
+ENDINTERFACE
+EXTENDS
+ENUMERATION
+ENDENUMERATION
+SWAP
+FOREACH
+CONTINUE
+FAKERETURN
+GOTO
+GOSUB
+RETURN
+BREAK
+MODULE
+ENDMODULE
+DECLAREMODULE
+ENDDECLAREMODULE
+DECLARE
+DECLAREC
+PROTOTYPE
+PROTOTYPEC
+ENABLEASM
+DISABLEASM
+DIM
+REDIM
+DATA
+DATASECTION
+ENDDATASECTION
+TO
+PROCEDURERETURN
+DEBUG
+DEFAULT
+CASE
+SELECT
+ENDSELECT
+AS
+IMPORT
+ENDIMPORT
+IMPORTC
+COMPILERIF
+COMPILERELSE
+COMPILERENDIF
+COMPILERELSEIF
+END
+STRUCTURE
+ENDSTRUCTURE
+WHILE
+WEND
+FOR
+NEXT
+STEP
+IF
+ELSE
+ELSEIF
+ENDIF
+REPEAT
+UNTIL
+PROCEDURE
+PROCEDUREDLL
+PROCEDUREC
+PROCEDURECDLL
+ENDPROCEDURE
+PROTECTED
+SHARED
+STATIC
+GLOBAL
+DEFINE
+INCLUDEFILE
+XINCLUDEFILE
+MACRO
+ENDMACRO
+FOREVER
+
+----------------------------------------------------
+
+[
+ ["keyword", "DECLARECDLL"],
+ ["keyword", "DECLAREDLL"],
+ ["keyword", "COMPILERSELECT"],
+ ["keyword", "COMPILERCASE"],
+ ["keyword", "COMPILERDEFAULT"],
+ ["keyword", "COMPILERENDSELECT"],
+ ["keyword", "COMPILERERROR"],
+ ["keyword", "ENABLEEXPLICIT"],
+ ["keyword", "DISABLEEXPLICIT"],
+ ["keyword", "NOT"],
+ ["keyword", "AND"],
+ ["keyword", "OR"],
+ ["keyword", "XOR"],
+ ["keyword", "CALLDEBUGGER"],
+ ["keyword", "DEBUGLEVEL"],
+ ["keyword", "ENABLEDEBUGGER"],
+ ["keyword", "DISABLEDEBUGGER"],
+ ["keyword", "RESTORE"],
+ ["keyword", "READ"],
+ ["keyword", "INCLUDEPATH"],
+ ["keyword", "INCLUDEBINARY"],
+ ["keyword", "THREADED"],
+ ["keyword", "RUNTIME"],
+ ["keyword", "WITH"],
+ ["keyword", "ENDWITH"],
+ ["keyword", "STRUCTUREUNION"],
+ ["keyword", "ENDSTRUCTUREUNION"],
+ ["keyword", "ALIGN"],
+ ["keyword", "NEWLIST"],
+ ["keyword", "NEWMAP"],
+ ["keyword", "INTERFACE"],
+ ["keyword", "ENDINTERFACE"],
+ ["keyword", "EXTENDS"],
+ ["keyword", "ENUMERATION"],
+ ["keyword", "ENDENUMERATION"],
+ ["keyword", "SWAP"],
+ ["keyword", "FOREACH"],
+ ["keyword", "CONTINUE"],
+ ["keyword", "FAKERETURN"],
+ ["keyword", "GOTO"],
+ ["keyword", "GOSUB"],
+ ["keyword", "RETURN"],
+ ["keyword", "BREAK"],
+ ["keyword", "MODULE"],
+ ["keyword", "ENDMODULE"],
+ ["keyword", "DECLAREMODULE"],
+ ["keyword", "ENDDECLAREMODULE"],
+ ["keyword", "DECLARE"],
+ ["keyword", "DECLAREC"],
+ ["keyword", "PROTOTYPE"],
+ ["keyword", "PROTOTYPEC"],
+ ["keyword", "ENABLEASM"],
+ ["keyword", "DISABLEASM"],
+ ["keyword", "DIM"],
+ ["keyword", "REDIM"],
+ ["keyword", "DATA"],
+ ["keyword", "DATASECTION"],
+ ["keyword", "ENDDATASECTION"],
+ ["keyword", "TO"],
+ ["keyword", "PROCEDURERETURN"],
+ ["keyword", "DEBUG"],
+ ["keyword", "DEFAULT"],
+ ["keyword", "CASE"],
+ ["keyword", "SELECT"],
+ ["keyword", "ENDSELECT"],
+ ["keyword", "AS"],
+ ["keyword", "IMPORT"],
+ ["keyword", "ENDIMPORT"],
+ ["keyword", "IMPORTC"],
+ ["keyword", "COMPILERIF"],
+ ["keyword", "COMPILERELSE"],
+ ["keyword", "COMPILERENDIF"],
+ ["keyword", "COMPILERELSEIF"],
+ ["keyword", "END"],
+ ["keyword", "STRUCTURE"],
+ ["keyword", "ENDSTRUCTURE"],
+ ["keyword", "WHILE"],
+ ["keyword", "WEND"],
+ ["keyword", "FOR"],
+ ["keyword", "NEXT"],
+ ["keyword", "STEP"],
+ ["keyword", "IF"],
+ ["keyword", "ELSE"],
+ ["keyword", "ELSEIF"],
+ ["keyword", "ENDIF"],
+ ["keyword", "REPEAT"],
+ ["keyword", "UNTIL"],
+ ["keyword", "PROCEDURE"],
+ ["keyword", "PROCEDUREDLL"],
+ ["keyword", "PROCEDUREC"],
+ ["keyword", "PROCEDURECDLL"],
+ ["keyword", "ENDPROCEDURE"],
+ ["keyword", "PROTECTED"],
+ ["keyword", "SHARED"],
+ ["keyword", "STATIC"],
+ ["keyword", "GLOBAL"],
+ ["keyword", "DEFINE"],
+ ["keyword", "INCLUDEFILE"],
+ ["keyword", "XINCLUDEFILE"],
+ ["keyword", "MACRO"],
+ ["keyword", "ENDMACRO"],
+ ["keyword", "FOREVER"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purebasic/number_feature.test b/package/src/prism/tests/languages/purebasic/number_feature.test
new file mode 100644
index 00000000..fea76d12
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/number_feature.test
@@ -0,0 +1,19 @@
+42
+3.14159
+2e8
+3.4E-9
+0.7E+12
+
+----------------------------------------------------
+
+[
+ ["number", "42"],
+ ["number", "3.14159"],
+ ["number", "2e8"],
+ ["number", "3.4E-9"],
+ ["number", "0.7E+12"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purebasic/operator_feature.test b/package/src/prism/tests/languages/purebasic/operator_feature.test
new file mode 100644
index 00000000..dfb661b1
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/operator_feature.test
@@ -0,0 +1,17 @@
+< <=
+> >=
++ - *
+@ab$
+
+----------------------------------------------------
+
+[
+ ["operator", "<"], ["operator", "<="],
+ ["operator", ">"], ["operator", ">="],
+ ["operator", "+"], ["operator", "-"], ["operator", "*"],
+ ["operator", "@ab$"]
+]
+
+----------------------------------------------------
+
+Checks for operators.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purebasic/string_feature.test b/package/src/prism/tests/languages/purebasic/string_feature.test
new file mode 100644
index 00000000..03aeb38c
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/string_feature.test
@@ -0,0 +1,13 @@
+""
+"foobar"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"foobar\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purebasic/tag_feature.test b/package/src/prism/tests/languages/purebasic/tag_feature.test
new file mode 100644
index 00000000..263c4079
--- /dev/null
+++ b/package/src/prism/tests/languages/purebasic/tag_feature.test
@@ -0,0 +1,9 @@
+#foo
+#NULL$
+
+----------------------------------------------------
+
+[
+ ["tag", "#foo"],
+ ["tag", "#NULL$"]
+]
diff --git a/package/src/prism/tests/languages/purescript/builtin_feature.test b/package/src/prism/tests/languages/purescript/builtin_feature.test
new file mode 100644
index 00000000..18537d61
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/builtin_feature.test
@@ -0,0 +1,109 @@
+when
+unless
+liftA1
+apply
+bind
+discard
+join
+ifM
+identity
+whenM
+unlessM
+liftM1
+ap
+compose
+otherwise
+top
+bottom
+recip
+eq
+notEq
+degree
+div
+mod
+lcm
+gcd
+flip
+const
+map
+void
+flap
+conj
+disj
+not
+mempty
+compare
+min
+max
+comparing
+clamp
+between
+sub
+negate
+append
+add
+zero
+mul
+one
+show
+unit
+absurd
+
+----------------------------------------------------
+
+[
+ ["builtin", "when"],
+ ["builtin", "unless"],
+ ["builtin", "liftA1"],
+ ["builtin", "apply"],
+ ["builtin", "bind"],
+ ["builtin", "discard"],
+ ["builtin", "join"],
+ ["builtin", "ifM"],
+ ["builtin", "identity"],
+ ["builtin", "whenM"],
+ ["builtin", "unlessM"],
+ ["builtin", "liftM1"],
+ ["builtin", "ap"],
+ ["builtin", "compose"],
+ ["builtin", "otherwise"],
+ ["builtin", "top"],
+ ["builtin", "bottom"],
+ ["builtin", "recip"],
+ ["builtin", "eq"],
+ ["builtin", "notEq"],
+ ["builtin", "degree"],
+ ["builtin", "div"],
+ ["builtin", "mod"],
+ ["builtin", "lcm"],
+ ["builtin", "gcd"],
+ ["builtin", "flip"],
+ ["builtin", "const"],
+ ["builtin", "map"],
+ ["builtin", "void"],
+ ["builtin", "flap"],
+ ["builtin", "conj"],
+ ["builtin", "disj"],
+ ["builtin", "not"],
+ ["builtin", "mempty"],
+ ["builtin", "compare"],
+ ["builtin", "min"],
+ ["builtin", "max"],
+ ["builtin", "comparing"],
+ ["builtin", "clamp"],
+ ["builtin", "between"],
+ ["builtin", "sub"],
+ ["builtin", "negate"],
+ ["builtin", "append"],
+ ["builtin", "add"],
+ ["builtin", "zero"],
+ ["builtin", "mul"],
+ ["builtin", "one"],
+ ["builtin", "show"],
+ ["builtin", "unit"],
+ ["builtin", "absurd"]
+]
+
+----------------------------------------------------
+
+Checks for all builtin.
diff --git a/package/src/prism/tests/languages/purescript/char_feature.test b/package/src/prism/tests/languages/purescript/char_feature.test
new file mode 100644
index 00000000..bb04120c
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/char_feature.test
@@ -0,0 +1,17 @@
+'a'
+'\n'
+'\23'
+'\xFE'
+
+----------------------------------------------------
+
+[
+ ["char", "'a'"],
+ ["char", "'\\n'"],
+ ["char", "'\\23'"],
+ ["char", "'\\xFE'"]
+]
+
+----------------------------------------------------
+
+Checks for chars.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purescript/comment_feature.test b/package/src/prism/tests/languages/purescript/comment_feature.test
new file mode 100644
index 00000000..2f824f42
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/comment_feature.test
@@ -0,0 +1,14 @@
+-- foo
+{- foo
+bar -}
+
+----------------------------------------------------
+
+[
+ ["comment", "-- foo"],
+ ["comment", "{- foo\nbar -}"]
+]
+
+----------------------------------------------------
+
+Checks for single-line and multi-line comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purescript/constant_feature.test b/package/src/prism/tests/languages/purescript/constant_feature.test
new file mode 100644
index 00000000..5399b196
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/constant_feature.test
@@ -0,0 +1,23 @@
+Foo
+Foo.Bar
+Baz.Foobar_42
+
+----------------------------------------------------
+
+[
+ ["constant", ["Foo"]],
+ ["constant", [
+ "Foo",
+ ["punctuation", "."],
+ "Bar"
+ ]],
+ ["constant", [
+ "Baz",
+ ["punctuation", "."],
+ "Foobar_42"
+ ]]
+]
+
+----------------------------------------------------
+
+Checks for constants.
diff --git a/package/src/prism/tests/languages/purescript/hvariable_feature.test b/package/src/prism/tests/languages/purescript/hvariable_feature.test
new file mode 100644
index 00000000..3a2a2e54
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/hvariable_feature.test
@@ -0,0 +1,23 @@
+foo
+Foo.bar
+Baz.foobar_42
+
+----------------------------------------------------
+
+[
+ ["hvariable", ["foo"]],
+ ["hvariable", [
+ "Foo",
+ ["punctuation", "."],
+ "bar"
+ ]],
+ ["hvariable", [
+ "Baz",
+ ["punctuation", "."],
+ "foobar_42"
+ ]]
+]
+
+----------------------------------------------------
+
+Checks for hvariables.
diff --git a/package/src/prism/tests/languages/purescript/import_statement_feature.test b/package/src/prism/tests/languages/purescript/import_statement_feature.test
new file mode 100644
index 00000000..ad5c9bb2
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/import_statement_feature.test
@@ -0,0 +1,48 @@
+import Foo
+import Foo_42.Bar as Foobar
+import Foo.Bar as Foo.Baz hiding
+import Foo.Bar (test)
+
+----------------------------------------------------
+
+[
+ ["import-statement", [
+ ["keyword", "import"],
+ " Foo"
+ ]],
+
+ ["import-statement", [
+ ["keyword", "import"],
+ " Foo_42",
+ ["punctuation", "."],
+ "Bar ",
+ ["keyword", "as"],
+ " Foobar"
+ ]],
+
+ ["import-statement", [
+ ["keyword", "import"],
+ " Foo",
+ ["punctuation", "."],
+ "Bar ",
+ ["keyword", "as"],
+ " Foo",
+ ["punctuation", "."],
+ "Baz ",
+ ["keyword", "hiding"]
+ ]],
+
+ ["import-statement", [
+ ["keyword", "import"],
+ " Foo",
+ ["punctuation", "."],
+ "Bar"
+ ]],
+ ["punctuation", "("],
+ ["hvariable", ["test"]],
+ ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for import statement.
diff --git a/package/src/prism/tests/languages/purescript/issue3006.test b/package/src/prism/tests/languages/purescript/issue3006.test
new file mode 100644
index 00000000..bf8dfbe3
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/issue3006.test
@@ -0,0 +1,161 @@
+readBooleanOrIntAsBoolean ∷ Foreign → Foreign.F Boolean
+readBooleanOrIntAsBoolean value =
+ Foreign.readBoolean value
+ <|> (toBool =<< Foreign.readInt value)
+ where
+ toBool ∷ Int → Foreign.F Boolean
+ toBool = case _ of
+ 0 → pure false
+ 1 → pure true
+ int → Foreign.fail (Foreign.ForeignError ("Invalid integer: " <> show int))
+
+isSuccessResponse ∷ ∀ a. AX.Response a → Boolean
+isSuccessResponse { status } = status >= (StatusCode 200) && status < (StatusCode 400)
+
+infix 4 eq as ≡
+
+isMempty ∷ ∀ m. Monoid m → Boolean
+isMempty = _ ≡ mempty
+
+----------------------------------------------------
+
+[
+ ["hvariable", ["readBooleanOrIntAsBoolean"]],
+ ["operator", "∷"],
+ ["constant", ["Foreign"]],
+ ["operator", "→"],
+ ["constant", [
+ "Foreign",
+ ["punctuation", "."],
+ "F"
+ ]],
+ ["constant", ["Boolean"]],
+
+ ["hvariable", ["readBooleanOrIntAsBoolean"]],
+ ["hvariable", ["value"]],
+ ["operator", "="],
+
+ ["hvariable", [
+ "Foreign",
+ ["punctuation", "."],
+ "readBoolean"
+ ]],
+ ["hvariable", ["value"]],
+
+ ["operator", "<|>"],
+ ["punctuation", "("],
+ ["hvariable", ["toBool"]],
+ ["operator", "=<<"],
+ ["hvariable", [
+ "Foreign",
+ ["punctuation", "."],
+ "readInt"
+ ]],
+ ["hvariable", ["value"]],
+ ["punctuation", ")"],
+
+ ["keyword", "where"],
+
+ ["hvariable", ["toBool"]],
+ ["operator", "∷"],
+ ["constant", ["Int"]],
+ ["operator", "→"],
+ ["constant", [
+ "Foreign",
+ ["punctuation", "."],
+ "F"
+ ]],
+ ["constant", ["Boolean"]],
+
+ ["hvariable", ["toBool"]],
+ ["operator", "="],
+ ["keyword", "case"],
+ ["hvariable", ["_"]],
+ ["keyword", "of"],
+
+ ["number", "0"],
+ ["operator", "→"],
+ ["hvariable", ["pure"]],
+ ["hvariable", ["false"]],
+
+ ["number", "1"],
+ ["operator", "→"],
+ ["hvariable", ["pure"]],
+ ["hvariable", ["true"]],
+
+ ["hvariable", ["int"]],
+ ["operator", "→"],
+ ["hvariable", [
+ "Foreign",
+ ["punctuation", "."],
+ "fail"
+ ]],
+ ["punctuation", "("],
+ ["constant", [
+ "Foreign",
+ ["punctuation", "."],
+ "ForeignError"
+ ]],
+ ["punctuation", "("],
+ ["string", "\"Invalid integer: \""],
+ ["operator", "<>"],
+ ["builtin", "show"],
+ ["hvariable", ["int"]],
+ ["punctuation", ")"],
+ ["punctuation", ")"],
+
+ ["hvariable", ["isSuccessResponse"]],
+ ["operator", "∷"],
+ ["keyword", "∀"],
+ ["hvariable", ["a"]],
+ ["punctuation", "."],
+ ["constant", [
+ "AX",
+ ["punctuation", "."],
+ "Response"
+ ]],
+ ["hvariable", ["a"]],
+ ["operator", "→"],
+ ["constant", ["Boolean"]],
+
+ ["hvariable", ["isSuccessResponse"]],
+ ["punctuation", "{"],
+ ["hvariable", ["status"]],
+ ["punctuation", "}"],
+ ["operator", "="],
+ ["hvariable", ["status"]],
+ ["operator", ">="],
+ ["punctuation", "("],
+ ["constant", ["StatusCode"]],
+ ["number", "200"],
+ ["punctuation", ")"],
+ ["operator", "&&"],
+ ["hvariable", ["status"]],
+ ["operator", "<"],
+ ["punctuation", "("],
+ ["constant", ["StatusCode"]],
+ ["number", "400"],
+ ["punctuation", ")"],
+
+ ["hvariable", ["infix"]],
+ ["number", "4"],
+ ["builtin", "eq"],
+ ["hvariable", ["as"]],
+ ["operator", "≡"],
+
+ ["hvariable", ["isMempty"]],
+ ["operator", "∷"],
+ ["keyword", "∀"],
+ ["hvariable", ["m"]],
+ ["punctuation", "."],
+ ["constant", ["Monoid"]],
+ ["hvariable", ["m"]],
+ ["operator", "→"],
+ ["constant", ["Boolean"]],
+
+ ["hvariable", ["isMempty"]],
+ ["operator", "="],
+ ["hvariable", ["_"]],
+ ["operator", "≡"],
+ ["builtin", "mempty"]
+]
diff --git a/package/src/prism/tests/languages/purescript/keyword_feature.test b/package/src/prism/tests/languages/purescript/keyword_feature.test
new file mode 100644
index 00000000..f368008f
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/keyword_feature.test
@@ -0,0 +1,53 @@
+ado
+case
+class
+data
+derive
+do
+else
+forall
+if
+in
+infixl
+infixr
+instance
+let
+module
+newtype
+of
+primitive
+then
+type
+where
+∀
+
+----------------------------------------------------
+
+[
+ ["keyword", "ado"],
+ ["keyword", "case"],
+ ["keyword", "class"],
+ ["keyword", "data"],
+ ["keyword", "derive"],
+ ["keyword", "do"],
+ ["keyword", "else"],
+ ["keyword", "forall"],
+ ["keyword", "if"],
+ ["keyword", "in"],
+ ["keyword", "infixl"],
+ ["keyword", "infixr"],
+ ["keyword", "instance"],
+ ["keyword", "let"],
+ ["keyword", "module"],
+ ["keyword", "newtype"],
+ ["keyword", "of"],
+ ["keyword", "primitive"],
+ ["keyword", "then"],
+ ["keyword", "type"],
+ ["keyword", "where"],
+ ["keyword", "∀"]
+]
+
+----------------------------------------------------
+
+Checks for all keywords.
diff --git a/package/src/prism/tests/languages/purescript/number_feature.test b/package/src/prism/tests/languages/purescript/number_feature.test
new file mode 100644
index 00000000..e5e602d3
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/number_feature.test
@@ -0,0 +1,23 @@
+42
+3.14159
+2E3
+1.2e-4
+0.9e+1
+0o47
+0xBadFace
+
+----------------------------------------------------
+
+[
+ ["number", "42"],
+ ["number", "3.14159"],
+ ["number", "2E3"],
+ ["number", "1.2e-4"],
+ ["number", "0.9e+1"],
+ ["number", "0o47"],
+ ["number", "0xBadFace"]
+]
+
+----------------------------------------------------
+
+Checks for decimal, octal and hexadecimal numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/purescript/operator_feature.test b/package/src/prism/tests/languages/purescript/operator_feature.test
new file mode 100644
index 00000000..ef1a1352
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/operator_feature.test
@@ -0,0 +1,100 @@
+..
+reverse <<< sort
+`foo`
+`Foo.bar`
++ - * /
+^ ^^ **
+&& ||
+< <= == /=
+>= > \ |
+++ : !!
+\\ <- ->
+= :: =>
+>> >>= >@>
+~ ! @
+
+∷
+→ ←
+⇒ ⇐
+∘
+
+∘ × ÷ ≡ ≠ ⫽ ⩓ ⩔ ∧ ∨ ↝ ⨁ ⊹
+
+----------------------------------------------------
+
+[
+ ["operator", ".."],
+
+ ["hvariable", ["reverse"]],
+ ["operator", "<<<"],
+ ["hvariable", ["sort"]],
+
+ ["operator", "`foo`"],
+
+ ["operator", "`Foo.bar`"],
+
+ ["operator", "+"],
+ ["operator", "-"],
+ ["operator", "*"],
+ ["operator", "/"],
+
+ ["operator", "^"],
+ ["operator", "^^"],
+ ["operator", "**"],
+
+ ["operator", "&&"],
+ ["operator", "||"],
+
+ ["operator", "<"],
+ ["operator", "<="],
+ ["operator", "=="],
+ ["operator", "/="],
+
+ ["operator", ">="],
+ ["operator", ">"],
+ ["operator", "\\"],
+ ["operator", "|"],
+
+ ["operator", "++"],
+ ["operator", ":"],
+ ["operator", "!!"],
+
+ ["operator", "\\\\"],
+ ["operator", "<-"],
+ ["operator", "->"],
+
+ ["operator", "="],
+ ["operator", "::"],
+ ["operator", "=>"],
+
+ ["operator", ">>"],
+ ["operator", ">>="],
+ ["operator", ">@>"],
+
+ ["operator", "~"],
+ ["operator", "!"],
+ ["operator", "@"],
+
+ ["operator", "∷"],
+ ["operator", "→"], ["operator", "←"],
+ ["operator", "⇒"], ["operator", "⇐"],
+ ["operator", "∘"],
+
+ ["operator", "∘"],
+ ["operator", "×"],
+ ["operator", "÷"],
+ ["operator", "≡"],
+ ["operator", "≠"],
+ ["operator", "⫽"],
+ ["operator", "⩓"],
+ ["operator", "⩔"],
+ ["operator", "∧"],
+ ["operator", "∨"],
+ ["operator", "↝"],
+ ["operator", "⨁"],
+ ["operator", "⊹"]
+]
+
+----------------------------------------------------
+
+Checks for operators.
diff --git a/package/src/prism/tests/languages/purescript/string_feature.test b/package/src/prism/tests/languages/purescript/string_feature.test
new file mode 100644
index 00000000..14971cf3
--- /dev/null
+++ b/package/src/prism/tests/languages/purescript/string_feature.test
@@ -0,0 +1,19 @@
+""
+"fo\"o"
+"foo \
+ \ bar"
+"foo -- comment lookalike \
+ \ bar"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"fo\\\"o\""],
+ ["string", "\"foo \\\n \\ bar\""],
+ ["string", "\"foo -- comment lookalike \\\n \\ bar\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
diff --git a/package/src/prism/tests/languages/python/boolean_feature.test b/package/src/prism/tests/languages/python/boolean_feature.test
new file mode 100644
index 00000000..a3f2d03c
--- /dev/null
+++ b/package/src/prism/tests/languages/python/boolean_feature.test
@@ -0,0 +1,15 @@
+True
+False
+None
+
+----------------------------------------------------
+
+[
+ ["boolean", "True"],
+ ["boolean", "False"],
+ ["boolean", "None"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/builtin_feature.test b/package/src/prism/tests/languages/python/builtin_feature.test
new file mode 100644
index 00000000..df2f77e4
--- /dev/null
+++ b/package/src/prism/tests/languages/python/builtin_feature.test
@@ -0,0 +1,56 @@
+abs all any apply
+ascii basestring bin bool
+buffer bytearray bytes callable
+chr classmethod cmp coerce
+compile complex delattr
+dict dir divmod enumerate
+eval execfile file
+filter float format frozenset
+getattr globals hasattr hash
+help hex id input
+int intern isinstance issubclass
+iter len list locals
+long map max memoryview
+min next object oct
+open ord pow property
+range raw_input reduce reload
+repr reversed round set
+setattr slice sorted staticmethod
+str sum super tuple
+type unichr unicode vars
+xrange()
+zip(
+__import__
+
+
+----------------------------------------------------
+
+[
+ ["builtin", "abs"], ["builtin", "all"], ["builtin", "any"], ["builtin", "apply"],
+ ["builtin", "ascii"], ["builtin", "basestring"], ["builtin", "bin"], ["builtin", "bool"],
+ ["builtin", "buffer"], ["builtin", "bytearray"], ["builtin", "bytes"], ["builtin", "callable"],
+ ["builtin", "chr"], ["builtin", "classmethod"], ["builtin", "cmp"], ["builtin", "coerce"],
+ ["builtin", "compile"], ["builtin", "complex"], ["builtin", "delattr"],
+ ["builtin", "dict"], ["builtin", "dir"], ["builtin", "divmod"], ["builtin", "enumerate"],
+ ["builtin", "eval"], ["builtin", "execfile"], ["builtin", "file"],
+ ["builtin", "filter"], ["builtin", "float"], ["builtin", "format"], ["builtin", "frozenset"],
+ ["builtin", "getattr"], ["builtin", "globals"], ["builtin", "hasattr"], ["builtin", "hash"],
+ ["builtin", "help"], ["builtin", "hex"], ["builtin", "id"], ["builtin", "input"],
+ ["builtin", "int"], ["builtin", "intern"], ["builtin", "isinstance"], ["builtin", "issubclass"],
+ ["builtin", "iter"], ["builtin", "len"], ["builtin", "list"], ["builtin", "locals"],
+ ["builtin", "long"], ["builtin", "map"], ["builtin", "max"], ["builtin", "memoryview"],
+ ["builtin", "min"], ["builtin", "next"], ["builtin", "object"], ["builtin", "oct"],
+ ["builtin", "open"], ["builtin", "ord"], ["builtin", "pow"], ["builtin", "property"],
+ ["builtin", "range"], ["builtin", "raw_input"], ["builtin", "reduce"], ["builtin", "reload"],
+ ["builtin", "repr"], ["builtin", "reversed"], ["builtin", "round"], ["builtin", "set"],
+ ["builtin", "setattr"], ["builtin", "slice"], ["builtin", "sorted"], ["builtin", "staticmethod"],
+ ["builtin", "str"], ["builtin", "sum"], ["builtin", "super"], ["builtin", "tuple"],
+ ["builtin", "type"], ["builtin", "unichr"], ["builtin", "unicode"], ["builtin", "vars"],
+ ["builtin", "xrange"], ["punctuation", "("], ["punctuation", ")"],
+ ["builtin", "zip"], ["punctuation", "("],
+ ["builtin", "__import__"]
+]
+
+----------------------------------------------------
+
+Checks for all builtins.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/class-name_feature.test b/package/src/prism/tests/languages/python/class-name_feature.test
new file mode 100644
index 00000000..5e6dd068
--- /dev/null
+++ b/package/src/prism/tests/languages/python/class-name_feature.test
@@ -0,0 +1,15 @@
+class Foo
+class foobar_42
+class _
+
+----------------------------------------------------
+
+[
+ ["keyword", "class"], ["class-name", "Foo"],
+ ["keyword", "class"], ["class-name", "foobar_42"],
+ ["keyword", "class"], ["class-name", "_"]
+]
+
+----------------------------------------------------
+
+Checks for class names.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/comment_feature.test b/package/src/prism/tests/languages/python/comment_feature.test
new file mode 100644
index 00000000..710014b8
--- /dev/null
+++ b/package/src/prism/tests/languages/python/comment_feature.test
@@ -0,0 +1,13 @@
+#
+# foobar
+
+----------------------------------------------------
+
+[
+ ["comment", "#"],
+ ["comment", "# foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/decorator_feature.test b/package/src/prism/tests/languages/python/decorator_feature.test
new file mode 100644
index 00000000..4ea22c35
--- /dev/null
+++ b/package/src/prism/tests/languages/python/decorator_feature.test
@@ -0,0 +1,57 @@
+@some.decorator(foobar)
+def foo(bar):
+ pass
+
+@decorator
+def foo(bar):
+ pass
+
+@decorator
+def foo(bar):
+ pass
+
+----------------------------------------------------
+
+[
+ ["decorator", [
+ "@some",
+ ["punctuation", "."],
+ "decorator"
+ ]],
+ ["punctuation", "("],
+ "foobar",
+ ["punctuation", ")"],
+ ["keyword", "def"],
+ ["function", "foo"],
+ ["punctuation", "("],
+ "bar",
+ ["punctuation", ")"],
+ ["punctuation", ":"],
+ ["keyword", "pass"],
+
+ ["decorator", [
+ "@decorator"
+ ]],
+ ["keyword", "def"],
+ ["function", "foo"],
+ ["punctuation", "("],
+ "bar",
+ ["punctuation", ")"],
+ ["punctuation", ":"],
+ ["keyword", "pass"],
+
+ ["decorator", [
+ "@decorator"
+ ]],
+ ["keyword", "def"],
+ ["function", "foo"],
+ ["punctuation", "("],
+ "bar",
+ ["punctuation", ")"],
+ ["punctuation", ":"],
+ ["keyword", "pass"]
+]
+
+----------------------------------------------------
+
+Checks for decorators.
diff --git a/package/src/prism/tests/languages/python/function_feature.test b/package/src/prism/tests/languages/python/function_feature.test
new file mode 100644
index 00000000..547c8cab
--- /dev/null
+++ b/package/src/prism/tests/languages/python/function_feature.test
@@ -0,0 +1,17 @@
+def Foo(
+def foo_bar_42(
+def _(
+def foo_ ()
+
+----------------------------------------------------
+
+[
+ ["keyword", "def"], ["function", "Foo"], ["punctuation", "("],
+ ["keyword", "def"], ["function", "foo_bar_42"], ["punctuation", "("],
+ ["keyword", "def"], ["function", "_"], ["punctuation", "("],
+ ["keyword", "def"], ["function", "foo_"], ["punctuation", "("], ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/issue1355.test b/package/src/prism/tests/languages/python/issue1355.test
new file mode 100644
index 00000000..35b9f983
--- /dev/null
+++ b/package/src/prism/tests/languages/python/issue1355.test
@@ -0,0 +1,24 @@
+print('""#')
+print('"trigger="#T'+str(3))
+
+----------------------------------------------------
+
+[
+ ["keyword", "print"],
+ ["punctuation", "("],
+ ["string", "'\"\"#'"],
+ ["punctuation", ")"],
+ ["keyword", "print"],
+ ["punctuation", "("],
+ ["string", "'\"trigger=\"#T'"],
+ ["operator", "+"],
+ ["builtin", "str"],
+ ["punctuation", "("],
+ ["number", "3"],
+ ["punctuation", ")"],
+ ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for comment-like substrings. See #1355
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/keyword_feature.test b/package/src/prism/tests/languages/python/keyword_feature.test
new file mode 100644
index 00000000..7b415f7d
--- /dev/null
+++ b/package/src/prism/tests/languages/python/keyword_feature.test
@@ -0,0 +1,33 @@
+as assert async await
+break class;
+continue def;
+del elif else
+except exec finally
+for from global if
+import in is lambda
+pass print raise return
+try while with yield
+nonlocal
+and not or
+match case _:
+
+----------------------------------------------------
+
+[
+ ["keyword", "as"], ["keyword", "assert"], ["keyword", "async"], ["keyword", "await"],
+ ["keyword", "break"], ["keyword", "class"], ["punctuation", ";"],
+ ["keyword", "continue"], ["keyword", "def"], ["punctuation", ";"],
+ ["keyword", "del"], ["keyword", "elif"], ["keyword", "else"],
+ ["keyword", "except"], ["keyword", "exec"], ["keyword", "finally"],
+ ["keyword", "for"], ["keyword", "from"], ["keyword", "global"], ["keyword", "if"],
+ ["keyword", "import"], ["keyword", "in"], ["keyword", "is"], ["keyword", "lambda"],
+ ["keyword", "pass"], ["keyword", "print"], ["keyword", "raise"], ["keyword", "return"],
+ ["keyword", "try"], ["keyword", "while"], ["keyword", "with"], ["keyword", "yield"],
+ ["keyword", "nonlocal"],
+ ["keyword", "and"], ["keyword", "not"], ["keyword", "or"],
+ ["keyword", "match"], ["keyword", "case"], ["keyword", "_"], ["punctuation", ":"]
+]
+
+----------------------------------------------------
+
+Checks for all keywords.
diff --git a/package/src/prism/tests/languages/python/number_feature.test b/package/src/prism/tests/languages/python/number_feature.test
new file mode 100644
index 00000000..921cdbe0
--- /dev/null
+++ b/package/src/prism/tests/languages/python/number_feature.test
@@ -0,0 +1,45 @@
+0b0001
+0o754
+0xBadFace
+42
+3.14159
+10.
+2.1E10
+0.3e-7
+4.8e+1
+42j
+0b_0001
+0b0_001
+0o_754
+0o7_540
+0x_BadFace
+0xBad_Face
+4_200
+4_200j
+
+----------------------------------------------------
+
+[
+ ["number", "0b0001"],
+ ["number", "0o754"],
+ ["number", "0xBadFace"],
+ ["number", "42"],
+ ["number", "3.14159"],
+ ["number", "10."],
+ ["number", "2.1E10"],
+ ["number", "0.3e-7"],
+ ["number", "4.8e+1"],
+ ["number", "42j"],
+ ["number", "0b_0001"],
+ ["number", "0b0_001"],
+ ["number", "0o_754"],
+ ["number", "0o7_540"],
+ ["number", "0x_BadFace"],
+ ["number", "0xBad_Face"],
+ ["number", "4_200"],
+ ["number", "4_200j"]
+]
+
+----------------------------------------------------
+
+Checks for hexadecimal, octal, binary and decimal numbers.
diff --git a/package/src/prism/tests/languages/python/operator_feature.test b/package/src/prism/tests/languages/python/operator_feature.test
new file mode 100644
index 00000000..58ae6cbc
--- /dev/null
+++ b/package/src/prism/tests/languages/python/operator_feature.test
@@ -0,0 +1,31 @@
++ +=
+- -=
+* ** *= **=
+/ /= // //=
+% %=
+< <= <> <<
+> >= >>
+= ==
+!=
+:=
+& | ^ ~
+
+----------------------------------------------------
+
+[
+ ["operator", "+"], ["operator", "+="],
+ ["operator", "-"], ["operator", "-="],
+ ["operator", "*"], ["operator", "**"], ["operator", "*="], ["operator", "**="],
+ ["operator", "/"], ["operator", "/="], ["operator", "//"], ["operator", "//="],
+ ["operator", "%"], ["operator", "%="],
+ ["operator", "<"], ["operator", "<="], ["operator", "<>"], ["operator", "<<"],
+ ["operator", ">"], ["operator", ">="], ["operator", ">>"],
+ ["operator", "="], ["operator", "=="],
+ ["operator", "!="],
+ ["operator", ":="],
+ ["operator", "&"], ["operator", "|"], ["operator", "^"], ["operator", "~"]
+]
+
+----------------------------------------------------
+
+Checks for all operators.
diff --git a/package/src/prism/tests/languages/python/string-interpolation_feature.test b/package/src/prism/tests/languages/python/string-interpolation_feature.test
new file mode 100644
index 00000000..3c96801f
--- /dev/null
+++ b/package/src/prism/tests/languages/python/string-interpolation_feature.test
@@ -0,0 +1,147 @@
+f'The value is {value}.'
+
+f"The value is {'4'}."
+
+f'input={value!s:#06x}'
+
+f'{{{4*10}}}'
+
+fr'x={4*10}\n'
+
+f'''{x
++1}'''
+
+f'mapping is { {a:b for (a, b) in ((1, 2), (3, 4))} }'
+
+f'{(lambda x: x*2)(3)}'
+
+----------------------------------------------------
+
+[
+ ["string-interpolation", [
+ ["string", "f'The value is "],
+ ["interpolation", [
+ ["punctuation", "{"],
+ "value",
+ ["punctuation", "}"]
+ ]],
+ ["string", ".'"]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "f\"The value is "],
+ ["interpolation", [
+ ["punctuation", "{"],
+ ["string", "'4'"],
+ ["punctuation", "}"]
+ ]],
+ ["string", ".\""]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "f'input="],
+ ["interpolation", [
+ ["punctuation", "{"],
+ "value",
+ ["conversion-option", "!s"],
+ ["punctuation", ":"],
+ ["format-spec", "#06x"],
+ ["punctuation", "}"]
+ ]],
+ ["string", "'"]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "f'{{"],
+ ["interpolation", [
+ ["punctuation", "{"],
+ ["number", "4"],
+ ["operator", "*"],
+ ["number", "10"],
+ ["punctuation", "}"]
+ ]],
+ ["string", "}}'"]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "fr'x="],
+ ["interpolation", [
+ ["punctuation", "{"],
+ ["number", "4"],
+ ["operator", "*"],
+ ["number", "10"],
+ ["punctuation", "}"]
+ ]],
+ ["string", "\\n'"]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "f'''"],
+ ["interpolation", [
+ ["punctuation", "{"],
+ "x\n",
+ ["operator", "+"],
+ ["number", "1"],
+ ["punctuation", "}"]
+ ]],
+ ["string", "'''"]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "f'mapping is "],
+ ["interpolation", [
+ ["punctuation", "{"],
+ ["punctuation", "{"],
+ "a",
+ ["punctuation", ":"],
+ "b ",
+ ["keyword", "for"],
+ ["punctuation", "("],
+ "a",
+ ["punctuation", ","],
+ " b",
+ ["punctuation", ")"],
+ ["keyword", "in"],
+ ["punctuation", "("],
+ ["punctuation", "("],
+ ["number", "1"],
+ ["punctuation", ","],
+ ["number", "2"],
+ ["punctuation", ")"],
+ ["punctuation", ","],
+ ["punctuation", "("],
+ ["number", "3"],
+ ["punctuation", ","],
+ ["number", "4"],
+ ["punctuation", ")"],
+ ["punctuation", ")"],
+ ["punctuation", "}"],
+ ["punctuation", "}"]
+ ]],
+ ["string", "'"]
+ ]],
+
+ ["string-interpolation", [
+ ["string", "f'"],
+ ["interpolation", [
+ ["punctuation", "{"],
+ ["punctuation", "("],
+ ["keyword", "lambda"],
+ " x",
+ ["punctuation", ":"],
+ " x",
+ ["operator", "*"],
+ ["number", "2"],
+ ["punctuation", ")"],
+ ["punctuation", "("],
+ ["number", "3"],
+ ["punctuation", ")"],
+ ["punctuation", "}"]
+ ]],
+ ["string", "'"]
+ ]]
+]
+
+----------------------------------------------------
+
+Checks for string interpolation.
diff --git a/package/src/prism/tests/languages/python/string_feature.test b/package/src/prism/tests/languages/python/string_feature.test
new file mode 100644
index 00000000..e9fea6d2
--- /dev/null
+++ b/package/src/prism/tests/languages/python/string_feature.test
@@ -0,0 +1,29 @@
+""
+"fo\"obar"
+''
+'fo\'obar'
+"fo\" # comment obar"
+
+r"\n"
+b'foo'
+rb"foo\n"
+u"foo"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"fo\\\"obar\""],
+ ["string", "''"],
+ ["string", "'fo\\'obar'"],
+ ["string", "\"fo\\\" # comment obar\""],
+
+ ["string", "r\"\\n\""],
+ ["string", "b'foo'"],
+ ["string", "rb\"foo\\n\""],
+ ["string", "u\"foo\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/python/triple-quoted-string_feature.test b/package/src/prism/tests/languages/python/triple-quoted-string_feature.test
new file mode 100644
index 00000000..692a45b6
--- /dev/null
+++ b/package/src/prism/tests/languages/python/triple-quoted-string_feature.test
@@ -0,0 +1,25 @@
+""""""
+"""foobar"""
+"""fo"o
+#bar
+baz"""
+''''''
+'''foobar'''
+'''fo'o
+#bar
+baz'''
+
+----------------------------------------------------
+
+[
+ ["triple-quoted-string", "\"\"\"\"\"\""],
+ ["triple-quoted-string", "\"\"\"foobar\"\"\""],
+ ["triple-quoted-string", "\"\"\"fo\"o\n#bar\nbaz\"\"\""],
+ ["triple-quoted-string", "''''''"],
+ ["triple-quoted-string", "'''foobar'''"],
+ ["triple-quoted-string", "'''fo'o\n#bar\nbaz'''"]
+]
+
+----------------------------------------------------
+
+Checks for triple-quoted strings.
diff --git a/package/src/prism/tests/languages/q/adverb_feature.test b/package/src/prism/tests/languages/q/adverb_feature.test
new file mode 100644
index 00000000..9cb2ba70
--- /dev/null
+++ b/package/src/prism/tests/languages/q/adverb_feature.test
@@ -0,0 +1,17 @@
+' ':
++/ +/:
+\ \:
+each
+
+----------------------------------------------------
+
+[
+ ["adverb", "'"], ["adverb", "':"],
+ ["verb", "+"], ["adverb", "/"], ["verb", "+"], ["adverb", "/:"],
+ ["adverb", "\\"], ["adverb", "\\:"],
+ ["adverb", "each"]
+]
+
+----------------------------------------------------
+
+Checks for adverbs.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/q/comment_feature.test b/package/src/prism/tests/languages/q/comment_feature.test
new file mode 100644
index 00000000..eb5ebb26
--- /dev/null
+++ b/package/src/prism/tests/languages/q/comment_feature.test
@@ -0,0 +1,30 @@
+#!/usr/bin/env q
+/ Foobar "baz"
+
+/
+Foo
+bar "baz"
+\
+
+`john / an atom of type symbol
+
+\
+Foo
+Bar "baz"
+
+----------------------------------------------------
+
+[
+ ["comment", "#!/usr/bin/env q"],
+ ["comment", "/ Foobar \"baz\""],
+
+ ["comment", "/\nFoo\nbar \"baz\"\n\\"],
+
+ ["symbol", "`john"], ["comment", "/ an atom of type symbol"],
+
+ ["comment", "\\\nFoo\nBar \"baz\""]
+]
+
+----------------------------------------------------
+
+Checks for comments.
diff --git a/package/src/prism/tests/languages/q/datetime_feature.test b/package/src/prism/tests/languages/q/datetime_feature.test
new file mode 100644
index 00000000..5fc209a5
--- /dev/null
+++ b/package/src/prism/tests/languages/q/datetime_feature.test
@@ -0,0 +1,39 @@
+0Nm 0Nd 0Nz 0Nu 0Nv 0Nt
+0Wd 0Wt 0Wz
+
+2015.09m
+2015.09.08
+2015.09.08d
+2015.09.08z
+2015.09.08T08:25:32
+2015.09.08T08:25:32.000
+08:25
+08:25u
+08:25v
+08:25t
+08:25:32
+08:25:32:000
+
+----------------------------------------------------
+
+[
+ ["datetime", "0Nm"], ["datetime", "0Nd"], ["datetime", "0Nz"], ["datetime", "0Nu"], ["datetime", "0Nv"], ["datetime", "0Nt"],
+ ["datetime", "0Wd"], ["datetime", "0Wt"], ["datetime", "0Wz"],
+
+ ["datetime", "2015.09m"],
+ ["datetime", "2015.09.08"],
+ ["datetime", "2015.09.08d"],
+ ["datetime", "2015.09.08z"],
+ ["datetime", "2015.09.08T08:25:32"],
+ ["datetime", "2015.09.08T08:25:32.000"],
+ ["datetime", "08:25"],
+ ["datetime", "08:25u"],
+ ["datetime", "08:25v"],
+ ["datetime", "08:25t"],
+ ["datetime", "08:25:32"],
+ ["datetime", "08:25:32:000"]
+]
+
+----------------------------------------------------
+
+Checks for dates, times and datetimes.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/q/keyword_feature.test b/package/src/prism/tests/languages/q/keyword_feature.test
new file mode 100644
index 00000000..3d0fa599
--- /dev/null
+++ b/package/src/prism/tests/languages/q/keyword_feature.test
@@ -0,0 +1,371 @@
+\foo
+\foo_bar_42
+
+abs
+acos
+aj
+aj0
+all
+and
+any
+asc
+asin
+asof
+atan
+attr
+avg
+avgs
+bin
+binr
+by
+ceiling
+cols
+cor
+cos
+count
+cov
+cross
+csv
+cut
+delete
+deltas
+desc
+dev
+differ
+distinct
+div
+do
+dsave
+ej
+enlist
+eval
+except
+exec
+exit
+exp
+fby
+fills
+first
+fkeys
+flip
+floor
+from
+get
+getenv
+group
+gtime
+hclose
+hcount
+hdel
+hopen
+hsym
+iasc
+identity
+idesc
+if
+ij
+in
+insert
+inter
+inv
+key
+keys
+last
+like
+list
+lj
+ljf
+load
+log
+lower
+lsq
+ltime
+ltrim
+mavg
+max
+maxs
+mcount
+md5
+mdev
+med
+meta
+min
+mins
+mmax
+mmin
+mmu
+mod
+msum
+neg
+next
+not
+null
+or
+over
+parse
+peach
+pj
+plist
+prd
+prds
+prev
+prior
+rand
+rank
+ratios
+raze
+read0
+read1
+reciprocal
+reval
+reverse
+rload
+rotate
+rsave
+rtrim
+save
+scan
+scov
+sdev
+select
+set
+setenv
+show
+signum
+sin
+sqrt
+ss
+ssr
+string
+sublist
+sum
+sums
+sv
+svar
+system
+tables
+tan
+til
+trim
+txf
+type
+uj
+ungroup
+union
+update
+upper
+upsert
+value
+var
+view
+views
+vs
+wavg
+where
+while
+within
+wj
+wj1
+wsum
+ww
+xasc
+xbar
+xcol
+xcols
+xdesc
+xexp
+xgroup
+xkey
+xlog
+xprev
+xrank
+
+----------------------------------------------------
+
+[
+ ["keyword", "\\foo"],
+ ["keyword", "\\foo_bar_42"],
+
+ ["keyword", "abs"],
+ ["keyword", "acos"],
+ ["keyword", "aj"],
+ ["keyword", "aj0"],
+ ["keyword", "all"],
+ ["keyword", "and"],
+ ["keyword", "any"],
+ ["keyword", "asc"],
+ ["keyword", "asin"],
+ ["keyword", "asof"],
+ ["keyword", "atan"],
+ ["keyword", "attr"],
+ ["keyword", "avg"],
+ ["keyword", "avgs"],
+ ["keyword", "bin"],
+ ["keyword", "binr"],
+ ["keyword", "by"],
+ ["keyword", "ceiling"],
+ ["keyword", "cols"],
+ ["keyword", "cor"],
+ ["keyword", "cos"],
+ ["keyword", "count"],
+ ["keyword", "cov"],
+ ["keyword", "cross"],
+ ["keyword", "csv"],
+ ["keyword", "cut"],
+ ["keyword", "delete"],
+ ["keyword", "deltas"],
+ ["keyword", "desc"],
+ ["keyword", "dev"],
+ ["keyword", "differ"],
+ ["keyword", "distinct"],
+ ["keyword", "div"],
+ ["keyword", "do"],
+ ["keyword", "dsave"],
+ ["keyword", "ej"],
+ ["keyword", "enlist"],
+ ["keyword", "eval"],
+ ["keyword", "except"],
+ ["keyword", "exec"],
+ ["keyword", "exit"],
+ ["keyword", "exp"],
+ ["keyword", "fby"],
+ ["keyword", "fills"],
+ ["keyword", "first"],
+ ["keyword", "fkeys"],
+ ["keyword", "flip"],
+ ["keyword", "floor"],
+ ["keyword", "from"],
+ ["keyword", "get"],
+ ["keyword", "getenv"],
+ ["keyword", "group"],
+ ["keyword", "gtime"],
+ ["keyword", "hclose"],
+ ["keyword", "hcount"],
+ ["keyword", "hdel"],
+ ["keyword", "hopen"],
+ ["keyword", "hsym"],
+ ["keyword", "iasc"],
+ ["keyword", "identity"],
+ ["keyword", "idesc"],
+ ["keyword", "if"],
+ ["keyword", "ij"],
+ ["keyword", "in"],
+ ["keyword", "insert"],
+ ["keyword", "inter"],
+ ["keyword", "inv"],
+ ["keyword", "key"],
+ ["keyword", "keys"],
+ ["keyword", "last"],
+ ["keyword", "like"],
+ ["keyword", "list"],
+ ["keyword", "lj"],
+ ["keyword", "ljf"],
+ ["keyword", "load"],
+ ["keyword", "log"],
+ ["keyword", "lower"],
+ ["keyword", "lsq"],
+ ["keyword", "ltime"],
+ ["keyword", "ltrim"],
+ ["keyword", "mavg"],
+ ["keyword", "max"],
+ ["keyword", "maxs"],
+ ["keyword", "mcount"],
+ ["keyword", "md5"],
+ ["keyword", "mdev"],
+ ["keyword", "med"],
+ ["keyword", "meta"],
+ ["keyword", "min"],
+ ["keyword", "mins"],
+ ["keyword", "mmax"],
+ ["keyword", "mmin"],
+ ["keyword", "mmu"],
+ ["keyword", "mod"],
+ ["keyword", "msum"],
+ ["keyword", "neg"],
+ ["keyword", "next"],
+ ["keyword", "not"],
+ ["keyword", "null"],
+ ["keyword", "or"],
+ ["keyword", "over"],
+ ["keyword", "parse"],
+ ["keyword", "peach"],
+ ["keyword", "pj"],
+ ["keyword", "plist"],
+ ["keyword", "prd"],
+ ["keyword", "prds"],
+ ["keyword", "prev"],
+ ["keyword", "prior"],
+ ["keyword", "rand"],
+ ["keyword", "rank"],
+ ["keyword", "ratios"],
+ ["keyword", "raze"],
+ ["keyword", "read0"],
+ ["keyword", "read1"],
+ ["keyword", "reciprocal"],
+ ["keyword", "reval"],
+ ["keyword", "reverse"],
+ ["keyword", "rload"],
+ ["keyword", "rotate"],
+ ["keyword", "rsave"],
+ ["keyword", "rtrim"],
+ ["keyword", "save"],
+ ["keyword", "scan"],
+ ["keyword", "scov"],
+ ["keyword", "sdev"],
+ ["keyword", "select"],
+ ["keyword", "set"],
+ ["keyword", "setenv"],
+ ["keyword", "show"],
+ ["keyword", "signum"],
+ ["keyword", "sin"],
+ ["keyword", "sqrt"],
+ ["keyword", "ss"],
+ ["keyword", "ssr"],
+ ["keyword", "string"],
+ ["keyword", "sublist"],
+ ["keyword", "sum"],
+ ["keyword", "sums"],
+ ["keyword", "sv"],
+ ["keyword", "svar"],
+ ["keyword", "system"],
+ ["keyword", "tables"],
+ ["keyword", "tan"],
+ ["keyword", "til"],
+ ["keyword", "trim"],
+ ["keyword", "txf"],
+ ["keyword", "type"],
+ ["keyword", "uj"],
+ ["keyword", "ungroup"],
+ ["keyword", "union"],
+ ["keyword", "update"],
+ ["keyword", "upper"],
+ ["keyword", "upsert"],
+ ["keyword", "value"],
+ ["keyword", "var"],
+ ["keyword", "view"],
+ ["keyword", "views"],
+ ["keyword", "vs"],
+ ["keyword", "wavg"],
+ ["keyword", "where"],
+ ["keyword", "while"],
+ ["keyword", "within"],
+ ["keyword", "wj"],
+ ["keyword", "wj1"],
+ ["keyword", "wsum"],
+ ["keyword", "ww"],
+ ["keyword", "xasc"],
+ ["keyword", "xbar"],
+ ["keyword", "xcol"],
+ ["keyword", "xcols"],
+ ["keyword", "xdesc"],
+ ["keyword", "xexp"],
+ ["keyword", "xgroup"],
+ ["keyword", "xkey"],
+ ["keyword", "xlog"],
+ ["keyword", "xprev"],
+ ["keyword", "xrank"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/q/number_feature.test b/package/src/prism/tests/languages/q/number_feature.test
new file mode 100644
index 00000000..3c12bd53
--- /dev/null
+++ b/package/src/prism/tests/languages/q/number_feature.test
@@ -0,0 +1,33 @@
+0w 0n
+0W 0Wh 0Wj
+0N 0Nh 0Nj 0Ne
+
+0xBadFace
+42
+3.14159
+3e8
+0.4e-7
+3.12e+42
+42h 42j 42f
+4.00e 1b
+
+----------------------------------------------------
+
+[
+ ["number", "0w"], ["number", "0n"],
+ ["number", "0W"], ["number", "0Wh"], ["number", "0Wj"],
+ ["number", "0N"], ["number", "0Nh"], ["number", "0Nj"], ["number", "0Ne"],
+
+ ["number", "0xBadFace"],
+ ["number", "42"],
+ ["number", "3.14159"],
+ ["number", "3e8"],
+ ["number", "0.4e-7"],
+ ["number", "3.12e+42"],
+ ["number", "42h"], ["number", "42j"], ["number", "42f"],
+ ["number", "4.00e"], ["number", "1b"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/q/punctuation_feature.test b/package/src/prism/tests/languages/q/punctuation_feature.test
new file mode 100644
index 00000000..9a58c891
--- /dev/null
+++ b/package/src/prism/tests/languages/q/punctuation_feature.test
@@ -0,0 +1,17 @@
+( ) { } [ ] ;
+
+sp.s
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", ";"],
+
+ "\n\nsp", ["punctuation", "."], "s"
+]
diff --git a/package/src/prism/tests/languages/q/string_feature.test b/package/src/prism/tests/languages/q/string_feature.test
new file mode 100644
index 00000000..13a966cf
--- /dev/null
+++ b/package/src/prism/tests/languages/q/string_feature.test
@@ -0,0 +1,13 @@
+""
+"Fo\"obar"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"Fo\\\"obar\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/q/symbol_feature.test b/package/src/prism/tests/languages/q/symbol_feature.test
new file mode 100644
index 00000000..5caba4a3
--- /dev/null
+++ b/package/src/prism/tests/languages/q/symbol_feature.test
@@ -0,0 +1,17 @@
+`
+`foobar
+`:www.example.com:8888
+`.foo
+
+----------------------------------------------------
+
+[
+ ["symbol", "`"],
+ ["symbol", "`foobar"],
+ ["symbol", "`:www.example.com:8888"],
+ ["symbol", "`.foo"]
+]
+
+----------------------------------------------------
+
+Checks for symbols.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/q/verb_feature.test b/package/src/prism/tests/languages/q/verb_feature.test
new file mode 100644
index 00000000..9402ed08
--- /dev/null
+++ b/package/src/prism/tests/languages/q/verb_feature.test
@@ -0,0 +1,35 @@
+. .:
+0: 1:
+< <: <> <>: <= <=:
+> >: >= >=:
+: ::
++ +: - -:
+* *: % %:
+, ,: ! !:
+? ?: _ _:
+~ ~: = =:
+| |: $ $:
+& &: # #:
+@ @: ^ ^:
+
+----------------------------------------------------
+
+[
+ ["verb", "."], ["verb", ".:"],
+ ["verb", "0:"], ["verb", "1:"],
+ ["verb", "<"], ["verb", "<:"], ["verb", "<>"], ["verb", "<>:"], ["verb", "<="], ["verb", "<=:"],
+ ["verb", ">"], ["verb", ">:"], ["verb", ">="], ["verb", ">=:"],
+ ["verb", ":"], ["verb", "::"],
+ ["verb", "+"], ["verb", "+:"], ["verb", "-"], ["verb", "-:"],
+ ["verb", "*"], ["verb", "*:"], ["verb", "%"], ["verb", "%:"],
+ ["verb", ","], ["verb", ",:"], ["verb", "!"], ["verb", "!:"],
+ ["verb", "?"], ["verb", "?:"], ["verb", "_"], ["verb", "_:"],
+ ["verb", "~"], ["verb", "~:"], ["verb", "="], ["verb", "=:"],
+ ["verb", "|"], ["verb", "|:"], ["verb", "$"], ["verb", "$:"],
+ ["verb", "&"], ["verb", "&:"], ["verb", "#"], ["verb", "#:"],
+ ["verb", "@"], ["verb", "@:"], ["verb", "^"], ["verb", "^:"]
+]
+
+----------------------------------------------------
+
+Checks for verbs.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qml/class-name_feature.test b/package/src/prism/tests/languages/qml/class-name_feature.test
new file mode 100644
index 00000000..00e38574
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/class-name_feature.test
@@ -0,0 +1,61 @@
+Foo {
+ bar: FooBar {}
+ Baz {}
+ RotationAnimation on rotation {
+ loops: Animation.Infinite
+ from: 0
+ to: 360
+ }
+}
+
+----------------------------------------------------
+
+[
+ ["class-name", "Foo"],
+ ["punctuation", "{"],
+
+ ["property", "bar"],
+ ["punctuation", ":"],
+ ["class-name", "FooBar"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+
+ ["class-name", "Baz"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+
+ ["class-name", "RotationAnimation"],
+ ["keyword", "on"],
+ " rotation ",
+ ["punctuation", "{"],
+
+ ["property", "loops"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["maybe-class-name", "Animation"],
+ ["punctuation", "."],
+ ["property-access", [
+ ["maybe-class-name", "Infinite"]
+ ]]
+ ]],
+
+ ["property", "from"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "0"]
+ ]],
+
+ ["property", "to"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "360"]
+ ]],
+
+ ["punctuation", "}"],
+
+ ["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for class names.
diff --git a/package/src/prism/tests/languages/qml/comment_feature.test b/package/src/prism/tests/languages/qml/comment_feature.test
new file mode 100644
index 00000000..90913ce4
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/comment_feature.test
@@ -0,0 +1,15 @@
+// foo
+/*
+ bar
+ */
+
+----------------------------------------------------
+
+[
+ ["comment", "// foo"],
+ ["comment", "/*\n bar\n */"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
diff --git a/package/src/prism/tests/languages/qml/import_feature.test b/package/src/prism/tests/languages/qml/import_feature.test
new file mode 100644
index 00000000..e0703f26
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/import_feature.test
@@ -0,0 +1,26 @@
+import QtQuick 2.9
+import QtQml.Models 2.2
+import Person 1.0
+import "componentCreation.js" as MyScript
+
+----------------------------------------------------
+
+[
+ ["keyword", "import"],
+ " QtQuick 2.9\n",
+
+ ["keyword", "import"],
+ " QtQml.Models 2.2\n",
+
+ ["keyword", "import"],
+ " Person 1.0\n",
+
+ ["keyword", "import"],
+ ["string", "\"componentCreation.js\""],
+ ["keyword", "as"],
+ " MyScript"
+]
+
+----------------------------------------------------
+
+Checks for imports.
diff --git a/package/src/prism/tests/languages/qml/javascript-function_feature.test b/package/src/prism/tests/languages/qml/javascript-function_feature.test
new file mode 100644
index 00000000..ed4a07ee
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/javascript-function_feature.test
@@ -0,0 +1,88 @@
+Foo {
+ function onClicked(mouse) { foo(mouse) }
+
+ function calculateMyHeight() {
+ return Math.max(otherItem.height, thirdItem.height);
+ var foo = "//";
+ let bar = (1 / 1);
+ if (true) {} else {}
+ }
+}
+
+----------------------------------------------------
+
+[
+ ["class-name", "Foo"],
+ ["punctuation", "{"],
+
+ ["javascript-function", [
+ ["keyword", "function"],
+ ["function", ["onClicked"]],
+ ["punctuation", "("],
+ ["parameter", ["mouse"]],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+ ["function", ["foo"]],
+ ["punctuation", "("],
+ "mouse",
+ ["punctuation", ")"],
+ ["punctuation", "}"]
+ ]],
+
+ ["javascript-function", [
+ ["keyword", "function"],
+ ["function", ["calculateMyHeight"]],
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+
+ ["keyword", "return"],
+ ["maybe-class-name", "Math"],
+ ["punctuation", "."],
+ ["function", ["max"]],
+ ["punctuation", "("],
+ "otherItem",
+ ["punctuation", "."],
+ ["property-access", ["height"]],
+ ["punctuation", ","],
+ " thirdItem",
+ ["punctuation", "."],
+ ["property-access", ["height"]],
+ ["punctuation", ")"],
+ ["punctuation", ";"],
+
+ ["keyword", "var"],
+ " foo ",
+ ["operator", "="],
+ ["string", "\"//\""],
+ ["punctuation", ";"],
+
+ ["keyword", "let"],
+ " bar ",
+ ["operator", "="],
+ ["punctuation", "("],
+ ["number", "1"],
+ ["operator", "/"],
+ ["number", "1"],
+ ["punctuation", ")"],
+ ["punctuation", ";"],
+
+ ["keyword", "if"],
+ ["punctuation", "("],
+ ["boolean", "true"],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["keyword", "else"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+
+ ["punctuation", "}"]
+ ]],
+
+ ["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
diff --git a/package/src/prism/tests/languages/qml/keyword_feature.test b/package/src/prism/tests/languages/qml/keyword_feature.test
new file mode 100644
index 00000000..7f9c5ec8
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/keyword_feature.test
@@ -0,0 +1,15 @@
+as
+import
+on
+
+----------------------------------------------------
+
+[
+ ["keyword", "as"],
+ ["keyword", "import"],
+ ["keyword", "on"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
diff --git a/package/src/prism/tests/languages/qml/property_feature.test b/package/src/prism/tests/languages/qml/property_feature.test
new file mode 100644
index 00000000..194926b7
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/property_feature.test
@@ -0,0 +1,159 @@
+Foo {
+ bar: 4
+ a: 0; b: 1; c: 2
+ Components.foo: 2
+
+ Bar { a: 0; b: Baz {}; c: 2 }
+
+ property Component mycomponent: comp1
+ property color color: "green"
+
+ // produces warning: "Unable to assign [undefined] to double value"
+ value: if (mouse.pressed) mouse.mouseX
+}
+
+BirthdayParty {
+ guests: [
+ Person { name: "Leo Hodges" },
+ Person { name: "Jack Smith" },
+ Person { name: "Anne Brown" }
+ ]
+}
+
+----------------------------------------------------
+
+[
+ ["class-name", "Foo"],
+ ["punctuation", "{"],
+
+ ["property", "bar"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "4"]
+ ]],
+
+ ["property", "a"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "0"]
+ ]],
+ ["punctuation", ";"],
+ ["property", "b"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "1"]
+ ]],
+ ["punctuation", ";"],
+ ["property", "c"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "2"]
+ ]],
+
+ ["property", "Components.foo"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "2"]
+ ]],
+
+ ["class-name", "Bar"],
+ ["punctuation", "{"],
+ ["property", "a"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "0"]
+ ]],
+ ["punctuation", ";"],
+ ["property", "b"],
+ ["punctuation", ":"],
+ ["class-name", "Baz"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["punctuation", ";"],
+ ["property", "c"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["number", "2"]
+ ]],
+ ["punctuation", "}"],
+
+ ["property", [
+ ["keyword", "property"],
+ ["property", "Component"],
+ ["property", "mycomponent"]
+ ]],
+ ["punctuation", ":"],
+ ["javascript-expression", ["comp1"]],
+
+ ["property", [
+ ["keyword", "property"],
+ ["property", "color"],
+ ["property", "color"]
+ ]],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["string", "\"green\""]
+ ]],
+
+ ["comment", "// produces warning: \"Unable to assign [undefined] to double value\""],
+
+ ["property", "value"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["keyword", "if"],
+ ["punctuation", "("],
+ "mouse",
+ ["punctuation", "."],
+ ["property-access", ["pressed"]],
+ ["punctuation", ")"],
+ " mouse",
+ ["punctuation", "."],
+ ["property-access", ["mouseX"]]
+ ]],
+
+ ["punctuation", "}"],
+
+ ["class-name", "BirthdayParty"],
+ ["punctuation", "{"],
+
+ ["property", "guests"],
+ ["punctuation", ":"],
+ ["punctuation", "["],
+
+ ["class-name", "Person"],
+ ["punctuation", "{"],
+ ["property", "name"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["string", "\"Leo Hodges\""]
+ ]],
+ ["punctuation", "}"],
+ ["punctuation", ","],
+
+ ["class-name", "Person"],
+ ["punctuation", "{"],
+ ["property", "name"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["string", "\"Jack Smith\""]
+ ]],
+ ["punctuation", "}"],
+ ["punctuation", ","],
+
+ ["class-name", "Person"],
+ ["punctuation", "{"],
+ ["property", "name"],
+ ["punctuation", ":"],
+ ["javascript-expression", [
+ ["string", "\"Anne Brown\""]
+ ]],
+ ["punctuation", "}"],
+
+ ["punctuation", "]"],
+
+ ["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for properties.
diff --git a/package/src/prism/tests/languages/qml/punctuation_feature.test b/package/src/prism/tests/languages/qml/punctuation_feature.test
new file mode 100644
index 00000000..db8af74b
--- /dev/null
+++ b/package/src/prism/tests/languages/qml/punctuation_feature.test
@@ -0,0 +1,17 @@
+{} [] : ; ,
+
+----------------------------------------------------
+
+[
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", ":"],
+ ["punctuation", ";"],
+ ["punctuation", ","]
+]
+
+----------------------------------------------------
+
+Checks for punctuation.
diff --git a/package/src/prism/tests/languages/qore/boolean_feature.test b/package/src/prism/tests/languages/qore/boolean_feature.test
new file mode 100644
index 00000000..a40f8d95
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/boolean_feature.test
@@ -0,0 +1,13 @@
+true
+false
+
+----------------------------------------------------
+
+[
+ ["boolean", "true"],
+ ["boolean", "false"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/comment_feature.test b/package/src/prism/tests/languages/qore/comment_feature.test
new file mode 100644
index 00000000..f06a8dff
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/comment_feature.test
@@ -0,0 +1,22 @@
+/* foo */
+/* foo
+bar */
+//
+// foobar
+#
+# foobar
+
+----------------------------------------------------
+
+[
+ ["comment", "/* foo */"],
+ ["comment", "/* foo\nbar */"],
+ ["comment", "//"],
+ ["comment", "// foobar"],
+ ["comment", "#"],
+ ["comment", "# foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/function_feature.test b/package/src/prism/tests/languages/qore/function_feature.test
new file mode 100644
index 00000000..5335ab0a
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/function_feature.test
@@ -0,0 +1,15 @@
+foo()
+foo_bar()
+Foo_bar_42()
+
+----------------------------------------------------
+
+[
+ ["function", "foo"], ["punctuation", "("], ["punctuation", ")"],
+ ["function", "foo_bar"], ["punctuation", "("], ["punctuation", ")"],
+ ["function", "Foo_bar_42"], ["punctuation", "("], ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/keyword_feature.test b/package/src/prism/tests/languages/qore/keyword_feature.test
new file mode 100644
index 00000000..f04594e7
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/keyword_feature.test
@@ -0,0 +1,63 @@
+abstract any assert binary
+bool boolean break byte
+case catch char
+class;
+code const continue data
+default do double else
+enum
+extends;
+final finally float for
+goto hash if
+implements;
+import inherits
+instanceof;
+int
+interface;
+long my native
+new;
+nothing null object our
+own private reference
+rethrow return short
+softint softfloat softnumber
+softbool softstring softdate
+softlist static strictfp
+string sub super switch
+synchronized this throw
+throws transient try
+void volatile while
+
+----------------------------------------------------
+
+[
+ ["keyword", "abstract"], ["keyword", "any"], ["keyword", "assert"], ["keyword", "binary"],
+ ["keyword", "bool"], ["keyword", "boolean"], ["keyword", "break"], ["keyword", "byte"],
+ ["keyword", "case"], ["keyword", "catch"], ["keyword", "char"],
+ ["keyword", "class"], ["punctuation", ";"],
+ ["keyword", "code"], ["keyword", "const"], ["keyword", "continue"], ["keyword", "data"],
+ ["keyword", "default"], ["keyword", "do"], ["keyword", "double"], ["keyword", "else"],
+ ["keyword", "enum"],
+ ["keyword", "extends"], ["punctuation", ";"],
+ ["keyword", "final"], ["keyword", "finally"], ["keyword", "float"], ["keyword", "for"],
+ ["keyword", "goto"], ["keyword", "hash"], ["keyword", "if"],
+ ["keyword", "implements"], ["punctuation", ";"],
+ ["keyword", "import"], ["keyword", "inherits"],
+ ["keyword", "instanceof"], ["punctuation", ";"],
+ ["keyword", "int"],
+ ["keyword", "interface"], ["punctuation", ";"],
+ ["keyword", "long"], ["keyword", "my"], ["keyword", "native"],
+ ["keyword", "new"], ["punctuation", ";"],
+ ["keyword", "nothing"], ["keyword", "null"], ["keyword", "object"], ["keyword", "our"],
+ ["keyword", "own"], ["keyword", "private"], ["keyword", "reference"],
+ ["keyword", "rethrow"], ["keyword", "return"], ["keyword", "short"],
+ ["keyword", "softint"], ["keyword", "softfloat"], ["keyword", "softnumber"],
+ ["keyword", "softbool"], ["keyword", "softstring"], ["keyword", "softdate"],
+ ["keyword", "softlist"], ["keyword", "static"], ["keyword", "strictfp"],
+ ["keyword", "string"], ["keyword", "sub"], ["keyword", "super"], ["keyword", "switch"],
+ ["keyword", "synchronized"], ["keyword", "this"], ["keyword", "throw"],
+ ["keyword", "throws"], ["keyword", "transient"], ["keyword", "try"],
+ ["keyword", "void"], ["keyword", "volatile"], ["keyword", "while"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/number_feature.test b/package/src/prism/tests/languages/qore/number_feature.test
new file mode 100644
index 00000000..7a48d3ef
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/number_feature.test
@@ -0,0 +1,21 @@
+0b11110000
+0xBadFace
+0xabp-3
+42
+3.14159
+3.2e8f
+
+----------------------------------------------------
+
+[
+ ["number", "0b11110000"],
+ ["number", "0xBadFace"],
+ ["number", "0xabp-3"],
+ ["number", "42"],
+ ["number", "3.14159"],
+ ["number", "3.2e8f"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/operator_feature.test b/package/src/prism/tests/languages/qore/operator_feature.test
new file mode 100644
index 00000000..9e62209f
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/operator_feature.test
@@ -0,0 +1,37 @@
++ ++ +=
+- -- -=
+! != !== !~
+~
+* *=
+/ /=
+% %=
+^ ^=
+?
+= == === =~
+> >= >> >>=
+< <= <=> << <<=
+& && &=
+| || |=
+
+----------------------------------------------------
+
+[
+ ["operator", "+"], ["operator", "++"], ["operator", "+="],
+ ["operator", "-"], ["operator", "--"], ["operator", "-="],
+ ["operator", "!"], ["operator", "!="], ["operator", "!=="], ["operator", "!~"],
+ ["operator", "~"],
+ ["operator", "*"], ["operator", "*="],
+ ["operator", "/"], ["operator", "/="],
+ ["operator", "%"], ["operator", "%="],
+ ["operator", "^"], ["operator", "^="],
+ ["operator", "?"],
+ ["operator", "="], ["operator", "=="], ["operator", "==="], ["operator", "=~"],
+ ["operator", ">"], ["operator", ">="], ["operator", ">>"], ["operator", ">>="],
+ ["operator", "<"], ["operator", "<="], ["operator", "<=>"], ["operator", "<<"], ["operator", "<<="],
+ ["operator", "&"], ["operator", "&&"], ["operator", "&="],
+ ["operator", "|"], ["operator", "||"], ["operator", "|="]
+]
+
+----------------------------------------------------
+
+Checks for operators.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/string_feature.test b/package/src/prism/tests/languages/qore/string_feature.test
new file mode 100644
index 00000000..12871ac3
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/string_feature.test
@@ -0,0 +1,19 @@
+""
+"fo\"o
+bar"
+''
+'fo\'o
+bar'
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"fo\\\"o\nbar\""],
+ ["string", "''"],
+ ["string", "'fo\\'o\nbar'"]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qore/variable_feature.test b/package/src/prism/tests/languages/qore/variable_feature.test
new file mode 100644
index 00000000..4411840e
--- /dev/null
+++ b/package/src/prism/tests/languages/qore/variable_feature.test
@@ -0,0 +1,15 @@
+$foobar
+$foo_bar_42
+$Foobar
+
+----------------------------------------------------
+
+[
+ ["variable", "$foobar"],
+ ["variable", "$foo_bar_42"],
+ ["variable", "$Foobar"]
+]
+
+----------------------------------------------------
+
+Checks for variables.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/qsharp/comments_feature.test b/package/src/prism/tests/languages/qsharp/comments_feature.test
new file mode 100644
index 00000000..2b4ac169
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/comments_feature.test
@@ -0,0 +1,23 @@
+// The following using block creates a fresh qubit and initializes it
+// in the |0> state.
+
+use qubit = Qubit();
+
+----------------------------------------------------
+
+[
+ ["comment", "// The following using block creates a fresh qubit and initializes it"],
+ ["comment", "// in the |0> state."],
+ ["keyword", "use"],
+ " qubit ",
+ ["operator", "="],
+ ["keyword", "Qubit"],
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", ";"]
+]
+
+
+----------------------------------------------------
+
+Checks for comments
diff --git a/package/src/prism/tests/languages/qsharp/if_with_function_feature.test b/package/src/prism/tests/languages/qsharp/if_with_function_feature.test
new file mode 100644
index 00000000..7d4c397d
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/if_with_function_feature.test
@@ -0,0 +1,24 @@
+if result == One {
+ X(qubit);
+}
+
+----------------------------------------------------
+
+[
+ ["keyword", "if"],
+ " result ",
+ ["operator", "=="],
+ ["keyword", "One"],
+ ["punctuation", "{"],
+ ["function", "X"],
+ ["punctuation", "("],
+ "qubit",
+ ["punctuation", ")"],
+ ["punctuation", ";"],
+ ["punctuation", "}"]
+]
+
+
+----------------------------------------------------
+
+Checks for if, equality and function
diff --git a/package/src/prism/tests/languages/qsharp/keyword_feature.test b/package/src/prism/tests/languages/qsharp/keyword_feature.test
new file mode 100644
index 00000000..ec67ccfc
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/keyword_feature.test
@@ -0,0 +1,129 @@
+// type
+Adj
+BigInt
+Bool
+Ctl
+Double
+false
+Int
+One
+Pauli
+PauliI
+PauliX
+PauliY
+PauliZ
+Qubit
+Range
+Result
+String
+true
+Unit
+Zero
+
+// other
+Adjoint
+adjoint
+apply
+as
+auto
+body
+borrow
+borrowing
+Controlled
+controlled
+distribute
+elif
+else
+fail
+fixup
+for
+function
+if
+in
+internal
+intrinsic
+invert
+is
+let
+mutable
+namespace
+new
+newtype
+open
+operation
+repeat
+return
+self
+set
+until
+use
+using
+while
+within
+
+----------------------------------------------------
+
+[
+ ["comment", "// type"],
+ ["keyword", "Adj"],
+ ["keyword", "BigInt"],
+ ["keyword", "Bool"],
+ ["keyword", "Ctl"],
+ ["keyword", "Double"],
+ ["keyword", "false"],
+ ["keyword", "Int"],
+ ["keyword", "One"],
+ ["keyword", "Pauli"],
+ ["keyword", "PauliI"],
+ ["keyword", "PauliX"],
+ ["keyword", "PauliY"],
+ ["keyword", "PauliZ"],
+ ["keyword", "Qubit"],
+ ["keyword", "Range"],
+ ["keyword", "Result"],
+ ["keyword", "String"],
+ ["keyword", "true"],
+ ["keyword", "Unit"],
+ ["keyword", "Zero"],
+
+ ["comment", "// other"],
+ ["keyword", "Adjoint"],
+ ["keyword", "adjoint"],
+ ["keyword", "apply"],
+ ["keyword", "as"],
+ ["keyword", "auto"],
+ ["keyword", "body"],
+ ["keyword", "borrow"],
+ ["keyword", "borrowing"],
+ ["keyword", "Controlled"],
+ ["keyword", "controlled"],
+ ["keyword", "distribute"],
+ ["keyword", "elif"],
+ ["keyword", "else"],
+ ["keyword", "fail"],
+ ["keyword", "fixup"],
+ ["keyword", "for"],
+ ["keyword", "function"],
+ ["keyword", "if"],
+ ["keyword", "in"],
+ ["keyword", "internal"],
+ ["keyword", "intrinsic"],
+ ["keyword", "invert"],
+ ["keyword", "is"],
+ ["keyword", "let"],
+ ["keyword", "mutable"],
+ ["keyword", "namespace"],
+ ["keyword", "new"],
+ ["keyword", "newtype"],
+ ["keyword", "open"],
+ ["keyword", "operation"],
+ ["keyword", "repeat"],
+ ["keyword", "return"],
+ ["keyword", "self"],
+ ["keyword", "set"],
+ ["keyword", "until"],
+ ["keyword", "use"],
+ ["keyword", "using"],
+ ["keyword", "while"],
+ ["keyword", "within"]
+]
diff --git a/package/src/prism/tests/languages/qsharp/namespace_feature.test b/package/src/prism/tests/languages/qsharp/namespace_feature.test
new file mode 100644
index 00000000..578e279f
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/namespace_feature.test
@@ -0,0 +1,30 @@
+namespace Quantum.App1 {
+ open Microsoft.Quantum.Canon;
+}
+
+----------------------------------------------------
+
+[
+ ["keyword", "namespace"],
+ ["class-name", [
+ "Quantum",
+ ["punctuation", "."],
+ "App1"
+ ]],
+ ["punctuation", "{"],
+ ["keyword", "open"],
+ ["class-name", [
+ "Microsoft",
+ ["punctuation", "."],
+ "Quantum",
+ ["punctuation", "."],
+ "Canon"
+ ]],
+ ["punctuation", ";"],
+ ["punctuation", "}"]
+]
+
+
+----------------------------------------------------
+
+Checks for namespace declaration and import
diff --git a/package/src/prism/tests/languages/qsharp/operators_feature.test b/package/src/prism/tests/languages/qsharp/operators_feature.test
new file mode 100644
index 00000000..fa0aa9a8
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/operators_feature.test
@@ -0,0 +1,32 @@
+and or not
+and= or=
+<- <= -> =>
+* / + - = ^ ! %
+*= /= += -= == ^= != %=
+>>> >>>= <<< <<<=
+^^^ ^^^=
+||| |||=
+&&& &&&=
+w/ w/=
+~~~
+
+----------------------------------------------------
+
+[
+ ["operator", "and"], ["operator", "or"], ["operator", "not"],
+ ["operator", "and="], ["operator", "or="],
+ ["operator", "<-"], ["operator", "<="], ["operator", "->"], ["operator", "=>"],
+ ["operator", "*"], ["operator", "/"], ["operator", "+"], ["operator", "-"], ["operator", "="], ["operator", "^"], ["operator", "!"], ["operator", "%"],
+ ["operator", "*="], ["operator", "/="], ["operator", "+="], ["operator", "-="], ["operator", "=="], ["operator", "^="], ["operator", "!="], ["operator", "%="],
+ ["operator", ">>>"], ["operator", ">>>="], ["operator", "<<<"], ["operator", "<<<="],
+ ["operator", "^^^"], ["operator", "^^^="],
+ ["operator", "|||"], ["operator", "|||="],
+ ["operator", "&&&"], ["operator", "&&&="],
+ ["operator", "w/"], ["operator", "w/="],
+ ["operator", "~~~"]
+]
+
+
+----------------------------------------------------
+
+Checks for opertors
diff --git a/package/src/prism/tests/languages/qsharp/string_feature.test b/package/src/prism/tests/languages/qsharp/string_feature.test
new file mode 100644
index 00000000..146080fd
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/string_feature.test
@@ -0,0 +1,39 @@
+""
+"foo"
+"foo\"\n"
+
+$""
+$"foo"
+$"\""
+$"foo{1+1}baz"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"foo\""],
+ ["string", "\"foo\\\"\\n\""],
+
+ ["interpolation-string", [
+ ["string", "$\"\""]
+ ]],
+ ["interpolation-string", [
+ ["string", "$\"foo\""]
+ ]],
+ ["interpolation-string", [
+ ["string", "$\"\\\"\""]
+ ]],
+ ["interpolation-string", [
+ ["string", "$\"foo"],
+ ["interpolation", [
+ ["punctuation", "{"],
+ ["expression", [
+ ["number", "1"],
+ ["operator", "+"],
+ ["number", "1"]
+ ]],
+ ["punctuation", "}"]
+ ]],
+ ["string", "baz\""]
+ ]]
+]
diff --git a/package/src/prism/tests/languages/qsharp/variable_assignment_numbers_feature.test b/package/src/prism/tests/languages/qsharp/variable_assignment_numbers_feature.test
new file mode 100644
index 00000000..2db81959
--- /dev/null
+++ b/package/src/prism/tests/languages/qsharp/variable_assignment_numbers_feature.test
@@ -0,0 +1,30 @@
+let var1 = 3;
+mutable var2 = 5L;
+set var2 = var2 + 1.5;
+
+----------------------------------------------------
+
+[
+ ["keyword", "let"],
+ " var1 ",
+ ["operator", "="],
+ ["number", "3"],
+ ["punctuation", ";"],
+ ["keyword", "mutable"],
+ " var2 ",
+ ["operator", "="],
+ ["number", "5L"],
+ ["punctuation", ";"],
+ ["keyword", "set"],
+ " var2 ",
+ ["operator", "="],
+ " var2 ",
+ ["operator", "+"],
+ ["number", "1.5"],
+ ["punctuation", ";"]
+]
+
+
+----------------------------------------------------
+
+Checks for variable assignment and numbers
diff --git a/package/src/prism/tests/languages/r/boolean_feature.test b/package/src/prism/tests/languages/r/boolean_feature.test
new file mode 100644
index 00000000..ef7bc6fc
--- /dev/null
+++ b/package/src/prism/tests/languages/r/boolean_feature.test
@@ -0,0 +1,13 @@
+TRUE
+FALSE
+
+----------------------------------------------------
+
+[
+ ["boolean", "TRUE"],
+ ["boolean", "FALSE"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/comment_feature.test b/package/src/prism/tests/languages/r/comment_feature.test
new file mode 100644
index 00000000..710014b8
--- /dev/null
+++ b/package/src/prism/tests/languages/r/comment_feature.test
@@ -0,0 +1,13 @@
+#
+# foobar
+
+----------------------------------------------------
+
+[
+ ["comment", "#"],
+ ["comment", "# foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/ellipsis_feature.test b/package/src/prism/tests/languages/r/ellipsis_feature.test
new file mode 100644
index 00000000..40e8d305
--- /dev/null
+++ b/package/src/prism/tests/languages/r/ellipsis_feature.test
@@ -0,0 +1,15 @@
+...
+..1
+..42
+
+----------------------------------------------------
+
+[
+ ["ellipsis", "..."],
+ ["ellipsis", "..1"],
+ ["ellipsis", "..42"]
+]
+
+----------------------------------------------------
+
+Checks for ellipsis and special identifiers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/keyword_feature.test b/package/src/prism/tests/languages/r/keyword_feature.test
new file mode 100644
index 00000000..dd401b2f
--- /dev/null
+++ b/package/src/prism/tests/languages/r/keyword_feature.test
@@ -0,0 +1,25 @@
+if else repeat
+while function
+for in next
+break NULL NA
+NA_integer_
+NA_real_
+NA_complex_
+NA_character_
+
+----------------------------------------------------
+
+[
+ ["keyword", "if"], ["keyword", "else"], ["keyword", "repeat"],
+ ["keyword", "while"], ["keyword", "function"],
+ ["keyword", "for"], ["keyword", "in"], ["keyword", "next"],
+ ["keyword", "break"], ["keyword", "NULL"], ["keyword", "NA"],
+ ["keyword", "NA_integer_"],
+ ["keyword", "NA_real_"],
+ ["keyword", "NA_complex_"],
+ ["keyword", "NA_character_"]
+]
+
+----------------------------------------------------
+
+Checks for all keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/number_feature.test b/package/src/prism/tests/languages/r/number_feature.test
new file mode 100644
index 00000000..d2f98239
--- /dev/null
+++ b/package/src/prism/tests/languages/r/number_feature.test
@@ -0,0 +1,39 @@
+NaN Inf
+0xBadFace
+0xf4.42
+0x21.2p2
+0xffP+4
+0xeap-1
+42
+42L
+3.14159
+3.2E4
+4e+8
+0.1e-12
+2i
+4.1i
+1e-2i
+
+----------------------------------------------------
+
+[
+ ["number", "NaN"], ["number", "Inf"],
+ ["number", "0xBadFace"],
+ ["number", "0xf4.42"],
+ ["number", "0x21.2p2"],
+ ["number", "0xffP+4"],
+ ["number", "0xeap-1"],
+ ["number", "42"],
+ ["number", "42L"],
+ ["number", "3.14159"],
+ ["number", "3.2E4"],
+ ["number", "4e+8"],
+ ["number", "0.1e-12"],
+ ["number", "2i"],
+ ["number", "4.1i"],
+ ["number", "1e-2i"]
+]
+
+----------------------------------------------------
+
+Checks for hexadecimal, decimal and complex numbers.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/operator_feature.test b/package/src/prism/tests/languages/r/operator_feature.test
new file mode 100644
index 00000000..760a8c42
--- /dev/null
+++ b/package/src/prism/tests/languages/r/operator_feature.test
@@ -0,0 +1,29 @@
++ * / ^
+~ $ @
+- -> ->>
+> >=
+< <= <- <<-
+= ==
+! !=
+& &&
+| ||
+: ::
+
+----------------------------------------------------
+
+[
+ ["operator", "+"], ["operator", "*"], ["operator", "/"], ["operator", "^"],
+ ["operator", "~"], ["operator", "$"], ["operator", "@"],
+ ["operator", "-"], ["operator", "->"], ["operator", "->>"],
+ ["operator", ">"], ["operator", ">="],
+ ["operator", "<"], ["operator", "<="], ["operator", "<-"], ["operator", "<<-"],
+ ["operator", "="], ["operator", "=="],
+ ["operator", "!"], ["operator", "!="],
+ ["operator", "&"], ["operator", "&&"],
+ ["operator", "|"], ["operator", "||"],
+ ["operator", ":"], ["operator", "::"]
+]
+
+----------------------------------------------------
+
+Checks for all operators.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/percent-operator_feature.test b/package/src/prism/tests/languages/r/percent-operator_feature.test
new file mode 100644
index 00000000..26ab2304
--- /dev/null
+++ b/package/src/prism/tests/languages/r/percent-operator_feature.test
@@ -0,0 +1,15 @@
+%% %*% %/%
+%in% %o% %x%
+%foobar%
+
+----------------------------------------------------
+
+[
+ ["percent-operator", "%%"], ["percent-operator", "%*%"], ["percent-operator", "%/%"],
+ ["percent-operator", "%in%"], ["percent-operator", "%o%"], ["percent-operator", "%x%"],
+ ["percent-operator", "%foobar%"]
+]
+
+----------------------------------------------------
+
+Checks for user-defined operators and operators starting with %.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/r/punctuation_feature.test b/package/src/prism/tests/languages/r/punctuation_feature.test
new file mode 100644
index 00000000..4a7c5ff4
--- /dev/null
+++ b/package/src/prism/tests/languages/r/punctuation_feature.test
@@ -0,0 +1,14 @@
+( ) { } [ ] , ;
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", ","],
+ ["punctuation", ";"]
+]
diff --git a/package/src/prism/tests/languages/r/string_feature.test b/package/src/prism/tests/languages/r/string_feature.test
new file mode 100644
index 00000000..3d6595fe
--- /dev/null
+++ b/package/src/prism/tests/languages/r/string_feature.test
@@ -0,0 +1,17 @@
+""
+"fo\"obar"
+''
+'fo\'obar'
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"fo\\\"obar\""],
+ ["string", "''"],
+ ["string", "'fo\\'obar'"]
+]
+
+----------------------------------------------------
+
+Checks for single-quoted and double-quoted strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/racket/boolean_feature.test b/package/src/prism/tests/languages/racket/boolean_feature.test
new file mode 100644
index 00000000..29fdb963
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/boolean_feature.test
@@ -0,0 +1,13 @@
+#t
+#f
+
+----------------------------------------------------
+
+[
+ ["boolean", "#t"],
+ ["boolean", "#f"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
diff --git a/package/src/prism/tests/languages/racket/builtin_feature.test b/package/src/prism/tests/languages/racket/builtin_feature.test
new file mode 100644
index 00000000..bcb228ad
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/builtin_feature.test
@@ -0,0 +1,99 @@
+(cons)
+(car)
+(cdr)
+(null?)
+(pair?)
+(boolean?)
+(eof-object?)
+(char?)
+(procedure?)
+(number?)
+(port?)
+(string?)
+(vector?)
+(symbol?)
+(bytevector?)
+(list)
+(call-with-current-continuation)
+(call/cc)
+(append)
+(abs)
+(apply)
+(eval)
+
+[cons]
+[car]
+[cdr]
+[null?]
+[pair?]
+[boolean?]
+[eof-object?]
+[char?]
+[procedure?]
+[number?]
+[port?]
+[string?]
+[vector?]
+[symbol?]
+[bytevector?]
+[list]
+[call-with-current-continuation]
+[call/cc]
+[append]
+[abs]
+[apply]
+[eval]
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("], ["builtin", "cons"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "car"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "cdr"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "null?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "pair?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "boolean?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "eof-object?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "char?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "procedure?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "number?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "port?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "string?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "vector?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "symbol?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "bytevector?"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "list"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "call-with-current-continuation"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "call/cc"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "append"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "abs"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "apply"], ["punctuation", ")"],
+ ["punctuation", "("], ["builtin", "eval"], ["punctuation", ")"],
+
+ ["punctuation", "["], ["builtin", "cons"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "car"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "cdr"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "null?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "pair?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "boolean?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "eof-object?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "char?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "procedure?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "number?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "port?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "string?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "vector?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "symbol?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "bytevector?"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "list"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "call-with-current-continuation"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "call/cc"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "append"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "abs"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "apply"], ["punctuation", "]"],
+ ["punctuation", "["], ["builtin", "eval"], ["punctuation", "]"]
+]
+
+----------------------------------------------------
+
+Checks for builtins.
diff --git a/package/src/prism/tests/languages/racket/char_feature.test b/package/src/prism/tests/languages/racket/char_feature.test
new file mode 100644
index 00000000..1e92a056
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/char_feature.test
@@ -0,0 +1,41 @@
+#\a ; lowercase letter
+#\A ; uppercase letter
+#\( ; left parenthesis
+#\space ; the space character
+#\newline ; the newline character
+
+#\c-a ; Control-a
+#\meta-b ; Meta-b
+#\c-s-m-h-a ; Control-Meta-Super-Hyper-A
+
+#\; #\' #\"
+
+#\u0041
+#\x10FFFF
+#\λ
+#\)
+
+----------------------------------------------------
+
+[
+ ["char", "#\\a"], ["comment", "; lowercase letter"],
+ ["char", "#\\A"], ["comment", "; uppercase letter"],
+ ["char", "#\\("], ["comment", "; left parenthesis"],
+ ["char", "#\\space"], ["comment", "; the space character"],
+ ["char", "#\\newline"], ["comment", "; the newline character"],
+
+ ["char", "#\\c-a"], ["comment", "; Control-a"],
+ ["char", "#\\meta-b"], ["comment", "; Meta-b"],
+ ["char", "#\\c-s-m-h-a"], ["comment", "; Control-Meta-Super-Hyper-A"],
+
+ ["char", "#\\;"], ["char", "#\\'"], ["char", "#\\\""],
+
+ ["char", "#\\u0041"],
+ ["char", "#\\x10FFFF"],
+ ["char", "#\\λ"],
+ ["char", "#\\)"]
+]
+
+----------------------------------------------------
+
+Checks for character literals.
diff --git a/package/src/prism/tests/languages/racket/comment_feature.test b/package/src/prism/tests/languages/racket/comment_feature.test
new file mode 100644
index 00000000..5fd28252
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/comment_feature.test
@@ -0,0 +1,13 @@
+;
+; foobar
+
+----------------------------------------------------
+
+[
+ ["comment", ";"],
+ ["comment", "; foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/racket/function_feature.test b/package/src/prism/tests/languages/racket/function_feature.test
new file mode 100644
index 00000000..4fd30f5d
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/function_feature.test
@@ -0,0 +1,39 @@
+(fl= 1 2)
+(flmin 2 3)
+(inexact->exact 3)
+(!fact)
+(** 10)
+(**
+(defined foo)
+
+[fl= 1 2]
+[flmin 2 3]
+[inexact->exact 3]
+[!fact]
+[** 10]
+[**
+[defined foo]
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("], ["function", "fl="], ["number", "1"], ["number", "2"], ["punctuation", ")"],
+ ["punctuation", "("], ["function", "flmin"], ["number", "2"], ["number", "3"], ["punctuation", ")"],
+ ["punctuation", "("], ["function", "inexact->exact"], ["number", "3"], ["punctuation", ")"],
+ ["punctuation", "("], ["function", "!fact"], ["punctuation", ")"],
+ ["punctuation", "("], ["function", "**"], ["number", "10"], ["punctuation", ")"],
+ ["punctuation", "("], ["function", "**"],
+ ["punctuation", "("], ["function", "defined"], " foo", ["punctuation", ")"],
+
+ ["punctuation", "["], ["function", "fl="], ["number", "1"], ["number", "2"], ["punctuation", "]"],
+ ["punctuation", "["], ["function", "flmin"], ["number", "2"], ["number", "3"], ["punctuation", "]"],
+ ["punctuation", "["], ["function", "inexact->exact"], ["number", "3"], ["punctuation", "]"],
+ ["punctuation", "["], ["function", "!fact"], ["punctuation", "]"],
+ ["punctuation", "["], ["function", "**"], ["number", "10"], ["punctuation", "]"],
+ ["punctuation", "["], ["function", "**"],
+ ["punctuation", "["], ["function", "defined"], " foo", ["punctuation", "]"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
diff --git a/package/src/prism/tests/languages/racket/identifier_feature.test b/package/src/prism/tests/languages/racket/identifier_feature.test
new file mode 100644
index 00000000..e57533ce
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/identifier_feature.test
@@ -0,0 +1,7 @@
+|\x9;\x9;|
+
+----------------------------------------------------
+
+[
+ ["identifier", "|\\x9;\\x9;|"]
+]
diff --git a/package/src/prism/tests/languages/racket/keyword_feature.test b/package/src/prism/tests/languages/racket/keyword_feature.test
new file mode 100644
index 00000000..5ab2aa4f
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/keyword_feature.test
@@ -0,0 +1,13 @@
+(define)
+[define]
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("], ["keyword", "define"], ["punctuation", ")"],
+ ["punctuation", "["], ["keyword", "define"], ["punctuation", "]"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
diff --git a/package/src/prism/tests/languages/racket/lambda_parameter_feature.test b/package/src/prism/tests/languages/racket/lambda_parameter_feature.test
new file mode 100644
index 00000000..20ec4bc2
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/lambda_parameter_feature.test
@@ -0,0 +1,35 @@
+(lambda (foo bar) (concat foo bar))
+
+(lambda [foo bar] [concat foo bar])
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("],
+ ["keyword", "lambda"],
+ ["punctuation", "("],
+ ["lambda-parameter", "foo"],
+ " bar",
+ ["punctuation", ")"],
+ ["punctuation", "("],
+ ["function", "concat"],
+ " foo bar",
+ ["punctuation", ")"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["keyword", "lambda"],
+ ["punctuation", "["],
+ ["lambda-parameter", "foo"],
+ " bar",
+ ["punctuation", "]"],
+ ["punctuation", "["],
+ ["function", "concat"],
+ " foo bar",
+ ["punctuation", "]"],
+ ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for lambda parameters.
diff --git a/package/src/prism/tests/languages/racket/lang_feature.test b/package/src/prism/tests/languages/racket/lang_feature.test
new file mode 100644
index 00000000..d05f0f0b
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/lang_feature.test
@@ -0,0 +1,17 @@
+#lang racket
+#lang racket/base
+#lang s-exp "html.rkt"
+#lang s-exp pollen/private/dialect
+
+----------------------------------------------------
+
+[
+ ["lang", "#lang racket"],
+ ["lang", "#lang racket/base"],
+ ["lang", "#lang s-exp \"html.rkt\""],
+ ["lang", "#lang s-exp pollen/private/dialect"]
+]
+
+----------------------------------------------------
+
+Checks for #lang.
diff --git a/package/src/prism/tests/languages/racket/number_feature.test b/package/src/prism/tests/languages/racket/number_feature.test
new file mode 100644
index 00000000..568ab168
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/number_feature.test
@@ -0,0 +1,118 @@
+123
+
+(foo 42 +42 -42)
+(foo 1e3 +1e3 -1e3)
+(foo 1e+3 1e-3 3.14159 3.14159e-1)
+(foo 8/3)
+(foo 3+4i 2.5+0.0i 2.5+0.0i -2.5e4+0.0e4i 3+0i -2e-5i)
+(list +10i -10i 10+10i 10.10+10.10i 10-10i 10+10e+10i)
+
+(list #d123 #e#d123e-4 #d#i12 #i-1.234i)
+
+(list #xBAD #b1110011 #o777)
+(list #i#x10 #i#x10+10i #b10+10i)
+
+10+i
+10+.1i
+10+1.i
+
+; not a number but a symbol
+(define 1+2 10)
+
+
+[foo 42]
+
+----------------------------------------------------
+
+[
+ ["number", "123"],
+
+ ["punctuation", "("],
+ ["function", "foo"],
+ ["number", "42"],
+ ["number", "+42"],
+ ["number", "-42"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["function", "foo"],
+ ["number", "1e3"],
+ ["number", "+1e3"],
+ ["number", "-1e3"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["function", "foo"],
+ ["number", "1e+3"],
+ ["number", "1e-3"],
+ ["number", "3.14159"],
+ ["number", "3.14159e-1"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["function", "foo"],
+ ["number", "8/3"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["function", "foo"],
+ ["number", "3+4i"],
+ ["number", "2.5+0.0i"],
+ ["number", "2.5+0.0i"],
+ ["number", "-2.5e4+0.0e4i"],
+ ["number", "3+0i"],
+ ["number", "-2e-5i"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["builtin", "list"],
+ ["number", "+10i"],
+ ["number", "-10i"],
+ ["number", "10+10i"],
+ ["number", "10.10+10.10i"],
+ ["number", "10-10i"],
+ ["number", "10+10e+10i"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["builtin", "list"],
+ ["number", "#d123"],
+ ["number", "#e#d123e-4"],
+ ["number", "#d#i12"],
+ ["number", "#i-1.234i"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["builtin", "list"],
+ ["number", "#xBAD"],
+ ["number", "#b1110011"],
+ ["number", "#o777"],
+ ["punctuation", ")"],
+
+ ["punctuation", "("],
+ ["builtin", "list"],
+ ["number", "#i#x10"],
+ ["number", "#i#x10+10i"],
+ ["number", "#b10+10i"],
+ ["punctuation", ")"],
+
+ ["number", "10+i"],
+ ["number", "10+.1i"],
+ ["number", "10+1.i"],
+
+ ["comment", "; not a number but a symbol"],
+ ["punctuation", "("],
+ ["keyword", "define"],
+ " 1+2 ",
+ ["number", "10"],
+ ["punctuation", ")"],
+
+ ["punctuation", "["],
+ ["function", "foo"],
+ ["number", "42"],
+ ["punctuation", "]"]
+]
+
+----------------------------------------------------
+
+Checks for numbers, rational numbers, and complex numbers.
diff --git a/package/src/prism/tests/languages/racket/operator_feature.test b/package/src/prism/tests/languages/racket/operator_feature.test
new file mode 100644
index 00000000..3d6036b1
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/operator_feature.test
@@ -0,0 +1,55 @@
+(+
+(-
+(*
+(/
+(%
+(<
+(<=
+(>
+(>=
+(=
+(=>
+
+[+
+[-
+[*
+[/
+[%
+[<
+[<=
+[>
+[>=
+[=
+[=>
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("], ["operator", "+"],
+ ["punctuation", "("], ["operator", "-"],
+ ["punctuation", "("], ["operator", "*"],
+ ["punctuation", "("], ["operator", "/"],
+ ["punctuation", "("], ["operator", "%"],
+ ["punctuation", "("], ["operator", "<"],
+ ["punctuation", "("], ["operator", "<="],
+ ["punctuation", "("], ["operator", ">"],
+ ["punctuation", "("], ["operator", ">="],
+ ["punctuation", "("], ["operator", "="],
+ ["punctuation", "("], ["operator", "=>"],
+
+ ["punctuation", "["], ["operator", "+"],
+ ["punctuation", "["], ["operator", "-"],
+ ["punctuation", "["], ["operator", "*"],
+ ["punctuation", "["], ["operator", "/"],
+ ["punctuation", "["], ["operator", "%"],
+ ["punctuation", "["], ["operator", "<"],
+ ["punctuation", "["], ["operator", "<="],
+ ["punctuation", "["], ["operator", ">"],
+ ["punctuation", "["], ["operator", ">="],
+ ["punctuation", "["], ["operator", "="],
+ ["punctuation", "["], ["operator", "=>"]
+]
+
+----------------------------------------------------
+
+Checks for operators.
diff --git a/package/src/prism/tests/languages/racket/string_feature.test b/package/src/prism/tests/languages/racket/string_feature.test
new file mode 100644
index 00000000..7a61a9e0
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/string_feature.test
@@ -0,0 +1,18 @@
+""
+"fo\"obar"
+"
+multi
+line
+"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"fo\\\"obar\""],
+ ["string", "\"\nmulti\nline\n\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
diff --git a/package/src/prism/tests/languages/racket/symbol_feature.test b/package/src/prism/tests/languages/racket/symbol_feature.test
new file mode 100644
index 00000000..ccf371a5
--- /dev/null
+++ b/package/src/prism/tests/languages/racket/symbol_feature.test
@@ -0,0 +1,13 @@
+'turkey
+(define a 'foo)
+
+----------------------------------------------------
+
+[
+ ["symbol", "'turkey"],
+ ["punctuation", "("], ["keyword", "define"], " a ", ["symbol","'foo"], ["punctuation",")"]
+]
+
+----------------------------------------------------
+
+Checks for symbols.
diff --git a/package/src/prism/tests/languages/reason/char_feature.test b/package/src/prism/tests/languages/reason/char_feature.test
new file mode 100644
index 00000000..244b0765
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/char_feature.test
@@ -0,0 +1,19 @@
+'a'
+'\''
+'\\'
+'\xff'
+'\o214'
+
+----------------------------------------------------
+
+[
+ ["char", "'a'"],
+ ["char", "'\\''"],
+ ["char", "'\\\\'"],
+ ["char", "'\\xff'"],
+ ["char", "'\\o214'"]
+]
+
+----------------------------------------------------
+
+Checks for characters.
diff --git a/package/src/prism/tests/languages/reason/class-name_feature.test b/package/src/prism/tests/languages/reason/class-name_feature.test
new file mode 100644
index 00000000..9d033ff2
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/class-name_feature.test
@@ -0,0 +1,15 @@
+String.foo
+Foo_bar.baz
+A.bar
+
+----------------------------------------------------
+
+[
+ ["class-name", "String"], ["punctuation", "."], "foo\n",
+ ["class-name", "Foo_bar"], ["punctuation", "."], "baz\n",
+ ["class-name", "A"], ["punctuation", "."], "bar"
+]
+
+----------------------------------------------------
+
+Checks for class names.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/reason/comment_feature.test b/package/src/prism/tests/languages/reason/comment_feature.test
new file mode 100644
index 00000000..91a73219
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/comment_feature.test
@@ -0,0 +1,22 @@
+// foobar
+/**/
+/* Single line comment */
+/* Multiline
+comment */
+/**
+Doc comment
+*/
+
+----------------------------------------------------
+
+[
+ ["comment", "// foobar"],
+ ["comment", "/**/"],
+ ["comment", "/* Single line comment */"],
+ ["comment", "/* Multiline\ncomment */"],
+ ["comment", "/**\nDoc comment\n*/"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
diff --git a/package/src/prism/tests/languages/reason/constructor_feature.test b/package/src/prism/tests/languages/reason/constructor_feature.test
new file mode 100644
index 00000000..23b6f3fc
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/constructor_feature.test
@@ -0,0 +1,15 @@
+Yes
+Foo_bar
+A
+
+----------------------------------------------------
+
+[
+ ["constructor", "Yes"],
+ ["constructor", "Foo_bar"],
+ ["constructor", "A"]
+]
+
+----------------------------------------------------
+
+Checks for constructors.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/reason/keyword_feature.test b/package/src/prism/tests/languages/reason/keyword_feature.test
new file mode 100644
index 00000000..45a60c5e
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/keyword_feature.test
@@ -0,0 +1,103 @@
+and
+as
+assert
+begin
+class
+constraint
+do
+done
+downto
+else
+end
+exception
+external
+for
+fun
+function
+functor
+if
+in
+include
+inherit
+initializer
+lazy
+let
+method
+module
+mutable
+new
+nonrec
+object
+of
+open
+or
+private
+rec
+sig
+struct
+switch
+then
+to
+try
+type
+val
+virtual
+when
+while
+with
+
+----------------------------------------------------
+
+[
+ ["keyword", "and"],
+ ["keyword", "as"],
+ ["keyword", "assert"],
+ ["keyword", "begin"],
+ ["keyword", "class"],
+ ["keyword", "constraint"],
+ ["keyword", "do"],
+ ["keyword", "done"],
+ ["keyword", "downto"],
+ ["keyword", "else"],
+ ["keyword", "end"],
+ ["keyword", "exception"],
+ ["keyword", "external"],
+ ["keyword", "for"],
+ ["keyword", "fun"],
+ ["keyword", "function"],
+ ["keyword", "functor"],
+ ["keyword", "if"],
+ ["keyword", "in"],
+ ["keyword", "include"],
+ ["keyword", "inherit"],
+ ["keyword", "initializer"],
+ ["keyword", "lazy"],
+ ["keyword", "let"],
+ ["keyword", "method"],
+ ["keyword", "module"],
+ ["keyword", "mutable"],
+ ["keyword", "new"],
+ ["keyword", "nonrec"],
+ ["keyword", "object"],
+ ["keyword", "of"],
+ ["keyword", "open"],
+ ["keyword", "or"],
+ ["keyword", "private"],
+ ["keyword", "rec"],
+ ["keyword", "sig"],
+ ["keyword", "struct"],
+ ["keyword", "switch"],
+ ["keyword", "then"],
+ ["keyword", "to"],
+ ["keyword", "try"],
+ ["keyword", "type"],
+ ["keyword", "val"],
+ ["keyword", "virtual"],
+ ["keyword", "when"],
+ ["keyword", "while"],
+ ["keyword", "with"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/reason/label_feature.test b/package/src/prism/tests/languages/reason/label_feature.test
new file mode 100644
index 00000000..747ee525
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/label_feature.test
@@ -0,0 +1,13 @@
+foo::bar
+a::baz
+
+----------------------------------------------------
+
+[
+ ["label", "foo"], ["operator", "::"], "bar\n",
+ ["label", "a"], ["operator", "::"], "baz"
+]
+
+----------------------------------------------------
+
+Checks for labels.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/reason/operator_feature.test b/package/src/prism/tests/languages/reason/operator_feature.test
new file mode 100644
index 00000000..8a28832e
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/operator_feature.test
@@ -0,0 +1,31 @@
+...
+:: :=
+= == ===
+< <= > >=
+| ^ ? '
+# ! ~ `
++ - * /
++. -. *. /.
+mod land lor lxor
+lsl lsr asr
+|> ->
+
+----------------------------------------------------
+
+[
+ ["operator", "..."],
+ ["operator", "::"], ["operator", ":="],
+ ["operator", "="], ["operator", "=="], ["operator", "==="],
+ ["operator", "<"], ["operator", "<="], ["operator", ">"], ["operator", ">="],
+ ["operator", "|"], ["operator", "^"], ["operator", "?"], ["operator", "'"],
+ ["operator", "#"], ["operator", "!"], ["operator", "~"], ["operator", "`"],
+ ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"],
+ ["operator", "+."], ["operator", "-."], ["operator", "*."], ["operator", "/."],
+ ["operator", "mod"], ["operator", "land"], ["operator", "lor"], ["operator", "lxor"],
+ ["operator", "lsl"], ["operator", "lsr"], ["operator", "asr"],
+ ["operator", "|>"], ["operator", "->"]
+]
+
+----------------------------------------------------
+
+Checks for operators.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/reason/string_feature.test b/package/src/prism/tests/languages/reason/string_feature.test
new file mode 100644
index 00000000..24bb9926
--- /dev/null
+++ b/package/src/prism/tests/languages/reason/string_feature.test
@@ -0,0 +1,13 @@
+""
+"foo\"bar"
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"foo\\\"bar\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/regex/anchor_feature.test b/package/src/prism/tests/languages/regex/anchor_feature.test
new file mode 100644
index 00000000..b09a4310
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/anchor_feature.test
@@ -0,0 +1,25 @@
+^
+$
+\A
+\G
+\Z
+\z
+\b
+\B
+
+----------------------------------------------------
+
+[
+ ["anchor", "^"],
+ ["anchor", "$"],
+ ["anchor", "\\A"],
+ ["anchor", "\\G"],
+ ["anchor", "\\Z"],
+ ["anchor", "\\z"],
+ ["anchor", "\\b"],
+ ["anchor", "\\B"]
+]
+
+----------------------------------------------------
+
+Checks for anchors.
diff --git a/package/src/prism/tests/languages/regex/backreference_feature.test b/package/src/prism/tests/languages/regex/backreference_feature.test
new file mode 100644
index 00000000..fab6226d
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/backreference_feature.test
@@ -0,0 +1,26 @@
+\1 \2 \3 \4 \5 \6 \7 \8 \9
+\k
+
+----------------------------------------------------
+
+[
+ ["backreference", "\\1"],
+ ["backreference", "\\2"],
+ ["backreference", "\\3"],
+ ["backreference", "\\4"],
+ ["backreference", "\\5"],
+ ["backreference", "\\6"],
+ ["backreference", "\\7"],
+ ["backreference", "\\8"],
+ ["backreference", "\\9"],
+
+ ["backreference", [
+ "\\k<",
+ ["group-name", "name"],
+ ">"
+ ]]
+]
+
+----------------------------------------------------
+
+Checks for backreferences.
diff --git a/package/src/prism/tests/languages/regex/char-class_feature.test b/package/src/prism/tests/languages/regex/char-class_feature.test
new file mode 100644
index 00000000..1c278a52
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/char-class_feature.test
@@ -0,0 +1,48 @@
+[]
+[^]
+[foo]
+[\]\b]
+[.^$\1]
+[\d\D\p{L}]
+
+----------------------------------------------------
+
+[
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["char-class-negation", "^"],
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ "foo",
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["special-escape", "\\]"],
+ ["escape", "\\b"],
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ".^$",
+ ["escape", "\\1"],
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["char-set", "\\d"],
+ ["char-set", "\\D"],
+ ["char-set", "\\p{L}"],
+ ["char-class-punctuation", "]"]
+ ]]
+]
+
+----------------------------------------------------
+
+Checks for character sets.
diff --git a/package/src/prism/tests/languages/regex/char-set_feature.test b/package/src/prism/tests/languages/regex/char-set_feature.test
new file mode 100644
index 00000000..6ea56ddc
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/char-set_feature.test
@@ -0,0 +1,21 @@
+.
+\w \W
+\s \S
+\d \D
+\p{ASCII}
+\P{ASCII}
+
+----------------------------------------------------
+
+[
+ ["char-set", "."],
+ ["char-set", "\\w"], ["char-set", "\\W"],
+ ["char-set", "\\s"], ["char-set", "\\S"],
+ ["char-set", "\\d"], ["char-set", "\\D"],
+ ["char-set", "\\p{ASCII}"],
+ ["char-set", "\\P{ASCII}"]
+]
+
+----------------------------------------------------
+
+Checks for character classes.
diff --git a/package/src/prism/tests/languages/regex/escape_feature.test b/package/src/prism/tests/languages/regex/escape_feature.test
new file mode 100644
index 00000000..460faa70
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/escape_feature.test
@@ -0,0 +1,42 @@
+\0 \\ \. \+
+\xFF
+\uFFFF \u{10FFFF}
+\cA \cZ
+\01 \077 \377
+\n \r \t \f \a
+
+\[ \]
+
+----------------------------------------------------
+
+[
+ ["escape", "\\0"],
+ ["special-escape", "\\\\"],
+ ["special-escape", "\\."],
+ ["special-escape", "\\+"],
+
+ ["escape", "\\xFF"],
+
+ ["escape", "\\uFFFF"],
+ ["escape", "\\u{10FFFF}"],
+
+ ["escape", "\\cA"],
+ ["escape", "\\cZ"],
+
+ ["escape", "\\01"],
+ ["escape", "\\077"],
+ ["escape", "\\377"],
+
+ ["escape", "\\n"],
+ ["escape", "\\r"],
+ ["escape", "\\t"],
+ ["escape", "\\f"],
+ ["escape", "\\a"],
+
+ ["special-escape", "\\["],
+ ["special-escape", "\\]"]
+]
+
+----------------------------------------------------
+
+Checks for escapes.
diff --git a/package/src/prism/tests/languages/regex/group_feature.test b/package/src/prism/tests/languages/regex/group_feature.test
new file mode 100644
index 00000000..bb7e0878
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/group_feature.test
@@ -0,0 +1,67 @@
+()
+(?:)
+(?>)
+(?=) (?!)
+(?<=) (?)
+(?'name')
+
+(?i)
+(?i:)
+(?idmsuxU-idmsuxU)
+(?idmsux-idmsux:X)
+
+----------------------------------------------------
+
+[
+ ["group", "("],
+ ["group", ")"],
+
+ ["group", "("],
+ ["group", ["?:"]],
+ ["group", ")"],
+
+ ["group", "("],
+ ["group", ["?>"]],
+ ["group", ")"],
+
+ ["group", "("],
+ ["group", ["?="]],
+ ["group", ")"],
+ ["group", "("],
+ ["group", ["?!"]],
+ ["group", ")"],
+
+ ["group", "("],
+ ["group", ["?<="]],
+ ["group", ")"],
+ ["group", "("],
+ ["group", ["?"
+ ]],
+ ["group", ")"],
+
+ ["group", "("],
+ ["group", [
+ "?'",
+ ["group-name", "name"],
+ "'"
+ ]],
+ ["group", ")"],
+
+ ["group", "("], ["group", ["?i"]], ["group", ")"],
+ ["group", "("], ["group", ["?i:"]], ["group", ")"],
+ ["group", "("], ["group", ["?idmsuxU-idmsuxU"]], ["group", ")"],
+ ["group", "("], ["group", ["?idmsux-idmsux:"]], "X", ["group", ")"]
+]
+
+----------------------------------------------------
+
+Checks for groups.
diff --git a/package/src/prism/tests/languages/regex/quantifier_feature.test b/package/src/prism/tests/languages/regex/quantifier_feature.test
new file mode 100644
index 00000000..bd4e9bf9
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/quantifier_feature.test
@@ -0,0 +1,37 @@
+* + ?
+{2} {2,} {0,1}
+
+*? +? ??
+{2}? {2,}? {0,1}?
+
+*+ ++ ?+
+{2}+ {2,}+ {0,1}+
+
+----------------------------------------------------
+
+[
+ ["quantifier", "*"],
+ ["quantifier", "+"],
+ ["quantifier", "?"],
+ ["quantifier", "{2}"],
+ ["quantifier", "{2,}"],
+ ["quantifier", "{0,1}"],
+
+ ["quantifier", "*?"],
+ ["quantifier", "+?"],
+ ["quantifier", "??"],
+ ["quantifier", "{2}?"],
+ ["quantifier", "{2,}?"],
+ ["quantifier", "{0,1}?"],
+
+ ["quantifier", "*+"],
+ ["quantifier", "++"],
+ ["quantifier", "?+"],
+ ["quantifier", "{2}+"],
+ ["quantifier", "{2,}+"],
+ ["quantifier", "{0,1}+"]
+]
+
+----------------------------------------------------
+
+Checks for quantifiers.
diff --git a/package/src/prism/tests/languages/regex/range_feature.test b/package/src/prism/tests/languages/regex/range_feature.test
new file mode 100644
index 00000000..fc1fb680
--- /dev/null
+++ b/package/src/prism/tests/languages/regex/range_feature.test
@@ -0,0 +1,51 @@
+[a-zA-Z0-9]
+[\xa1-Z\u00FF-\u{256}]
+[^-aaa-]
+
+----------------------------------------------------
+
+[
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["range", [
+ "a",
+ ["range-punctuation", "-"],
+ "z"
+ ]],
+ ["range", [
+ "A",
+ ["range-punctuation", "-"],
+ "Z"
+ ]],
+ ["range", [
+ "0",
+ ["range-punctuation", "-"],
+ "9"
+ ]],
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["range", [
+ ["escape", "\\xa1"],
+ ["range-punctuation", "-"],
+ "Z"
+ ]],
+ ["range", [
+ ["escape", "\\u00FF"],
+ ["range-punctuation", "-"],
+ ["escape", "\\u{256}"]
+ ]],
+ ["char-class-punctuation", "]"]
+ ]],
+ ["char-class", [
+ ["char-class-punctuation", "["],
+ ["char-class-negation", "^"],
+ "-aaa-",
+ ["char-class-punctuation", "]"]
+ ]]
+]
+
+----------------------------------------------------
+
+Checks for character ranges in sets.
diff --git a/package/src/prism/tests/languages/rego/boolean_feature.test b/package/src/prism/tests/languages/rego/boolean_feature.test
new file mode 100644
index 00000000..ca34f181
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/boolean_feature.test
@@ -0,0 +1,13 @@
+true
+false
+
+----------------------------------------------------
+
+[
+ ["boolean", "true"],
+ ["boolean", "false"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
diff --git a/package/src/prism/tests/languages/rego/comment_feature.test b/package/src/prism/tests/languages/rego/comment_feature.test
new file mode 100644
index 00000000..710014b8
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/comment_feature.test
@@ -0,0 +1,13 @@
+#
+# foobar
+
+----------------------------------------------------
+
+[
+ ["comment", "#"],
+ ["comment", "# foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/rego/function_feature.test b/package/src/prism/tests/languages/rego/function_feature.test
new file mode 100644
index 00000000..1d68dc07
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/function_feature.test
@@ -0,0 +1,173 @@
+object.remove({"a": {"b": {"c": 2}}, "x": 123}, {"a": 1}) == {"x": 123}
+
+output := is_set(x)
+output := intersection(set[set])
+output := regex.match(pattern, value)
+output := glob.match("*.github.com", [], "api.github.com")
+output := bits.rsh(x, s)
+output := io.jwt.verify_ps384(string, certificate)
+
+io.jwt.encode_sign({
+ "typ": "JWT",
+ "alg": "HS256"},
+ {}, {
+ "kty": "oct",
+ "k": "AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"
+})
+
+----------------------------------------------------
+
+[
+ ["function", [
+ ["namespace", "object"],
+ ["punctuation", "."],
+ "remove"
+ ]],
+ ["punctuation", "("],
+ ["punctuation", "{"],
+ ["property", "\"a\""],
+ ["operator", ":"],
+ ["punctuation", "{"],
+ ["property", "\"b\""],
+ ["operator", ":"],
+ ["punctuation", "{"],
+ ["property", "\"c\""],
+ ["operator", ":"],
+ ["number", "2"],
+ ["punctuation", "}"],
+ ["punctuation", "}"],
+ ["punctuation", ","],
+ ["property", "\"x\""],
+ ["operator", ":"],
+ ["number", "123"],
+ ["punctuation", "}"],
+ ["punctuation", ","],
+ ["punctuation", "{"],
+ ["property", "\"a\""],
+ ["operator", ":"],
+ ["number", "1"],
+ ["punctuation", "}"],
+ ["punctuation", ")"],
+ ["operator", "=="],
+ ["punctuation", "{"],
+ ["property", "\"x\""],
+ ["operator", ":"],
+ ["number", "123"],
+ ["punctuation", "}"],
+
+ "\n\noutput ",
+ ["operator", ":="],
+ ["function", ["is_set"]],
+ ["punctuation", "("],
+ "x",
+ ["punctuation", ")"],
+
+ "\noutput ",
+ ["operator", ":="],
+ ["function", ["intersection"]],
+ ["punctuation", "("],
+ "set",
+ ["punctuation", "["],
+ "set",
+ ["punctuation", "]"],
+ ["punctuation", ")"],
+
+ "\noutput ",
+ ["operator", ":="],
+ ["function", [
+ ["namespace", "regex"],
+ ["punctuation", "."],
+ "match"
+ ]],
+ ["punctuation", "("],
+ "pattern",
+ ["punctuation", ","],
+ " value",
+ ["punctuation", ")"],
+
+ "\noutput ",
+ ["operator", ":="],
+ ["function", [
+ ["namespace", "glob"],
+ ["punctuation", "."],
+ "match"
+ ]],
+ ["punctuation", "("],
+ ["string", "\"*.github.com\""],
+ ["punctuation", ","],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", ","],
+ ["string", "\"api.github.com\""],
+ ["punctuation", ")"],
+
+ "\noutput ",
+ ["operator", ":="],
+ ["function", [
+ ["namespace", "bits"],
+ ["punctuation", "."],
+ "rsh"
+ ]],
+ ["punctuation", "("],
+ "x",
+ ["punctuation", ","],
+ " s",
+ ["punctuation", ")"],
+
+ "\noutput ",
+ ["operator", ":="],
+ ["function", [
+ ["namespace", "io"],
+ ["punctuation", "."],
+ ["namespace", "jwt"],
+ ["punctuation", "."],
+ "verify_ps384"
+ ]],
+ ["punctuation", "("],
+ "string",
+ ["punctuation", ","],
+ " certificate",
+ ["punctuation", ")"],
+
+ ["function", [
+ ["namespace", "io"],
+ ["punctuation", "."],
+ ["namespace", "jwt"],
+ ["punctuation", "."],
+ "encode_sign"
+ ]],
+ ["punctuation", "("],
+ ["punctuation", "{"],
+
+ ["property", "\"typ\""],
+ ["operator", ":"],
+ ["string", "\"JWT\""],
+ ["punctuation", ","],
+
+ ["property", "\"alg\""],
+ ["operator", ":"],
+ ["string", "\"HS256\""],
+ ["punctuation", "}"],
+ ["punctuation", ","],
+
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+ ["punctuation", ","],
+ ["punctuation", "{"],
+
+ ["property", "\"kty\""],
+ ["operator", ":"],
+ ["string", "\"oct\""],
+ ["punctuation", ","],
+
+ ["property", "\"k\""],
+ ["operator", ":"],
+ ["string", "\"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\""],
+
+ ["punctuation", "}"],
+ ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for all functions.
diff --git a/package/src/prism/tests/languages/rego/keyword_feature.test b/package/src/prism/tests/languages/rego/keyword_feature.test
new file mode 100644
index 00000000..9f37e66a
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/keyword_feature.test
@@ -0,0 +1,31 @@
+as
+default
+else
+import
+package
+not
+null
+some
+with
+
+set()
+
+----------------------------------------------------
+
+[
+ ["keyword", "as"],
+ ["keyword", "default"],
+ ["keyword", "else"],
+ ["keyword", "import"],
+ ["keyword", "package"],
+ ["keyword", "not"],
+ ["keyword", "null"],
+ ["keyword", "some"],
+ ["keyword", "with"],
+
+ ["keyword", "set"], ["punctuation", "("], ["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Checks for all keywords.
diff --git a/package/src/prism/tests/languages/rego/number_feature.test b/package/src/prism/tests/languages/rego/number_feature.test
new file mode 100644
index 00000000..79d2fe81
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/number_feature.test
@@ -0,0 +1,23 @@
+0
+123
+3.14159
+5.0e8
+0.2E+2
+47e-5
+-1.23
+-2.34E33
+-4.34E-33
+
+----------------------------------------------------
+
+[
+ ["number", "0"],
+ ["number", "123"],
+ ["number", "3.14159"],
+ ["number", "5.0e8"],
+ ["number", "0.2E+2"],
+ ["number", "47e-5"],
+ ["number", "-1.23"],
+ ["number", "-2.34E33"],
+ ["number", "-4.34E-33"]
+]
diff --git a/package/src/prism/tests/languages/rego/operator_feature.test b/package/src/prism/tests/languages/rego/operator_feature.test
new file mode 100644
index 00000000..8641cffc
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/operator_feature.test
@@ -0,0 +1,35 @@
+:= = :
+== != < <= > >=
++ - / * %
+& |
+_
+
+----------------------------------------------------
+
+[
+ ["operator", ":="],
+ ["operator", "="],
+ ["operator", ":"],
+
+ ["operator", "=="],
+ ["operator", "!="],
+ ["operator", "<"],
+ ["operator", "<="],
+ ["operator", ">"],
+ ["operator", ">="],
+
+ ["operator", "+"],
+ ["operator", "-"],
+ ["operator", "/"],
+ ["operator", "*"],
+ ["operator", "%"],
+
+ ["operator", "&"],
+ ["operator", "|"],
+
+ ["operator", "_"]
+]
+
+----------------------------------------------------
+
+Checks for operators.
diff --git a/package/src/prism/tests/languages/rego/property_feature.test b/package/src/prism/tests/languages/rego/property_feature.test
new file mode 100644
index 00000000..b696e6d5
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/property_feature.test
@@ -0,0 +1,208 @@
+instances[instance] {
+ server := sites[_].servers[_]
+ instance := {"address": server.hostname, "name": server.name}
+} {
+ container := containers[_]
+ instance := {"address": container.ipaddress, "name": container.name}
+}
+
+apps := [
+ {
+ "name": "web",
+ "servers": ["web-0", "web-1", "web-1000", "web-1001", "web-dev"]
+ },
+ {
+ "name": "mysql",
+ "servers": ["db-0", "db-1000"]
+ },
+ {
+ "name": "mongodb",
+ "servers": ["db-dev"]
+ }
+]
+
+not allow with input as {"user": "charlie", "method": "GET"} with data.roles as {"dev": ["bob"]}
+
+allow with input as {"user": "charlie", "method": "GET"} with data.roles as {"dev": ["charlie"]}
+
+----------------------------------------------------
+
+[
+ "instances",
+ ["punctuation", "["],
+ "instance",
+ ["punctuation", "]"],
+ ["punctuation", "{"],
+
+ "\n server ",
+ ["operator", ":="],
+ " sites",
+ ["punctuation", "["],
+ ["operator", "_"],
+ ["punctuation", "]"],
+ ["punctuation", "."],
+ "servers",
+ ["punctuation", "["],
+ ["operator", "_"],
+ ["punctuation", "]"],
+
+ "\n instance ",
+ ["operator", ":="],
+ ["punctuation", "{"],
+ ["property", "\"address\""],
+ ["operator", ":"],
+ " server",
+ ["punctuation", "."],
+ "hostname",
+ ["punctuation", ","],
+ ["property", "\"name\""],
+ ["operator", ":"],
+ " server",
+ ["punctuation", "."],
+ "name",
+ ["punctuation", "}"],
+
+ ["punctuation", "}"],
+ ["punctuation", "{"],
+
+ "\n container ",
+ ["operator", ":="],
+ " containers",
+ ["punctuation", "["],
+ ["operator", "_"],
+ ["punctuation", "]"],
+
+ "\n instance ",
+ ["operator", ":="],
+ ["punctuation", "{"],
+ ["property", "\"address\""],
+ ["operator", ":"],
+ " container",
+ ["punctuation", "."],
+ "ipaddress",
+ ["punctuation", ","],
+ ["property", "\"name\""],
+ ["operator", ":"],
+ " container",
+ ["punctuation", "."],
+ "name",
+ ["punctuation", "}"],
+
+ ["punctuation", "}"],
+
+ "\n\napps ",
+ ["operator", ":="],
+ ["punctuation", "["],
+
+ ["punctuation", "{"],
+
+ ["property", "\"name\""],
+ ["operator", ":"],
+ ["string", "\"web\""],
+ ["punctuation", ","],
+
+ ["property", "\"servers\""],
+ ["operator", ":"],
+ ["punctuation", "["],
+ ["string", "\"web-0\""],
+ ["punctuation", ","],
+ ["string", "\"web-1\""],
+ ["punctuation", ","],
+ ["string", "\"web-1000\""],
+ ["punctuation", ","],
+ ["string", "\"web-1001\""],
+ ["punctuation", ","],
+ ["string", "\"web-dev\""],
+ ["punctuation", "]"],
+
+ ["punctuation", "}"],
+ ["punctuation", ","],
+
+ ["punctuation", "{"],
+
+ ["property", "\"name\""],
+ ["operator", ":"],
+ ["string", "\"mysql\""],
+ ["punctuation", ","],
+
+ ["property", "\"servers\""],
+ ["operator", ":"],
+ ["punctuation", "["],
+ ["string", "\"db-0\""],
+ ["punctuation", ","],
+ ["string", "\"db-1000\""],
+ ["punctuation", "]"],
+
+ ["punctuation", "}"],
+ ["punctuation", ","],
+
+ ["punctuation", "{"],
+
+ ["property", "\"name\""],
+ ["operator", ":"],
+ ["string", "\"mongodb\""],
+ ["punctuation", ","],
+
+ ["property", "\"servers\""],
+ ["operator", ":"],
+ ["punctuation", "["],
+ ["string", "\"db-dev\""],
+ ["punctuation", "]"],
+
+ ["punctuation", "}"],
+
+ ["punctuation", "]"],
+
+ ["keyword", "not"],
+ " allow ",
+ ["keyword", "with"],
+ " input ",
+ ["keyword", "as"],
+ ["punctuation", "{"],
+ ["property", "\"user\""],
+ ["operator", ":"],
+ ["string", "\"charlie\""],
+ ["punctuation", ","],
+ ["property", "\"method\""],
+ ["operator", ":"],
+ ["string", "\"GET\""],
+ ["punctuation", "}"],
+ ["keyword", "with"],
+ " data",
+ ["punctuation", "."],
+ "roles ",
+ ["keyword", "as"],
+ ["punctuation", "{"],
+ ["property", "\"dev\""],
+ ["operator", ":"],
+ ["punctuation", "["],
+ ["string", "\"bob\""],
+ ["punctuation", "]"],
+ ["punctuation", "}"],
+
+ "\n\nallow ",
+ ["keyword", "with"],
+ " input ",
+ ["keyword", "as"],
+ ["punctuation", "{"],
+ ["property", "\"user\""],
+ ["operator", ":"],
+ ["string", "\"charlie\""],
+ ["punctuation", ","],
+ ["property", "\"method\""],
+ ["operator", ":"],
+ ["string", "\"GET\""],
+ ["punctuation", "}"],
+ ["keyword", "with"],
+ " data",
+ ["punctuation", "."],
+ "roles ",
+ ["keyword", "as"],
+ ["punctuation", "{"],
+ ["property", "\"dev\""],
+ ["operator", ":"],
+ ["punctuation", "["],
+ ["string", "\"charlie\""],
+ ["punctuation", "]"],
+ ["punctuation", "}"]
+]
\ No newline at end of file
diff --git a/package/src/prism/tests/languages/rego/punctuation_feature.test b/package/src/prism/tests/languages/rego/punctuation_feature.test
new file mode 100644
index 00000000..7b24c73a
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/punctuation_feature.test
@@ -0,0 +1,17 @@
+, ; .
+( ) [ ] { }
+
+----------------------------------------------------
+
+[
+ ["punctuation", ","],
+ ["punctuation", ";"],
+ ["punctuation", "."],
+
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", "{"],
+ ["punctuation", "}"]
+]
diff --git a/package/src/prism/tests/languages/rego/string_feature.test b/package/src/prism/tests/languages/rego/string_feature.test
new file mode 100644
index 00000000..f30b43cc
--- /dev/null
+++ b/package/src/prism/tests/languages/rego/string_feature.test
@@ -0,0 +1,43 @@
+""
+"foo\"bar"
+`raw-string`
+
+jwks = `{
+ "keys": [{
+ "kty":"EC",
+ "crv":"P-256",
+ "x":"z8J91ghFy5o6f2xZ4g8LsLH7u2wEpT2ntj8loahnlsE",
+ "y":"7bdeXLH61KrGWRdh7ilnbcGQACxykaPKfmBccTHIOUo"
+ }]
+}`
+
+cert = `-----BEGIN CERTIFICATE-----
+MIIBcDCCARagAwIBAgIJAMZmuGSIfvgzMAoGCCqGSM49BAMCMBMxETAPBgNVBAMM
+CHdoYXRldmVyMB4XDTE4MDgxMDE0Mjg1NFoXDTE4MDkwOTE0Mjg1NFowEzERMA8G
+A1UEAwwId2hhdGV2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATPwn3WCEXL
+mjp/bFniDwuwsfu7bASlPae2PyWhqGeWwe23Xlyx+tSqxlkXYe4pZ23BkAAscpGj
+yn5gXHExyDlKo1MwUTAdBgNVHQ4EFgQUElRjSoVgKjUqY5AXz2o74cLzzS8wHwYD
+VR0jBBgwFoAUElRjSoVgKjUqY5AXz2o74cLzzS8wDwYDVR0TAQH/BAUwAwEB/zAK
+BggqhkjOPQQDAgNIADBFAiEA4yQ/88ZrUX68c6kOe9G11u8NUaUzd8pLOtkKhniN
+OHoCIHmNX37JOqTcTzGn2u9+c8NlnvZ0uDvsd1BmKPaUmjmm
+-----END CERTIFICATE-----`
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "\"foo\\\"bar\""],
+ ["string", "`raw-string`"],
+
+ "\n\njwks ",
+ ["operator", "="],
+ ["string", "`{\n \"keys\": [{\n \"kty\":\"EC\",\n \"crv\":\"P-256\",\n \"x\":\"z8J91ghFy5o6f2xZ4g8LsLH7u2wEpT2ntj8loahnlsE\",\n \"y\":\"7bdeXLH61KrGWRdh7ilnbcGQACxykaPKfmBccTHIOUo\"\n }]\n}`"],
+
+ "\n\ncert ",
+ ["operator", "="],
+ ["string", "`-----BEGIN CERTIFICATE-----\nMIIBcDCCARagAwIBAgIJAMZmuGSIfvgzMAoGCCqGSM49BAMCMBMxETAPBgNVBAMM\nCHdoYXRldmVyMB4XDTE4MDgxMDE0Mjg1NFoXDTE4MDkwOTE0Mjg1NFowEzERMA8G\nA1UEAwwId2hhdGV2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATPwn3WCEXL\nmjp/bFniDwuwsfu7bASlPae2PyWhqGeWwe23Xlyx+tSqxlkXYe4pZ23BkAAscpGj\nyn5gXHExyDlKo1MwUTAdBgNVHQ4EFgQUElRjSoVgKjUqY5AXz2o74cLzzS8wHwYD\nVR0jBBgwFoAUElRjSoVgKjUqY5AXz2o74cLzzS8wDwYDVR0TAQH/BAUwAwEB/zAK\nBggqhkjOPQQDAgNIADBFAiEA4yQ/88ZrUX68c6kOe9G11u8NUaUzd8pLOtkKhniN\nOHoCIHmNX37JOqTcTzGn2u9+c8NlnvZ0uDvsd1BmKPaUmjmm\n-----END CERTIFICATE-----`"]
+]
+
+----------------------------------------------------
+
+Checks for strings.
diff --git a/package/src/prism/tests/languages/renpy/boolean_feature.test b/package/src/prism/tests/languages/renpy/boolean_feature.test
new file mode 100644
index 00000000..30c2be15
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/boolean_feature.test
@@ -0,0 +1,9 @@
+true false
+True False
+
+----------------------------------------------------
+
+[
+ ["boolean", "true"], ["boolean", "false"],
+ ["boolean", "True"], ["boolean", "False"]
+]
diff --git a/package/src/prism/tests/languages/renpy/comment_feature.test b/package/src/prism/tests/languages/renpy/comment_feature.test
new file mode 100644
index 00000000..7883a734
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/comment_feature.test
@@ -0,0 +1,7 @@
+# comment
+
+----------------------------------------------------
+
+[
+ ["comment", "# comment"]
+]
diff --git a/package/src/prism/tests/languages/renpy/function_feature.test b/package/src/prism/tests/languages/renpy/function_feature.test
new file mode 100644
index 00000000..3ec94de7
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/function_feature.test
@@ -0,0 +1,43 @@
+renpy.register_bmfont("bmfont", 22, filename="bmfont.fnt")
+
+# Resize the background of the text window if it's too small.
+init python:
+ style.window.background = Frame("frame.png", 10, 10)
+
+----------------------------------------------------
+
+[
+ ["keyword", "renpy"],
+ ["punctuation", "."],
+ ["function", "register_bmfont"],
+ ["punctuation", "("],
+ ["string", "\"bmfont\""],
+ ["punctuation", ","],
+ ["number", "22"],
+ ["punctuation", ","],
+ " filename",
+ ["operator", "="],
+ ["string", "\"bmfont.fnt\""],
+ ["punctuation", ")"],
+
+ ["comment", "# Resize the background of the text window if it's too small."],
+
+ ["keyword", "init"],
+ ["keyword", "python"],
+ ["punctuation", ":"],
+
+ ["keyword", "style"],
+ ["punctuation", "."],
+ ["tag", "window"],
+ ["punctuation", "."],
+ ["property", "background"],
+ ["operator", "="],
+ ["function", "Frame"],
+ ["punctuation", "("],
+ ["string", "\"frame.png\""],
+ ["punctuation", ","],
+ ["number", "10"],
+ ["punctuation", ","],
+ ["number", "10"],
+ ["punctuation", ")"]
+]
diff --git a/package/src/prism/tests/languages/renpy/keyword_feature.test b/package/src/prism/tests/languages/renpy/keyword_feature.test
new file mode 100644
index 00000000..410cacf4
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/keyword_feature.test
@@ -0,0 +1,239 @@
+; None
+; add
+; adjustment
+; alignaround
+; allow
+; angle
+; animation
+; around
+; as
+; assert
+; behind
+; box_layout
+; break
+; build
+; cache
+; call
+; center
+; changed
+; child_size
+; choice
+; circles
+; class
+; clear
+; clicked
+; clipping
+; clockwise
+; config
+; contains
+; continue
+; corner1
+; corner2
+; counterclockwise
+; def
+; default
+; define
+; del
+; delay
+; disabled
+; disabled_text
+; dissolve
+; elif
+; else
+; event
+; except
+; exclude
+; exec
+; expression
+; fade
+; finally
+; for
+; from
+; function
+; global
+; gm_root
+; has
+; hide
+; id
+; if
+; import
+; in
+; init
+; is
+; jump
+; knot
+; lambda
+; left
+; less_rounded
+; mm_root
+; movie
+; music
+; null
+; on
+; onlayer
+; pass
+; pause
+; persistent
+; play
+; print
+; python
+; queue
+; raise
+; random
+; renpy
+; repeat
+; return
+; right
+; rounded_window
+; scene
+; scope
+; set
+; show
+; slow
+; slow_abortable
+; slow_done
+; sound
+; stop
+; store
+; style
+; style_group
+; substitute
+; suffix
+; theme
+; transform
+; transform_anchor
+; transpose
+; try
+; ui
+; unhovered
+; updater
+; use
+; voice
+; while
+; widget
+; widget_hover
+; widget_selected
+; widget_text
+; yield
+
+----------------------------------------------------
+
+[
+ ["punctuation", ";"], ["keyword", "None"],
+ ["punctuation", ";"], ["keyword", "add"],
+ ["punctuation", ";"], ["keyword", "adjustment"],
+ ["punctuation", ";"], ["keyword", "alignaround"],
+ ["punctuation", ";"], ["keyword", "allow"],
+ ["punctuation", ";"], ["keyword", "angle"],
+ ["punctuation", ";"], ["keyword", "animation"],
+ ["punctuation", ";"], ["keyword", "around"],
+ ["punctuation", ";"], ["keyword", "as"],
+ ["punctuation", ";"], ["keyword", "assert"],
+ ["punctuation", ";"], ["keyword", "behind"],
+ ["punctuation", ";"], ["keyword", "box_layout"],
+ ["punctuation", ";"], ["keyword", "break"],
+ ["punctuation", ";"], ["keyword", "build"],
+ ["punctuation", ";"], ["keyword", "cache"],
+ ["punctuation", ";"], ["keyword", "call"],
+ ["punctuation", ";"], ["keyword", "center"],
+ ["punctuation", ";"], ["keyword", "changed"],
+ ["punctuation", ";"], ["keyword", "child_size"],
+ ["punctuation", ";"], ["keyword", "choice"],
+ ["punctuation", ";"], ["keyword", "circles"],
+ ["punctuation", ";"], ["keyword", "class"],
+ ["punctuation", ";"], ["keyword", "clear"],
+ ["punctuation", ";"], ["keyword", "clicked"],
+ ["punctuation", ";"], ["keyword", "clipping"],
+ ["punctuation", ";"], ["keyword", "clockwise"],
+ ["punctuation", ";"], ["keyword", "config"],
+ ["punctuation", ";"], ["keyword", "contains"],
+ ["punctuation", ";"], ["keyword", "continue"],
+ ["punctuation", ";"], ["keyword", "corner1"],
+ ["punctuation", ";"], ["keyword", "corner2"],
+ ["punctuation", ";"], ["keyword", "counterclockwise"],
+ ["punctuation", ";"], ["keyword", "def"],
+ ["punctuation", ";"], ["keyword", "default"],
+ ["punctuation", ";"], ["keyword", "define"],
+ ["punctuation", ";"], ["keyword", "del"],
+ ["punctuation", ";"], ["keyword", "delay"],
+ ["punctuation", ";"], ["keyword", "disabled"],
+ ["punctuation", ";"], ["keyword", "disabled_text"],
+ ["punctuation", ";"], ["keyword", "dissolve"],
+ ["punctuation", ";"], ["keyword", "elif"],
+ ["punctuation", ";"], ["keyword", "else"],
+ ["punctuation", ";"], ["keyword", "event"],
+ ["punctuation", ";"], ["keyword", "except"],
+ ["punctuation", ";"], ["keyword", "exclude"],
+ ["punctuation", ";"], ["keyword", "exec"],
+ ["punctuation", ";"], ["keyword", "expression"],
+ ["punctuation", ";"], ["keyword", "fade"],
+ ["punctuation", ";"], ["keyword", "finally"],
+ ["punctuation", ";"], ["keyword", "for"],
+ ["punctuation", ";"], ["keyword", "from"],
+ ["punctuation", ";"], ["keyword", "function"],
+ ["punctuation", ";"], ["keyword", "global"],
+ ["punctuation", ";"], ["keyword", "gm_root"],
+ ["punctuation", ";"], ["keyword", "has"],
+ ["punctuation", ";"], ["keyword", "hide"],
+ ["punctuation", ";"], ["keyword", "id"],
+ ["punctuation", ";"], ["keyword", "if"],
+ ["punctuation", ";"], ["keyword", "import"],
+ ["punctuation", ";"], ["keyword", "in"],
+ ["punctuation", ";"], ["keyword", "init"],
+ ["punctuation", ";"], ["keyword", "is"],
+ ["punctuation", ";"], ["keyword", "jump"],
+ ["punctuation", ";"], ["keyword", "knot"],
+ ["punctuation", ";"], ["keyword", "lambda"],
+ ["punctuation", ";"], ["keyword", "left"],
+ ["punctuation", ";"], ["keyword", "less_rounded"],
+ ["punctuation", ";"], ["keyword", "mm_root"],
+ ["punctuation", ";"], ["keyword", "movie"],
+ ["punctuation", ";"], ["keyword", "music"],
+ ["punctuation", ";"], ["keyword", "null"],
+ ["punctuation", ";"], ["keyword", "on"],
+ ["punctuation", ";"], ["keyword", "onlayer"],
+ ["punctuation", ";"], ["keyword", "pass"],
+ ["punctuation", ";"], ["keyword", "pause"],
+ ["punctuation", ";"], ["keyword", "persistent"],
+ ["punctuation", ";"], ["keyword", "play"],
+ ["punctuation", ";"], ["keyword", "print"],
+ ["punctuation", ";"], ["keyword", "python"],
+ ["punctuation", ";"], ["keyword", "queue"],
+ ["punctuation", ";"], ["keyword", "raise"],
+ ["punctuation", ";"], ["keyword", "random"],
+ ["punctuation", ";"], ["keyword", "renpy"],
+ ["punctuation", ";"], ["keyword", "repeat"],
+ ["punctuation", ";"], ["keyword", "return"],
+ ["punctuation", ";"], ["keyword", "right"],
+ ["punctuation", ";"], ["keyword", "rounded_window"],
+ ["punctuation", ";"], ["keyword", "scene"],
+ ["punctuation", ";"], ["keyword", "scope"],
+ ["punctuation", ";"], ["keyword", "set"],
+ ["punctuation", ";"], ["keyword", "show"],
+ ["punctuation", ";"], ["keyword", "slow"],
+ ["punctuation", ";"], ["keyword", "slow_abortable"],
+ ["punctuation", ";"], ["keyword", "slow_done"],
+ ["punctuation", ";"], ["keyword", "sound"],
+ ["punctuation", ";"], ["keyword", "stop"],
+ ["punctuation", ";"], ["keyword", "store"],
+ ["punctuation", ";"], ["keyword", "style"],
+ ["punctuation", ";"], ["keyword", "style_group"],
+ ["punctuation", ";"], ["keyword", "substitute"],
+ ["punctuation", ";"], ["keyword", "suffix"],
+ ["punctuation", ";"], ["keyword", "theme"],
+ ["punctuation", ";"], ["keyword", "transform"],
+ ["punctuation", ";"], ["keyword", "transform_anchor"],
+ ["punctuation", ";"], ["keyword", "transpose"],
+ ["punctuation", ";"], ["keyword", "try"],
+ ["punctuation", ";"], ["keyword", "ui"],
+ ["punctuation", ";"], ["keyword", "unhovered"],
+ ["punctuation", ";"], ["keyword", "updater"],
+ ["punctuation", ";"], ["keyword", "use"],
+ ["punctuation", ";"], ["keyword", "voice"],
+ ["punctuation", ";"], ["keyword", "while"],
+ ["punctuation", ";"], ["keyword", "widget"],
+ ["punctuation", ";"], ["keyword", "widget_hover"],
+ ["punctuation", ";"], ["keyword", "widget_selected"],
+ ["punctuation", ";"], ["keyword", "widget_text"],
+ ["punctuation", ";"], ["keyword", "yield"]
+]
diff --git a/package/src/prism/tests/languages/renpy/property_feature.test b/package/src/prism/tests/languages/renpy/property_feature.test
new file mode 100644
index 00000000..0eab089f
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/property_feature.test
@@ -0,0 +1,469 @@
+insensitive
+idle
+hover
+selected_idle
+selected_hover
+background
+position
+alt
+xpos
+ypos
+pos
+xanchor
+yanchor
+anchor
+xalign
+yalign
+align
+xcenter
+ycenter
+xofsset
+yoffset
+ymaximum
+maximum
+xmaximum
+xminimum
+yminimum
+minimum
+xsize
+ysizexysize
+xfill
+yfill
+area
+antialias
+black_color
+bold
+caret
+color
+first_indent
+font
+size
+italic
+justify
+kerning
+language
+layout
+line_leading
+line_overlap_split
+line_spacing
+min_width
+newline_indent
+outlines
+rest_indent
+ruby_style
+slow_cps
+slow_cps_multiplier
+strikethrough
+text_align
+underline
+hyperlink_functions
+vertical
+hinting
+foreground
+left_margin
+xmargin
+top_margin
+bottom_margin
+ymargin
+left_padding
+right_padding
+xpadding
+top_padding
+bottom_padding
+ypadding
+size_group
+child
+hover_sound
+activate_sound
+mouse
+focus_mask
+keyboard_focus
+bar_vertical
+bar_invert
+bar_resizing
+left_gutter
+right_gutter
+top_gutter
+bottom_gutter
+left_bar
+right_bar
+top_bar
+bottom_bar
+thumb
+thumb_shadow
+thumb_offset
+unscrollable
+spacing
+first_spacing
+box_reverse
+box_wrap
+order_reverse
+fit_first
+ysize
+thumbnail_width
+thumbnail_height
+help
+text_ypos
+text_xpos
+idle_color
+hover_color
+selected_idle_color
+selected_hover_color
+insensitive_color
+alpha
+insensitive_background
+hover_background
+zorder
+value
+width
+xadjustment
+xanchoraround
+xaround
+xinitial
+xoffset
+xzoom
+yadjustment
+yanchoraround
+yaround
+yinitial
+yzoom
+zoom
+ground
+height
+text_style
+text_y_fudge
+selected_insensitive
+has_sound
+has_music
+has_voice
+focus
+hovered
+image_style
+length
+minwidth
+mousewheel
+offset
+prefix
+radius
+range
+right_margin
+rotate
+rotate_pad
+developer
+screen_width
+screen_height
+window_title
+name
+version
+windows_icon
+default_fullscreen
+default_text_cps
+default_afm_time
+main_menu_music
+sample_sound
+enter_sound
+exit_sound
+save_directory
+enter_transition
+exit_transition
+intra_transition
+main_game_transition
+game_main_transition
+end_splash_transition
+end_game_transition
+after_load_transition
+window_show_transition
+window_hide_transition
+adv_nvl_transition
+nvl_adv_transition
+enter_yesno_transition
+exit_yesno_transition
+enter_replay_transition
+exit_replay_transition
+say_attribute_transition
+directory_name
+executable_name
+include_update
+window_icon
+modal
+google_play_key
+google_play_salt
+drag_name
+drag_handle
+draggable
+dragged
+droppable
+dropped
+narrator_menu
+action
+default_afm_enable
+version_name
+version_tuple
+inside
+fadeout
+fadein
+layers
+layer_clipping
+linear
+scrollbars
+side_xpos
+side_ypos
+side_spacing
+edgescroll
+drag_joined
+drag_raise
+drop_shadow
+drop_shadow_color
+subpixel
+easein
+easeout
+time
+crop
+auto
+update
+get_installed_packages
+can_update
+UpdateVersion
+Update
+overlay_functions
+translations
+window_left_padding
+show_side_image
+show_two_window
+
+----------------------------------------------------
+
+[
+ ["property", "insensitive"],
+ ["property", "idle"],
+ ["property", "hover"],
+ ["property", "selected_idle"],
+ ["property", "selected_hover"],
+ ["property", "background"],
+ ["property", "position"],
+ ["property", "alt"],
+ ["property", "xpos"],
+ ["property", "ypos"],
+ ["property", "pos"],
+ ["property", "xanchor"],
+ ["property", "yanchor"],
+ ["property", "anchor"],
+ ["property", "xalign"],
+ ["property", "yalign"],
+ ["property", "align"],
+ ["property", "xcenter"],
+ ["property", "ycenter"],
+ ["property", "xofsset"],
+ ["property", "yoffset"],
+ ["property", "ymaximum"],
+ ["property", "maximum"],
+ ["property", "xmaximum"],
+ ["property", "xminimum"],
+ ["property", "yminimum"],
+ ["property", "minimum"],
+ ["property", "xsize"],
+ ["property", "ysizexysize"],
+ ["property", "xfill"],
+ ["property", "yfill"],
+ ["property", "area"],
+ ["property", "antialias"],
+ ["property", "black_color"],
+ ["property", "bold"],
+ ["property", "caret"],
+ ["property", "color"],
+ ["property", "first_indent"],
+ ["property", "font"],
+ ["property", "size"],
+ ["property", "italic"],
+ ["property", "justify"],
+ ["property", "kerning"],
+ ["property", "language"],
+ ["property", "layout"],
+ ["property", "line_leading"],
+ ["property", "line_overlap_split"],
+ ["property", "line_spacing"],
+ ["property", "min_width"],
+ ["property", "newline_indent"],
+ ["property", "outlines"],
+ ["property", "rest_indent"],
+ ["property", "ruby_style"],
+ ["property", "slow_cps"],
+ ["property", "slow_cps_multiplier"],
+ ["property", "strikethrough"],
+ ["property", "text_align"],
+ ["property", "underline"],
+ ["property", "hyperlink_functions"],
+ ["property", "vertical"],
+ ["property", "hinting"],
+ ["property", "foreground"],
+ ["property", "left_margin"],
+ ["property", "xmargin"],
+ ["property", "top_margin"],
+ ["property", "bottom_margin"],
+ ["property", "ymargin"],
+ ["property", "left_padding"],
+ ["property", "right_padding"],
+ ["property", "xpadding"],
+ ["property", "top_padding"],
+ ["property", "bottom_padding"],
+ ["property", "ypadding"],
+ ["property", "size_group"],
+ ["property", "child"],
+ ["property", "hover_sound"],
+ ["property", "activate_sound"],
+ ["property", "mouse"],
+ ["property", "focus_mask"],
+ ["property", "keyboard_focus"],
+ ["property", "bar_vertical"],
+ ["property", "bar_invert"],
+ ["property", "bar_resizing"],
+ ["property", "left_gutter"],
+ ["property", "right_gutter"],
+ ["property", "top_gutter"],
+ ["property", "bottom_gutter"],
+ ["property", "left_bar"],
+ ["property", "right_bar"],
+ ["property", "top_bar"],
+ ["property", "bottom_bar"],
+ ["property", "thumb"],
+ ["property", "thumb_shadow"],
+ ["property", "thumb_offset"],
+ ["property", "unscrollable"],
+ ["property", "spacing"],
+ ["property", "first_spacing"],
+ ["property", "box_reverse"],
+ ["property", "box_wrap"],
+ ["property", "order_reverse"],
+ ["property", "fit_first"],
+ ["property", "ysize"],
+ ["property", "thumbnail_width"],
+ ["property", "thumbnail_height"],
+ ["property", "help"],
+ ["property", "text_ypos"],
+ ["property", "text_xpos"],
+ ["property", "idle_color"],
+ ["property", "hover_color"],
+ ["property", "selected_idle_color"],
+ ["property", "selected_hover_color"],
+ ["property", "insensitive_color"],
+ ["property", "alpha"],
+ ["property", "insensitive_background"],
+ ["property", "hover_background"],
+ ["property", "zorder"],
+ ["property", "value"],
+ ["property", "width"],
+ ["property", "xadjustment"],
+ ["property", "xanchoraround"],
+ ["property", "xaround"],
+ ["property", "xinitial"],
+ ["property", "xoffset"],
+ ["property", "xzoom"],
+ ["property", "yadjustment"],
+ ["property", "yanchoraround"],
+ ["property", "yaround"],
+ ["property", "yinitial"],
+ ["property", "yzoom"],
+ ["property", "zoom"],
+ ["property", "ground"],
+ ["property", "height"],
+ ["property", "text_style"],
+ ["property", "text_y_fudge"],
+ ["property", "selected_insensitive"],
+ ["property", "has_sound"],
+ ["property", "has_music"],
+ ["property", "has_voice"],
+ ["property", "focus"],
+ ["property", "hovered"],
+ ["property", "image_style"],
+ ["property", "length"],
+ ["property", "minwidth"],
+ ["property", "mousewheel"],
+ ["property", "offset"],
+ ["property", "prefix"],
+ ["property", "radius"],
+ ["property", "range"],
+ ["property", "right_margin"],
+ ["property", "rotate"],
+ ["property", "rotate_pad"],
+ ["property", "developer"],
+ ["property", "screen_width"],
+ ["property", "screen_height"],
+ ["property", "window_title"],
+ ["property", "name"],
+ ["property", "version"],
+ ["property", "windows_icon"],
+ ["property", "default_fullscreen"],
+ ["property", "default_text_cps"],
+ ["property", "default_afm_time"],
+ ["property", "main_menu_music"],
+ ["property", "sample_sound"],
+ ["property", "enter_sound"],
+ ["property", "exit_sound"],
+ ["property", "save_directory"],
+ ["property", "enter_transition"],
+ ["property", "exit_transition"],
+ ["property", "intra_transition"],
+ ["property", "main_game_transition"],
+ ["property", "game_main_transition"],
+ ["property", "end_splash_transition"],
+ ["property", "end_game_transition"],
+ ["property", "after_load_transition"],
+ ["property", "window_show_transition"],
+ ["property", "window_hide_transition"],
+ ["property", "adv_nvl_transition"],
+ ["property", "nvl_adv_transition"],
+ ["property", "enter_yesno_transition"],
+ ["property", "exit_yesno_transition"],
+ ["property", "enter_replay_transition"],
+ ["property", "exit_replay_transition"],
+ ["property", "say_attribute_transition"],
+ ["property", "directory_name"],
+ ["property", "executable_name"],
+ ["property", "include_update"],
+ ["property", "window_icon"],
+ ["property", "modal"],
+ ["property", "google_play_key"],
+ ["property", "google_play_salt"],
+ ["property", "drag_name"],
+ ["property", "drag_handle"],
+ ["property", "draggable"],
+ ["property", "dragged"],
+ ["property", "droppable"],
+ ["property", "dropped"],
+ ["property", "narrator_menu"],
+ ["property", "action"],
+ ["property", "default_afm_enable"],
+ ["property", "version_name"],
+ ["property", "version_tuple"],
+ ["property", "inside"],
+ ["property", "fadeout"],
+ ["property", "fadein"],
+ ["property", "layers"],
+ ["property", "layer_clipping"],
+ ["property", "linear"],
+ ["property", "scrollbars"],
+ ["property", "side_xpos"],
+ ["property", "side_ypos"],
+ ["property", "side_spacing"],
+ ["property", "edgescroll"],
+ ["property", "drag_joined"],
+ ["property", "drag_raise"],
+ ["property", "drop_shadow"],
+ ["property", "drop_shadow_color"],
+ ["property", "subpixel"],
+ ["property", "easein"],
+ ["property", "easeout"],
+ ["property", "time"],
+ ["property", "crop"],
+ ["property", "auto"],
+ ["property", "update"],
+ ["property", "get_installed_packages"],
+ ["property", "can_update"],
+ ["property", "UpdateVersion"],
+ ["property", "Update"],
+ ["property", "overlay_functions"],
+ ["property", "translations"],
+ ["property", "window_left_padding"],
+ ["property", "show_side_image"],
+ ["property", "show_two_window"]
+]
diff --git a/package/src/prism/tests/languages/renpy/string_feature.test b/package/src/prism/tests/languages/renpy/string_feature.test
new file mode 100644
index 00000000..7606ed20
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/string_feature.test
@@ -0,0 +1,29 @@
+"# This isn't a comment, since it's part of a string."
+
+"Since this line contains a string, it continues
+ even when the line ends."
+
+$ a = [ "Because of parenthesis, this line also",
+ "spans more than one line." ]
+
+'Strings can\'t contain their delimiter, unless you escape it.'
+
+----------------------------------------------------
+
+[
+ ["string", "\"# This isn't a comment, since it's part of a string.\""],
+
+ ["string", "\"Since this line contains a string, it continues\n even when the line ends.\""],
+
+ ["tag", "$"],
+ " a ",
+ ["operator", "="],
+ ["punctuation", "["],
+ ["string", "\"Because of parenthesis, this line also\""],
+ ["punctuation", ","],
+
+ ["string", "\"spans more than one line.\""],
+ ["punctuation", "]"],
+
+ ["string", "'Strings can\\'t contain their delimiter, unless you escape it.'"]
+]
diff --git a/package/src/prism/tests/languages/renpy/tag_feature.test b/package/src/prism/tests/languages/renpy/tag_feature.test
new file mode 100644
index 00000000..1bc9484d
--- /dev/null
+++ b/package/src/prism/tests/languages/renpy/tag_feature.test
@@ -0,0 +1,75 @@
+label
+image
+menu
+hbox
+vbox
+frame
+text
+imagemap
+imagebutton
+bar
+vbar
+screen
+textbutton
+buttoscreenn
+fixed
+grid
+input
+key
+mousearea
+side
+timer
+viewport
+window
+hotspot
+hotbar
+self
+button
+drag
+draggroup
+tag
+mm_menu_frame
+nvl
+block
+
+$
+
+----------------------------------------------------
+
+[
+ ["tag", "label"],
+ ["tag", "image"],
+ ["tag", "menu"],
+ ["tag", "hbox"],
+ ["tag", "vbox"],
+ ["tag", "frame"],
+ ["tag", "text"],
+ ["tag", "imagemap"],
+ ["tag", "imagebutton"],
+ ["tag", "bar"],
+ ["tag", "vbar"],
+ ["tag", "screen"],
+ ["tag", "textbutton"],
+ ["tag", "buttoscreenn"],
+ ["tag", "fixed"],
+ ["tag", "grid"],
+ ["tag", "input"],
+ ["tag", "key"],
+ ["tag", "mousearea"],
+ ["tag", "side"],
+ ["tag", "timer"],
+ ["tag", "viewport"],
+ ["tag", "window"],
+ ["tag", "hotspot"],
+ ["tag", "hotbar"],
+ ["tag", "self"],
+ ["tag", "button"],
+ ["tag", "drag"],
+ ["tag", "draggroup"],
+ ["tag", "tag"],
+ ["tag", "mm_menu_frame"],
+ ["tag", "nvl"],
+ ["tag", "block"],
+
+ ["tag", "$"]
+]
diff --git a/package/src/prism/tests/languages/rescript/attr-value_feature.test b/package/src/prism/tests/languages/rescript/attr-value_feature.test
new file mode 100644
index 00000000..50a2b5a2
--- /dev/null
+++ b/package/src/prism/tests/languages/rescript/attr-value_feature.test
@@ -0,0 +1,20 @@
+