aboutsummaryrefslogtreecommitdiff
path: root/plugins/language_nim.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/language_nim.lua')
-rw-r--r--plugins/language_nim.lua120
1 files changed, 120 insertions, 0 deletions
diff --git a/plugins/language_nim.lua b/plugins/language_nim.lua
new file mode 100644
index 0000000..af230e4
--- /dev/null
+++ b/plugins/language_nim.lua
@@ -0,0 +1,120 @@
+local syntax = require "core.syntax"
+
+local patterns = {}
+
+local symbols = {
+ ["nil"] = "literal",
+ ["true"] = "literal",
+ ["false"] = "literal",
+}
+
+local number_patterns = {
+ "0[bB][01][01_]*",
+ "0o[0-7][0-7_]*",
+ "0[xX]%x[%x_]*",
+ "%d[%d_]*%.%d[%d_]*[eE][-+]?%d[%d_]*",
+ "%d[%d_]*%.%d[%d_]*",
+ "%d[%d_]*",
+}
+
+local type_suffix_patterns = {}
+
+for _, size in ipairs({"", "8", "16", "32", "64"}) do
+ table.insert(type_suffix_patterns, "'?[fuiFUI]"..size)
+end
+
+for _, pattern in ipairs(number_patterns) do
+ for _, suffix in ipairs(type_suffix_patterns) do
+ table.insert(patterns, { pattern = pattern..suffix, type = "literal" })
+ end
+ table.insert(patterns, { pattern = pattern, type = "literal" })
+end
+
+local keywords = {
+ "addr", "and", "as", "asm",
+ "bind", "block", "break",
+ "case", "cast", "concept", "const", "continue", "converter",
+ "defer", "discard", "distinct", "div", "do",
+ "elif", "else", "end", "enum", "except", "export",
+ "finally", "for", "from", "func",
+ "if", "import", "in", "include", "interface", "is", "isnot", "iterator",
+ "let",
+ "macro", "method", "mixin", "mod",
+ "not", "notin",
+ "object", "of", "or", "out",
+ "proc", "ptr",
+ "raise", "ref", "return",
+ "shl", "shr", "static",
+ "template", "try", "tuple", "type",
+ "using",
+ "var",
+ "when", "while",
+ "xor",
+ "yield",
+}
+
+for _, keyword in ipairs(keywords) do
+ symbols[keyword] = "keyword"
+end
+
+local standard_types = {
+ "bool", "byte",
+ "int", "int8", "int16", "int32", "int64",
+ "uint", "uint8", "uint16", "uint32", "uint64",
+ "float", "float32", "float64",
+ "char", "string", "cstring",
+ "pointer",
+ "typedesc",
+ "void", "auto", "any",
+ "untyped", "typed",
+ "clong", "culong", "cchar", "cschar", "cshort", "cint", "csize", "csize_t",
+ "clonglong", "cfloat", "cdouble", "clongdouble", "cuchar", "cushort",
+ "cuint", "culonglong", "cstringArray",
+}
+
+for _, type in ipairs(standard_types) do
+ symbols[type] = "keyword2"
+end
+
+local standard_generic_types = {
+ "range",
+ "array", "open[aA]rray", "varargs", "seq", "set",
+ "sink", "lent", "owned",
+}
+
+for _, type in ipairs(standard_generic_types) do
+ table.insert(patterns, { pattern = type.."%f[%[]", type = "keyword2" })
+ table.insert(patterns, { pattern = type.." +%f[%w]", type = "keyword2" })
+end
+
+local user_patterns = {
+ -- comments
+ { pattern = { "##?%[", "]##?" }, type = "comment" },
+ { pattern = "##?.-\n", type = "comment" },
+ -- strings and chars
+ { pattern = { '"', '"', '\\' }, type = "string" },
+ { pattern = { '"""', '"""[^"]' }, type = "string" },
+ { pattern = { "'", "'", '\\' }, type = "literal" },
+ -- function calls
+ { pattern = "[a-zA-Z][a-zA-Z0-9_]*%f[(]", type = "function" },
+ -- identifiers
+ { pattern = "[A-Z][a-zA-Z0-9_]*", type = "keyword2" },
+ { pattern = "[a-zA-Z][a-zA-Z0-9_]*", type = "symbol" },
+ -- operators
+ { pattern = "%.%f[^.]", type = "normal" },
+ { pattern = ":%f[ ]", type = "normal" },
+ { pattern = "[=+%-*/<>@$~&%%|!?%^&.:\\]+", type = "operator" },
+}
+
+for _, pattern in ipairs(user_patterns) do
+ table.insert(patterns, pattern)
+end
+
+local nim = {
+ files = { "%.nim$", "%.nims$", "%.nimble$" },
+ comment = "#",
+ patterns = patterns,
+ symbols = symbols,
+}
+
+syntax.add(nim)