This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
# -*- 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
|
||||
Reference in New Issue
Block a user