Files
news.gitea.happylizard.me/bin/gems/rouge-4.5.1/lib/rouge/lexers/zig.rb
T
pizza2d1 4cee170d66
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s
Add bin and edit workflow
2026-09-16 13:11:16 -06:00

140 lines
4.3 KiB
Ruby

# -*- 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