115 lines
3.2 KiB
Ruby
115 lines
3.2 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
class CSharp < RegexLexer
|
|
tag 'csharp'
|
|
aliases 'c#', 'cs'
|
|
filenames '*.cs'
|
|
mimetypes 'text/x-csharp'
|
|
|
|
title "C#"
|
|
desc 'a multi-paradigm language targeting .NET'
|
|
|
|
# TODO: support more of unicode
|
|
id = /@?[_a-z]\w*/i
|
|
|
|
#Reserved Identifiers
|
|
#Contextual Keywords
|
|
#LINQ Query Expressions
|
|
keywords = %w(
|
|
abstract as base break case catch checked const continue
|
|
default delegate do else enum event explicit extern false
|
|
finally fixed for foreach goto if implicit in interface
|
|
internal is lock new null operator out override params private
|
|
protected public readonly ref return sealed sizeof stackalloc
|
|
static switch this throw true try typeof unchecked unsafe
|
|
virtual void volatile while
|
|
add alias async await get global partial remove set value where
|
|
yield nameof
|
|
ascending by descending equals from group in into join let on
|
|
orderby select
|
|
)
|
|
|
|
keywords_type = %w(
|
|
bool byte char decimal double dynamic float int long object
|
|
sbyte short string uint ulong ushort var
|
|
)
|
|
|
|
cpp_keywords = %w(
|
|
if endif else elif define undef line error warning region
|
|
endregion pragma
|
|
)
|
|
|
|
state :whitespace do
|
|
rule %r/\s+/m, Text
|
|
rule %r(//.*?$), Comment::Single
|
|
rule %r(/[*].*?[*]/)m, Comment::Multiline
|
|
end
|
|
|
|
state :nest do
|
|
rule %r/{/, Punctuation, :nest
|
|
rule %r/}/, Punctuation, :pop!
|
|
mixin :root
|
|
end
|
|
|
|
state :splice_string do
|
|
rule %r/\\./, Str
|
|
rule %r/{/, Punctuation, :nest
|
|
rule %r/"|\n/, Str, :pop!
|
|
rule %r/./, Str
|
|
end
|
|
|
|
state :splice_literal do
|
|
rule %r/""/, Str
|
|
rule %r/{/, Punctuation, :nest
|
|
rule %r/"/, Str, :pop!
|
|
rule %r/./, Str
|
|
end
|
|
|
|
state :root do
|
|
mixin :whitespace
|
|
|
|
rule %r/[$]\s*"/, Str, :splice_string
|
|
rule %r/[$]@\s*"/, Str, :splice_literal
|
|
|
|
rule %r/(<\[)\s*(#{id}:)?/, Keyword
|
|
rule %r/\]>/, Keyword
|
|
|
|
rule %r/[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation
|
|
rule %r/@"(""|[^"])*"/m, Str
|
|
rule %r/"(\\.|.)*?["\n]/, Str
|
|
rule %r/'(\\.|.)'/, Str::Char
|
|
rule %r/0x[0-9a-f]+[lu]?/i, Num
|
|
rule %r(
|
|
[0-9]
|
|
([.][0-9]*)? # decimal
|
|
(e[+-][0-9]+)? # exponent
|
|
[fldu]? # type
|
|
)ix, Num
|
|
rule %r/\b(?:class|struct|interface)\b/, Keyword, :class
|
|
rule %r/\b(?:namespace|using)\b/, Keyword, :namespace
|
|
rule %r/^#[ \t]*(#{cpp_keywords.join('|')})\b.*?\n/,
|
|
Comment::Preproc
|
|
rule %r/\b(#{keywords.join('|')})\b/, Keyword
|
|
rule %r/\b(#{keywords_type.join('|')})\b/, Keyword::Type
|
|
rule %r/#{id}(?=\s*[(])/, Name::Function
|
|
rule id, Name
|
|
end
|
|
|
|
state :class do
|
|
mixin :whitespace
|
|
rule id, Name::Class, :pop!
|
|
end
|
|
|
|
state :namespace do
|
|
mixin :whitespace
|
|
rule %r/(?=[(])/, Text, :pop!
|
|
rule %r/(#{id}|[.])+/, Name::Namespace, :pop!
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|