95 lines
3.1 KiB
Ruby
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
|
|
|