/usr/lib/ruby/vendor_ruby/rugments/lexers/nim.rb is in ruby-rugments 1.0.0~beta8-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | module Rugments
module Lexers
class Nim < RegexLexer
# This is pretty much a 1-1 port of the pygments NimrodLexer class
title 'Nim'
desc 'The Nim programming language (http://nim-lang.org/)'
tag 'nim'
aliases 'nimrod'
filenames '*.nim'
KEYWORDS = %w(
addr as asm atomic bind block break case cast const continue
converter defer discard distinct do elif else end enum except export
func finally for from generic if import include interface iterator let
macro method mixin nil object of out proc ptr raise ref return static
template try tuple type using var when while with without yield
)
OPWORDS = %w(
and or not xor shl shr div mod in notin is isnot
)
PSEUDOKEYWORDS = %w(
nil true false
)
TYPES = %w(
int int8 int16 int32 int64 float float32 float64 bool char range array
seq set string
)
NAMESPACE = %w(
from import include
)
def self.underscorize(words)
words.map do |w|
w.gsub(/./) { |x| "#{Regexp.escape(x)}_?" }
end.join('|')
end
state :chars do
rule(/\\([\\abcefnrtvl"\']|x[a-fA-F0-9]{2}|[0-9]{1,3})/, Str::Escape)
rule(/'/, Str::Char, :pop!)
rule(/./, Str::Char)
end
state :strings do
rule(/(?<!\$)\$(\d+|#|\w+)+/, Str::Interpol)
rule(/[^\\\'"\$\n]+/, Str)
rule(/[\'"\\]/, Str)
rule(/\$/, Str)
end
state :dqs do
rule(/\\([\\abcefnrtvl"\']|\n|x[a-fA-F0-9]{2}|[0-9]{1,3})/,
Str::Escape)
rule(/"/, Str, :pop!)
mixin :strings
end
state :rdqs do
rule(/"(?!")/, Str, :pop!)
rule(/"/, Str::Escape, :pop!)
mixin :strings
end
state :tdqs do
rule(/"""(?!")/, Str, :pop!)
mixin :strings
mixin :nl
end
state :funcname do
rule(/((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*/, Name::Function, :pop!)
rule(/`.+`/, Name::Function, :pop!)
end
state :nl do
rule(/\n/, Str)
end
state :floatnumber do
rule(/\.(?!\.)[0-9_]*/, Num::Float)
rule(/[eE][+-]?[0-9][0-9_]*/, Num::Float)
rule(//, Text, :pop!)
end
# Making apostrophes optional, as only hexadecimal with type suffix
# possibly ambiguous.
state :floatsuffix do
rule(/'?[fF](32|64)/, Num::Float)
rule(//, Text, :pop!)
end
state :intsuffix do
rule(/'?[iI](32|64)/, Num::Integer::Long)
rule(/'?[iI](8|16)/, Num::Integer)
rule(/'?[uU]/, Num::Integer)
rule(//, Text, :pop!)
end
state :root do
rule(/##.*$/, Str::Doc)
rule(/#.*$/, Comment)
rule(/\*|=|>|<|\+|-|\/|@|\$|~|&|%|\!|\?|\||\\|\[|\]/, Operator)
rule(/\.\.|\.|,|\[\.|\.\]|{\.|\.}|\(\.|\.\)|{|}|\(|\)|:|\^|`|;/,
Punctuation)
# Strings
rule(/(?:[\w]+)"/, Str, :rdqs)
rule(/"""/, Str, :tdqs)
rule(/"/, Str, :dqs)
# Char
rule(/'/, Str::Char, :chars)
# Keywords
rule(%r{(#{Nim.underscorize(OPWORDS)})\b}, Operator::Word)
rule(/(p_?r_?o_?c_?\s)(?![\(\[\]])/, Keyword, :funcname)
rule(%r{(#{Nim.underscorize(KEYWORDS)})\b}, Keyword)
rule(%r{(#{Nim.underscorize(NAMESPACE)})\b}, Keyword::Namespace)
rule(/(v_?a_?r)\b/, Keyword::Declaration)
rule(%r{(#{Nim.underscorize(TYPES)})\b}, Keyword::Type)
rule(%r{(#{Nim.underscorize(PSEUDOKEYWORDS)})\b}, Keyword::Pseudo)
# Identifiers
rule(/\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*/, Name)
# Numbers
# Note: Have to do this with a block to push multiple states first,
# since we can't pass array of states like w/ Pygments.
rule(/[0-9][0-9_]*(?=([eE.]|'?[fF](32|64)))/) do |_number|
push :floatsuffix
push :floatnumber
token Num::Float
end
rule(/0[xX][a-fA-F0-9][a-fA-F0-9_]*/, Num::Hex, :intsuffix)
rule(/0[bB][01][01_]*/, Num, :intsuffix)
rule(/0o[0-7][0-7_]*/, Num::Oct, :intsuffix)
rule(/[0-9][0-9_]*/, Num::Integer, :intsuffix)
# Whitespace
rule(/\s+/, Text)
rule(/.+$/, Error)
end
end
end
end
|