This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
# -*- coding: utf-8 -*- #
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Rouge
|
||||
module Lexers
|
||||
class Zig < RegexLexer
|
||||
tag 'zig'
|
||||
aliases 'zir'
|
||||
filenames '*.zig'
|
||||
mimetypes 'text/x-zig'
|
||||
|
||||
title 'Zig'
|
||||
desc 'The Zig programming language (ziglang.org)'
|
||||
|
||||
def self.keywords
|
||||
@keywords ||= %w(
|
||||
align linksection threadlocal struct enum union error break return
|
||||
anyframe fn c_longlong c_ulonglong c_longdouble c_void comptime_float
|
||||
c_short c_ushort c_int c_uint c_long c_ulong continue asm defer
|
||||
errdefer const var extern packed export pub if else switch and or
|
||||
orelse while for bool unreachable try catch async suspend nosuspend
|
||||
await resume undefined usingnamespace test void noreturn type
|
||||
anyerror usize noalias inline noinline comptime callconv volatile
|
||||
allowzero
|
||||
)
|
||||
end
|
||||
|
||||
def self.builtins
|
||||
@builtins ||= %w(
|
||||
@addWithOverflow @as @atomicLoad @atomicStore @bitCast @breakpoint
|
||||
@alignCast @alignOf @cDefine @cImport @cInclude @bitOffsetOf
|
||||
@atomicRmw @bytesToSlice @byteOffsetOf @OpaqueType @panic @ptrCast
|
||||
@bitReverse @Vector @sin @cUndef @canImplicitCast @clz @cmpxchgWeak
|
||||
@cmpxchgStrong @compileError @compileLog @ctz @popCount @divExact
|
||||
@divFloor @cos @divTrunc @embedFile @export @tagName @TagType
|
||||
@errorName @call @errorReturnTrace @fence @fieldParentPtr @field
|
||||
@unionInit @errorToInt @intToEnum @enumToInt @setAlignStack @frame
|
||||
@Frame @exp @exp2 @log @log2 @log10 @fabs @floor @ceil @trunc @round
|
||||
@floatCast @intToFloat @floatToInt @boolToInt @errSetCast @intToError
|
||||
@frameAddress @import @newStackCall @asyncCall @intToPtr @intCast
|
||||
@frameSize @memcpy @memset @mod @mulWithOverflow @splat @ptrToInt
|
||||
@rem @returnAddress @setCold @Type @shuffle @setGlobalLinkage
|
||||
@setGlobalSection @shlExact @This @hasDecl @hasField
|
||||
@setRuntimeSafety @setEvalBranchQuota @setFloatMode @shlWithOverflow
|
||||
@shrExact @sizeOf @bitSizeOf @sqrt @byteSwap @subWithOverflow
|
||||
@sliceToBytes comptime_int @truncate @typeInfo @typeName @TypeOf
|
||||
)
|
||||
end
|
||||
|
||||
id = /[a-z_]\w*/i
|
||||
escapes = /\\ ([nrt'"\\0] | x\h{2} | u\h{4} | U\h{8})/x
|
||||
|
||||
state :bol do
|
||||
mixin :whitespace
|
||||
rule %r/#\s[^\n]*/, Comment::Special
|
||||
rule(//) { pop! }
|
||||
end
|
||||
|
||||
state :attribute do
|
||||
mixin :whitespace
|
||||
mixin :literals
|
||||
rule %r/[(,)=:]/, Name::Decorator
|
||||
rule %r/\]/, Name::Decorator, :pop!
|
||||
rule id, Name::Decorator
|
||||
end
|
||||
|
||||
state :whitespace do
|
||||
rule %r/\s+/, Text
|
||||
rule %r(//[^\n]*), Comment
|
||||
end
|
||||
|
||||
state :root do
|
||||
rule %r/\n/, Text, :bol
|
||||
|
||||
mixin :whitespace
|
||||
|
||||
rule %r/\b(?:(i|u)[0-9]+)\b/, Keyword::Type
|
||||
rule %r/\b(?:f(16|32|64|128))\b/, Keyword::Type
|
||||
rule %r/\b(?:(isize|usize))\b/, Keyword::Type
|
||||
|
||||
mixin :literals
|
||||
|
||||
rule %r/'#{id}/, Name::Variable
|
||||
rule %r/([.]?)(\s*)(@?#{id})(\s*)([(]?)/ do |m|
|
||||
name = m[3]
|
||||
t = if self.class.keywords.include? name
|
||||
Keyword
|
||||
elsif self.class.builtins.include? name
|
||||
Name::Builtin
|
||||
elsif !m[1].empty? && !m[5].empty?
|
||||
Name::Function
|
||||
elsif !m[1].empty?
|
||||
Name::Property
|
||||
else
|
||||
Name
|
||||
end
|
||||
|
||||
groups Punctuation, Text, t, Text, Punctuation
|
||||
end
|
||||
|
||||
rule %r/[()\[\]{}|,:;]/, Punctuation
|
||||
rule %r/[*\/!@~&+%^<>=\?-]|\.{1,3}/, Operator
|
||||
end
|
||||
|
||||
state :literals do
|
||||
rule %r/\b(?:true|false|null)\b/, Keyword::Constant
|
||||
rule %r(
|
||||
' (?: #{escapes} | [^\\] ) '
|
||||
)x, Str::Char
|
||||
|
||||
rule %r/"/, Str, :string
|
||||
rule %r/r(#*)".*?"\1/m, Str
|
||||
|
||||
dot = /[.][0-9_]+/
|
||||
exp = /e[-+]?[0-9_]+/
|
||||
|
||||
rule %r(
|
||||
[0-9]+
|
||||
(#{dot} #{exp}?
|
||||
|#{dot}? #{exp}
|
||||
)
|
||||
)x, Num::Float
|
||||
|
||||
rule %r(
|
||||
( 0b[10_]+
|
||||
| 0x[0-9a-fA-F_]+
|
||||
| [0-9_]+
|
||||
)
|
||||
)x, Num::Integer
|
||||
end
|
||||
|
||||
state :string do
|
||||
rule %r/"/, Str, :pop!
|
||||
rule escapes, Str::Escape
|
||||
rule %r/[^"\\]+/m, Str
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user