219 lines
8.4 KiB
Ruby
219 lines
8.4 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
class Janet < RegexLexer
|
|
title "Janet"
|
|
desc "The Janet programming language (janet-lang.org)"
|
|
|
|
tag 'janet'
|
|
aliases 'jdn'
|
|
|
|
filenames '*.janet', '*.jdn'
|
|
|
|
mimetypes 'text/x-janet', 'application/x-janet'
|
|
|
|
def self.specials
|
|
@specials ||= Set.new %w(
|
|
break def do fn if quote quasiquote splice set unquote var while
|
|
)
|
|
end
|
|
|
|
def self.bundled
|
|
@bundled ||= Set.new %w(
|
|
% %= * *= + ++ += - -- -= -> ->> -?> -?>> / /= < <= = > >=
|
|
abstract? accumulate accumulate2 all all-bindings
|
|
all-dynamics and apply array array/concat array/ensure
|
|
array/fill array/insert array/new array/new-filled
|
|
array/peek array/pop array/push array/remove array/slice
|
|
array? as-> as?-> asm assert bad-compile bad-parse band
|
|
blshift bnot boolean? bor brshift brushift buffer buffer/bit
|
|
buffer/bit-clear buffer/bit-set buffer/bit-toggle
|
|
buffer/blit buffer/clear buffer/fill buffer/format
|
|
buffer/new buffer/new-filled buffer/popn buffer/push-byte
|
|
buffer/push-string buffer/push-word buffer/slice buffer?
|
|
bxor bytes? case cfunction? chr cli-main comment comp
|
|
compare compare= compare< compare<= compare> compare>=
|
|
compile complement comptime cond coro count debug
|
|
debug/arg-stack debug/break debug/fbreak debug/lineage
|
|
debug/stack debug/stacktrace debug/step debug/unbreak
|
|
debug/unfbreak debugger-env dec deep-not= deep= default
|
|
default-peg-grammar def- defer defmacro defmacro- defn defn-
|
|
defglobal describe dictionary? disasm distinct doc doc*
|
|
doc-format dofile drop drop-until drop-while dyn each eachk
|
|
eachp eachy edefer eflush empty? env-lookup eprin eprinf
|
|
eprint eprintf error errorf eval eval-string even? every?
|
|
extreme false? fiber/can-resume? fiber/current fiber/getenv
|
|
fiber/maxstack fiber/new fiber/root fiber/setenv
|
|
fiber/setmaxstack fiber/status fiber? file/close file/flush
|
|
file/open file/popen file/read file/seek file/temp
|
|
file/write filter find find-index first flatten flatten-into
|
|
flush for forv freeze frequencies function? gccollect
|
|
gcinterval gcsetinterval generate gensym get get-in getline
|
|
hash idempotent? identity import import* if-let if-not
|
|
if-with in inc indexed? int/s64 int/u64 int? interleave
|
|
interpose invert janet/build janet/config-bits janet/version
|
|
juxt juxt* keep keys keyword keyword? kvs label last length
|
|
let load-image load-image-dict loop macex macex1 make-env
|
|
make-image make-image-dict map mapcat marshal math/-inf
|
|
math/abs math/acos math/acosh math/asin math/asinh math/atan
|
|
math/atan2 math/atanh math/cbrt math/ceil math/cos math/cosh
|
|
math/e math/erf math/erfc math/exp math/exp2 math/expm1
|
|
math/floor math/gamma math/hypot math/inf math/log
|
|
math/log10 math/log1p math/log2 math/next math/pi math/pow
|
|
math/random math/rng math/rng-buffer math/rng-int
|
|
math/rng-uniform math/round math/seedrandom math/sin
|
|
math/sinh math/sqrt math/tan math/tanh math/trunc match max
|
|
mean merge merge-into min mod module/add-paths module/cache
|
|
module/expand-path module/find module/loaders module/loading
|
|
module/paths nan? nat? native neg? net/chunk net/close
|
|
net/connect net/read net/server net/write next nil? not not=
|
|
number? odd? one? or os/arch os/cd os/chmod os/clock
|
|
os/cryptorand os/cwd os/date os/dir os/environ os/execute
|
|
os/exit os/getenv os/link os/lstat os/mkdir os/mktime
|
|
os/perm-int os/perm-string os/readlink os/realpath os/rename
|
|
os/rm os/rmdir os/setenv os/shell os/sleep os/stat
|
|
os/symlink os/time os/touch os/umask os/which pairs parse
|
|
parser/byte parser/clone parser/consume parser/eof
|
|
parser/error parser/flush parser/has-more parser/insert
|
|
parser/new parser/produce parser/state parser/status
|
|
parser/where partial partition peg/compile peg/match pos?
|
|
postwalk pp prewalk prin prinf print printf product prompt
|
|
propagate protect put put-in quit range reduce reduce2
|
|
repeat repl require resume return reverse reversed root-env
|
|
run-context scan-number seq setdyn shortfn signal slice
|
|
slurp some sort sort-by sorted sorted-by spit stderr stdin
|
|
stdout string string/ascii-lower string/ascii-upper
|
|
string/bytes string/check-set string/find string/find-all
|
|
string/format string/from-bytes string/has-prefix?
|
|
string/has-suffix? string/join string/repeat string/replace
|
|
string/replace-all string/reverse string/slice string/split
|
|
string/trim string/triml string/trimr string? struct struct?
|
|
sum symbol symbol? table table/clone table/getproto
|
|
table/new table/rawget table/setproto table/to-struct table?
|
|
take take-until take-while tarray/buffer tarray/copy-bytes
|
|
tarray/length tarray/new tarray/properties tarray/slice
|
|
tarray/swap-bytes thread/close thread/current thread/new
|
|
thread/receive thread/send trace tracev true? truthy? try
|
|
tuple tuple/brackets tuple/setmap tuple/slice
|
|
tuple/sourcemap tuple/type tuple? type unless unmarshal
|
|
untrace update update-in use values var- varfn varglobal
|
|
walk walk-ind walk-dict when when-let when-with with
|
|
with-dyns with-syms with-vars yield zero? zipcoll
|
|
)
|
|
end
|
|
|
|
def name_token(name)
|
|
if self.class.specials.include? name
|
|
Keyword
|
|
elsif self.class.bundled.include? name
|
|
Keyword::Reserved
|
|
else
|
|
Name::Function
|
|
end
|
|
end
|
|
|
|
punctuation = %r/[_!$%^&*+=~<>.?\/-]/o
|
|
symbol = %r/([[:alpha:]]|#{punctuation})([[:word:]]|#{punctuation}|:)*/o
|
|
|
|
state :root do
|
|
rule %r/#.*?$/, Comment::Single
|
|
rule %r/\s+/m, Text::Whitespace
|
|
|
|
rule %r/(true|false|nil)\b/, Name::Constant
|
|
rule %r/(['~])(#{symbol})/ do
|
|
groups Operator, Str::Symbol
|
|
end
|
|
rule %r/:([[:word:]]|#{punctuation}|:)*/, Keyword::Constant
|
|
|
|
# radix-specified numbers
|
|
rule %r/[+-]?\d{1,2}r[\w.]+(&[+-]?\w+)?/, Num::Float
|
|
|
|
# hex numbers
|
|
rule %r/[+-]?0x\h[\h_]*(\.\h[\h_]*)?/, Num::Hex
|
|
rule %r/[+-]?0x\.\h[\h_]*/, Num::Hex
|
|
|
|
# decimal numbers (Janet treats all decimals as floats)
|
|
rule %r/[+-]?\d[\d_]*(\.\d[\d_]*)?([e][+-]?\d+)?/i, Num::Float
|
|
rule %r/[+-]?\.\d[\d_]*([e][+-]?\d+)?/i, Num::Float
|
|
|
|
rule %r/@?"/, Str::Double, :string
|
|
rule %r/@?(`+).*?\1/m, Str::Heredoc
|
|
|
|
rule %r/\(/, Punctuation, :function
|
|
|
|
rule %r/(')(@?[(\[{])/ do
|
|
groups Operator, Punctuation
|
|
push :quote
|
|
end
|
|
|
|
rule %r/(~)(@?[(\[{])/ do
|
|
groups Operator, Punctuation
|
|
push :quasiquote
|
|
end
|
|
|
|
rule %r/[\#~,';\|]/, Operator
|
|
|
|
rule %r/@?[(){}\[\]]/, Punctuation
|
|
|
|
rule symbol, Name
|
|
end
|
|
|
|
state :string do
|
|
rule %r/"/, Str::Double, :pop!
|
|
rule %r/\\(u\h{4}|U\h{6})/, Str::Escape
|
|
rule %r/\\./, Str::Escape
|
|
rule %r/[^"\\]+/, Str::Double
|
|
end
|
|
|
|
state :function do
|
|
rule %r/[\)]/, Punctuation, :pop!
|
|
|
|
rule symbol do |m|
|
|
case m[0]
|
|
when "quote"
|
|
token Keyword
|
|
goto :quote
|
|
when "quasiquote"
|
|
token Keyword
|
|
goto :quasiquote
|
|
else
|
|
token name_token(m[0])
|
|
goto :root
|
|
end
|
|
end
|
|
|
|
mixin :root
|
|
end
|
|
|
|
state :quote do
|
|
rule %r/[(\[{]/, Punctuation, :push
|
|
rule %r/[)\]}]/, Punctuation, :pop!
|
|
rule symbol, Str::Escape
|
|
mixin :root
|
|
end
|
|
|
|
state :quasiquote do
|
|
rule %r/(,)(\()/ do
|
|
groups Operator, Punctuation
|
|
push :function
|
|
end
|
|
rule %r/(\()(\s*)(unquote)(\s+)(\()/ do
|
|
groups Punctuation, Text, Keyword, Text, Punctuation
|
|
push :function
|
|
end
|
|
|
|
rule %r/(,)(#{symbol})/ do
|
|
groups Operator, Name
|
|
end
|
|
rule %r/(\()(\s*)(unquote)(\s+)(#{symbol})/ do
|
|
groups Punctuation, Text, Keyword, Text, Name
|
|
end
|
|
|
|
mixin :quote
|
|
end
|
|
end
|
|
end
|
|
end
|