172 lines
5.1 KiB
Ruby
172 lines
5.1 KiB
Ruby
# -*- 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
|