170 lines
4.8 KiB
Ruby
170 lines
4.8 KiB
Ruby
|
# -*- coding: utf-8 #
|
|||
|
# frozen_string_literal: true
|
|||
|
|
|||
|
module Rouge
|
|||
|
module Lexers
|
|||
|
class Scala < RegexLexer
|
|||
|
title "Scala"
|
|||
|
desc "The Scala programming language (scala-lang.org)"
|
|||
|
tag 'scala'
|
|||
|
aliases 'scala'
|
|||
|
filenames '*.scala', '*.sbt'
|
|||
|
|
|||
|
mimetypes 'text/x-scala', 'application/x-scala'
|
|||
|
|
|||
|
# As documented in the ENBF section of the scala specification
|
|||
|
# http://www.scala-lang.org/docu/files/ScalaReference.pdf
|
|||
|
whitespace = /\p{Space}/
|
|||
|
letter = /[\p{L}$_]/
|
|||
|
upper = /[\p{Lu}$_]/
|
|||
|
digits = /[0-9]/
|
|||
|
parens = /[(){}\[\]]/
|
|||
|
delims = %r([‘’".;,])
|
|||
|
|
|||
|
# negative lookahead to filter out other classes
|
|||
|
op = %r(
|
|||
|
(?!#{whitespace}|#{letter}|#{digits}|#{parens}|#{delims})
|
|||
|
[\u0020-\u007F\p{Sm}\p{So}]
|
|||
|
)x
|
|||
|
|
|||
|
idrest = %r(#{letter}(?:#{letter}|#{digits})*(?:(?<=_)#{op}+)?)x
|
|||
|
|
|||
|
keywords = %w(
|
|||
|
abstract case catch def do else extends final finally for forSome
|
|||
|
if implicit lazy match new override private protected requires return
|
|||
|
sealed super this throw try val var while with yield
|
|||
|
)
|
|||
|
|
|||
|
state :root do
|
|||
|
rule %r/(class|trait|object)(\s+)/ do
|
|||
|
groups Keyword, Text
|
|||
|
push :class
|
|||
|
end
|
|||
|
rule %r/'#{idrest}[^']/, Str::Symbol
|
|||
|
rule %r/[^\S\n]+/, Text
|
|||
|
|
|||
|
rule %r(//.*?\n), Comment::Single
|
|||
|
rule %r(/\*), Comment::Multiline, :comment
|
|||
|
|
|||
|
rule %r/@#{idrest}/, Name::Decorator
|
|||
|
|
|||
|
rule %r/(def)(\s+)(#{idrest}|#{op}+|`[^`]+`)(\s*)/ do
|
|||
|
groups Keyword, Text, Name::Function, Text
|
|||
|
end
|
|||
|
|
|||
|
rule %r/(val)(\s+)(#{idrest}|#{op}+|`[^`]+`)(\s*)/ do
|
|||
|
groups Keyword, Text, Name::Variable, Text
|
|||
|
end
|
|||
|
|
|||
|
rule %r/(this)(\n*)(\.)(#{idrest})/ do
|
|||
|
groups Keyword, Text, Operator, Name::Property
|
|||
|
end
|
|||
|
|
|||
|
rule %r/(#{idrest}|_)(\n*)(\.)(#{idrest})/ do
|
|||
|
groups Name::Variable, Text, Operator, Name::Property
|
|||
|
end
|
|||
|
|
|||
|
rule %r/#{upper}#{idrest}\b/, Name::Class
|
|||
|
|
|||
|
rule %r/(#{idrest})(#{whitespace}*)(\()/ do
|
|||
|
groups Name::Function, Text, Operator
|
|||
|
end
|
|||
|
|
|||
|
rule %r/(\.)(#{idrest})/ do
|
|||
|
groups Operator, Name::Property
|
|||
|
end
|
|||
|
|
|||
|
rule %r(
|
|||
|
(#{keywords.join("|")})\b|
|
|||
|
(<[%:-]|=>|>:|[#=@_\u21D2\u2190])(\b|(?=\s)|$)
|
|||
|
)x, Keyword
|
|||
|
rule %r/:(?!#{op})/, Keyword, :type
|
|||
|
rule %r/(true|false|null)\b/, Keyword::Constant
|
|||
|
rule %r/(import|package)(\s+)/ do
|
|||
|
groups Keyword, Text
|
|||
|
push :import
|
|||
|
end
|
|||
|
|
|||
|
rule %r/(type)(\s+)/ do
|
|||
|
groups Keyword, Text
|
|||
|
push :type
|
|||
|
end
|
|||
|
|
|||
|
rule %r/""".*?"""(?!")/m, Str
|
|||
|
rule %r/"(\\\\|\\"|[^"])*"/, Str
|
|||
|
rule %r/'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'/, Str::Char
|
|||
|
|
|||
|
rule idrest, Name
|
|||
|
rule %r/`[^`]+`/, Name
|
|||
|
|
|||
|
rule %r/\[/, Operator, :typeparam
|
|||
|
rule %r/[\(\)\{\};,.#]/, Operator
|
|||
|
rule %r/#{op}+/, Operator
|
|||
|
|
|||
|
rule %r/([0-9][0-9]*\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?/, Num::Float
|
|||
|
rule %r/([0-9][0-9]*[fFdD])/, Num::Float
|
|||
|
rule %r/0x[0-9a-fA-F]+/, Num::Hex
|
|||
|
rule %r/[0-9]+L?/, Num::Integer
|
|||
|
rule %r/\n/, Text
|
|||
|
end
|
|||
|
|
|||
|
state :class do
|
|||
|
rule %r/(#{idrest}|#{op}+|`[^`]+`)(\s*)(\[)/ do
|
|||
|
groups Name::Class, Text, Operator
|
|||
|
push :typeparam
|
|||
|
end
|
|||
|
|
|||
|
rule %r/\s+/, Text
|
|||
|
rule %r/{/, Operator, :pop!
|
|||
|
rule %r/\(/, Operator, :pop!
|
|||
|
rule %r(//.*?\n), Comment::Single, :pop!
|
|||
|
rule %r(#{idrest}|#{op}+|`[^`]+`), Name::Class, :pop!
|
|||
|
end
|
|||
|
|
|||
|
state :type do
|
|||
|
rule %r/\s+/, Text
|
|||
|
rule %r/<[%:]|>:|[#_\u21D2]|forSome|type/, Keyword
|
|||
|
rule %r/([,\);}]|=>|=)(\s*)/ do
|
|||
|
groups Operator, Text
|
|||
|
pop!
|
|||
|
end
|
|||
|
rule %r/[\(\{]/, Operator, :type
|
|||
|
|
|||
|
typechunk = /(?:#{idrest}|#{op}+\`[^`]+`)/
|
|||
|
rule %r/(#{typechunk}(?:\.#{typechunk})*)(\s*)(\[)/ do
|
|||
|
groups Keyword::Type, Text, Operator
|
|||
|
pop!
|
|||
|
push :typeparam
|
|||
|
end
|
|||
|
|
|||
|
rule %r/(#{typechunk}(?:\.#{typechunk})*)(\s*)$/ do
|
|||
|
groups Keyword::Type, Text
|
|||
|
pop!
|
|||
|
end
|
|||
|
|
|||
|
rule %r(//.*?\n), Comment::Single, :pop!
|
|||
|
rule %r/\.|#{idrest}|#{op}+|`[^`]+`/, Keyword::Type
|
|||
|
end
|
|||
|
|
|||
|
state :typeparam do
|
|||
|
rule %r/[\s,]+/, Text
|
|||
|
rule %r/<[%:]|=>|>:|[#_\u21D2]|forSome|type/, Keyword
|
|||
|
rule %r/([\]\)\}])/, Operator, :pop!
|
|||
|
rule %r/[\(\[\{]/, Operator, :typeparam
|
|||
|
rule %r/\.|#{idrest}|#{op}+|`[^`]+`/, Keyword::Type
|
|||
|
end
|
|||
|
|
|||
|
state :comment do
|
|||
|
rule %r([^/\*]+), Comment::Multiline
|
|||
|
rule %r(/\*), Comment::Multiline, :comment
|
|||
|
rule %r(\*/), Comment::Multiline, :pop!
|
|||
|
rule %r([*/]), Comment::Multiline
|
|||
|
end
|
|||
|
|
|||
|
state :import do
|
|||
|
rule %r((#{idrest}|\.)+), Name::Namespace, :pop!
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|