rf-web/vendor/bundle/gems/rouge-3.12.0/lib/rouge/lexers/hylang.rb
2019-10-21 10:18:17 +02:00

95 lines
3.1 KiB
Ruby

# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
class HyLang < RegexLexer
title "HyLang"
desc "The HyLang programming language (hylang.org)"
tag 'hylang'
aliases 'hy'
filenames '*.hy'
mimetypes 'text/x-hy', 'application/x-hy'
def self.keywords
@keywords ||= Set.new %w(
False None True and as assert break class continue def
del elif else except finally for from global if import
in is lambda nonlocal not or pass raise return try
)
end
def self.builtins
@builtins ||= Set.new %w(
!= % %= & &= * ** **= *= *map
+ += , - -= -> ->> . / //
//= /= < << <<= <= = > >= >>
>>= @ @= ^ ^= accumulate apply as-> assoc butlast
calling-module-name car cdr chain coll? combinations comp complement compress cond
cons cons? constantly count cut cycle dec defclass defmacro defmacro!
defmacro/g! defmain defn defreader dict-comp disassemble dispatch-reader-macro distinct do doto
drop drop-last drop-while empty? eval eval-and-compile eval-when-compile even? every? filter
first flatten float? fn for* fraction genexpr gensym get group-by
identity if* if-not if-python2 inc input instance? integer integer-char? integer?
interleave interpose islice iterable? iterate iterator? juxt keyword keyword? last
let lif lif-not list* list-comp macro-error macroexpand macroexpand-1 map merge-with
multicombinations name neg? none? not-in not? nth numeric? odd? partition
permutations pos? product quasiquote quote range read read-str reduce remove
repeat repeatedly require rest second set-comp setv some string string?
symbol? take take-nth take-while tee unless unquote unquote-splicing when with*
with-decorator with-gensyms xor yield-from zero? zip zip-longest | |= ~
)
end
identifier = %r([\w!$%*+,<=>?/.-]+)
keyword = %r([\w!\#$%*+,<=>?/.-]+)
def name_token(name)
return Keyword if self.class.keywords.include?(name)
return Name::Builtin if self.class.builtins.include?(name)
nil
end
state :root do
rule %r/;.*?$/, Comment::Single
rule %r/\s+/m, Text::Whitespace
rule %r/-?\d+\.\d+/, Num::Float
rule %r/-?\d+/, Num::Integer
rule %r/0x-?[0-9a-fA-F]+/, Num::Hex
rule %r/"(\\.|[^"])*"/, Str
rule %r/'#{keyword}/, Str::Symbol
rule %r/::?#{keyword}/, Name::Constant
rule %r/\\(.|[a-z]+)/i, Str::Char
rule %r/~@|[`\'#^~&@]/, Operator
rule %r/(\()(\s*)(#{identifier})/m do |m|
token Punctuation, m[1]
token Text::Whitespace, m[2]
token(name_token(m[3]) || Name::Function, m[3])
end
rule identifier do |m|
token name_token(m[0]) || Name
end
# vectors
rule %r/[\[\]]/, Punctuation
# maps
rule %r/[{}]/, Punctuation
# parentheses
rule %r/[()]/, Punctuation
end
end
end
end