110 lines
3.3 KiB
Ruby
110 lines
3.3 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
class SQF < RegexLexer
|
|
tag "sqf"
|
|
filenames "*.sqf"
|
|
|
|
title "SQF"
|
|
desc "Status Quo Function, a Real Virtuality engine scripting language"
|
|
|
|
def self.wordoperators
|
|
@wordoperators ||= Set.new %w(
|
|
and or not
|
|
)
|
|
end
|
|
|
|
def self.initializers
|
|
@initializers ||= Set.new %w(
|
|
private param params
|
|
)
|
|
end
|
|
|
|
def self.controlflow
|
|
@controlflow ||= Set.new %w(
|
|
if then else exitwith switch do case default while for from to step
|
|
foreach
|
|
)
|
|
end
|
|
|
|
def self.constants
|
|
@constants ||= Set.new %w(
|
|
true false player confignull controlnull displaynull grpnull
|
|
locationnull netobjnull objnull scriptnull tasknull teammembernull
|
|
)
|
|
end
|
|
|
|
def self.namespaces
|
|
@namespaces ||= Set.new %w(
|
|
currentnamespace missionnamespace parsingnamespace profilenamespace
|
|
uinamespace
|
|
)
|
|
end
|
|
|
|
def self.diag_commands
|
|
@diag_commands ||= Set.new %w(
|
|
diag_activemissionfsms diag_activesqfscripts diag_activesqsscripts
|
|
diag_activescripts diag_captureframe diag_captureframetofile
|
|
diag_captureslowframe diag_codeperformance diag_drawmode diag_enable
|
|
diag_enabled diag_fps diag_fpsmin diag_frameno diag_lightnewload
|
|
diag_list diag_log diag_logslowframe diag_mergeconfigfile
|
|
diag_recordturretlimits diag_setlightnew diag_ticktime diag_toggle
|
|
)
|
|
end
|
|
|
|
def self.commands
|
|
load File.join(__dir__, "sqf/commands.rb")
|
|
@commands = self.commands
|
|
end
|
|
|
|
state :root do
|
|
# Whitespace
|
|
rule %r"\s+", Text
|
|
|
|
# Preprocessor instructions
|
|
rule %r"/\*.*?\*/"m, Comment::Multiline
|
|
rule %r"//.*\n", Comment::Single
|
|
rule %r"#(define|undef|if(n)?def|else|endif|include)", Comment::Preproc
|
|
rule %r"\\\r?\n", Comment::Preproc
|
|
rule %r"__(EVAL|EXEC|LINE__|FILE__)", Name::Builtin
|
|
|
|
# Literals
|
|
rule %r"\".*?\"", Literal::String
|
|
rule %r"'.*?'", Literal::String
|
|
rule %r"(\$|0x)[0-9a-fA-F]+", Literal::Number::Hex
|
|
rule %r"[0-9]+(\.)?(e[0-9]+)?", Literal::Number::Float
|
|
|
|
# Symbols
|
|
rule %r"[\!\%\&\*\+\-\/\<\=\>\^\|\#]", Operator
|
|
rule %r"[\(\)\{\}\[\]\,\:\;]", Punctuation
|
|
|
|
# Identifiers (variables and functions)
|
|
rule %r"[a-zA-Z0-9_]+" do |m|
|
|
name = m[0].downcase
|
|
if self.class.wordoperators.include? name
|
|
token Operator::Word
|
|
elsif self.class.initializers.include? name
|
|
token Keyword::Declaration
|
|
elsif self.class.controlflow.include? name
|
|
token Keyword::Reserved
|
|
elsif self.class.constants.include? name
|
|
token Keyword::Constant
|
|
elsif self.class.namespaces.include? name
|
|
token Keyword::Namespace
|
|
elsif self.class.diag_commands.include? name
|
|
token Name::Function
|
|
elsif self.class.commands.include? name
|
|
token Name::Function
|
|
elsif %r"_.+" =~ name
|
|
token Name::Variable
|
|
else
|
|
token Name::Variable::Global
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|