1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
class GDScript < RegexLexer
title "GDScript"
desc "The Godot Engine programming language (https://godotengine.org/)"
tag 'gdscript'
aliases 'gd', 'gdscript'
filenames '*.gd'
mimetypes 'text/x-gdscript', 'application/x-gdscript'
def self.keywords
@keywords ||= %w(
and in not or as breakpoint class class_name extends is func setget
signal tool const enum export onready static var break continue
if elif else for pass return match while remote master puppet
remotesync mastersync puppetsync
).join('|')
end
# Reserved for future implementation
def self.keywords_reserved
@keywords_reserved ||= %w(
do switch case
).join('|')
end
def self.builtins
@builtins ||= %w(
Color8 ColorN abs acos asin assert atan atan2 bytes2var ceil char
clamp convert cos cosh db2linear decimals dectime deg2rad dict2inst
ease exp floor fmod fposmod funcref hash inst2dict instance_from_id
is_inf is_nan lerp linear2db load log max min nearest_po2 pow
preload print print_stack printerr printraw prints printt rad2deg
rand_range rand_seed randf randi randomize range round seed sign
sin sinh sqrt stepify str str2var tan tan tanh type_exist typeof
var2bytes var2str weakref yield
).join('|')
end
def self.builtins_type
@builtins_type ||= %w(
bool int float String Vector2 Rect2 Transform2D Vector3 AABB
Plane Quat Basis Transform Color RID Object NodePath Dictionary
Array PoolByteArray PoolIntArray PoolRealArray PoolStringArray
PoolVector2Array PoolVector3Array PoolColorArray null
).join('|')
end
state :root do
rule %r/\n/, Text
rule %r/[^\S\n]+/, Text
rule %r/#.*/, Comment::Single
rule %r/[\[\]{}:(),;]/, Punctuation
rule %r/\\\n/, Text
rule %r/(in|and|or|not)\b/, Operator::Word
rule %r/!=|==|<<|>>|&&|\+=|-=|\*=|\/=|%=|&=|\|=|\|\||[-~+\/*%=<>&^.!|$]/, Operator
rule %r/(func)((?:\s|\\)+)/ do
groups Keyword, Text
push :funcname
end
rule %r/(class)((?:\s|\\)+)/ do
groups Keyword, Text
push :classname
end
mixin :keywords
mixin :builtins
rule %r/"""/, Str::Double, :escape_tdqs
rule %r/'''/, Str::Double, :escape_tsqs
rule %r/"/, Str::Double, :escape_dqs
rule %r/'/, Str::Double, :escape_sqs
mixin :name
mixin :numbers
end
state :keywords do
rule %r/\b(#{GDScript.keywords})\b/, Keyword
rule %r/\b(#{GDScript.keywords_reserved})\b/, Keyword::Reserved
end
state :builtins do
rule %r/\b(#{GDScript.builtins})\b/, Name::Builtin
rule %r/\b((self|false|true)|(PI|TAU|NAN|INF))\b/, Name::Builtin::Pseudo
rule %r/\b(#{GDScript.builtins_type})\b/, Keyword::Type
end
state :numbers do
rule %r/(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float
rule %r/\d+[eE][+-]?[0-9]+j?/, Num::Float
rule %r/0[xX][a-fA-F0-9]+/, Num::Hex
rule %r/\d+j?/, Num::Integer
end
state :name do
rule %r/[a-zA-Z_]\w*/, Name
end
state :funcname do
rule %r/[a-zA-Z_]\w*/, Name::Function, :pop!
end
state :classname do
rule %r/[a-zA-Z_]\w*/, Name::Class, :pop!
end
state :string_escape do
rule %r/\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/, Str::Escape
end
state :strings_single do
rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol
rule %r/[^\\'%\n]+/, Str::Single
rule %r/["\\]/, Str::Single
rule %r/%/, Str::Single
end
state :strings_double do
rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol
rule %r/[^\\"%\n]+/, Str::Double
rule %r/['\\]/, Str::Double
rule %r/%/, Str::Double
end
state :dqs do
rule %r/"/, Str::Double, :pop!
rule %r/\\\\|\\"|\\\n/, Str::Escape
mixin :strings_double
end
state :escape_dqs do
mixin :string_escape
mixin :dqs
end
state :sqs do
rule %r/'/, Str::Single, :pop!
rule %r/\\\\|\\'|\\\n/, Str::Escape
mixin :strings_single
end
state :escape_sqs do
mixin :string_escape
mixin :sqs
end
state :tdqs do
rule %r/"""/, Str::Double, :pop!
mixin :strings_double
rule %r/\n/, Str::Double
end
state :escape_tdqs do
mixin :string_escape
mixin :tdqs
end
state :tsqs do
rule %r/'''/, Str::Single, :pop!
mixin :strings_single
rule %r/\n/, Str::Single
end
state :escape_tsqs do
mixin :string_escape
mixin :tsqs
end
end
end
end
|