233 lines
8.7 KiB
Ruby
233 lines
8.7 KiB
Ruby
|
# -*- coding: utf-8 -*- #
|
||
|
# frozen_string_literal: true
|
||
|
|
||
|
module Rouge
|
||
|
module Lexers
|
||
|
class Mosel < RegexLexer
|
||
|
tag 'mosel'
|
||
|
filenames '*.mos'
|
||
|
title "Mosel"
|
||
|
desc "An optimization language used by Fico's Xpress."
|
||
|
# http://www.fico.com/en/products/fico-xpress-optimization-suite
|
||
|
filenames '*.mos'
|
||
|
|
||
|
mimetypes 'text/x-mosel'
|
||
|
|
||
|
def self.detect?(text)
|
||
|
return true if text =~ /^\s*(model|package)\s+/
|
||
|
end
|
||
|
|
||
|
id = /[a-zA-Z_][a-zA-Z0-9_]*/
|
||
|
|
||
|
############################################################################################################################
|
||
|
# General language lements
|
||
|
############################################################################################################################
|
||
|
|
||
|
core_keywords = %w(
|
||
|
and array as
|
||
|
boolean break
|
||
|
case count counter
|
||
|
declarations div do dynamic
|
||
|
elif else end evaluation exit
|
||
|
false forall forward from function
|
||
|
if imports in include initialisations initializations integer inter is_binary is_continuous is_free is_integer is_partint is_semcont is_semint is_sos1 is_sos2
|
||
|
linctr list
|
||
|
max min mod model mpvar
|
||
|
next not of options or
|
||
|
package parameters procedure
|
||
|
public prod range real record repeat requirements
|
||
|
set string sum
|
||
|
then to true
|
||
|
union until uses
|
||
|
version
|
||
|
while with
|
||
|
)
|
||
|
|
||
|
core_functions = %w(
|
||
|
abs arctan assert
|
||
|
bitflip bitneg bitset bitshift bittest bitval
|
||
|
ceil cos create currentdate currenttime cuthead cuttail
|
||
|
delcell exists exit exp exportprob
|
||
|
fclose fflush finalize findfirst findlast floor fopen fselect fskipline
|
||
|
getact getcoeff getcoeffs getdual getfid getfirst gethead getfname getlast getobjval getparam getrcost getreadcnt getreverse getsize getslack getsol gettail gettype getvars
|
||
|
iseof ishidden isodd ln log
|
||
|
makesos1 makesos2 maxlist minlist
|
||
|
publish
|
||
|
random read readln reset reverse round
|
||
|
setcoeff sethidden setioerr setname setparam setrandseed settype sin splithead splittail sqrt strfmt substr
|
||
|
timestamp
|
||
|
unpublish
|
||
|
write writeln
|
||
|
)
|
||
|
|
||
|
############################################################################################################################
|
||
|
# mmxprs module elements
|
||
|
############################################################################################################################
|
||
|
|
||
|
mmxprs_functions = %w(
|
||
|
addmipsol
|
||
|
basisstability
|
||
|
calcsolinfo clearmipdir clearmodcut command copysoltoinit
|
||
|
defdelayedrows defsecurevecs
|
||
|
estimatemarginals
|
||
|
fixglobal
|
||
|
getbstat getdualray getiis getiissense getiistype getinfcause getinfeas getlb getloadedlinctrs getloadedmpvars getname getprimalray getprobstat getrange getsensrng getsize getsol getub getvars
|
||
|
implies indicator isiisvalid isintegral loadbasis
|
||
|
loadmipsol loadprob
|
||
|
maximize minimize
|
||
|
postsolve
|
||
|
readbasis readdirs readsol refinemipsol rejectintsol repairinfeas resetbasis resetiis resetsol
|
||
|
savebasis savemipsol savesol savestate selectsol setbstat setcallback setcbcutoff setgndata setlb setmipdir setmodcut setsol setub setucbdata stopoptimize
|
||
|
unloadprob
|
||
|
writebasis writedirs writeprob writesol
|
||
|
xor
|
||
|
)
|
||
|
|
||
|
mmxpres_constants = %w(XPRS_OPT XPRS_UNF XPRS_INF XPRS_UNB XPRS_OTH)
|
||
|
|
||
|
mmxprs_parameters = %w(XPRS_colorder XPRS_enumduplpol XPRS_enummaxsol XPRS_enumsols XPRS_fullversion XPRS_loadnames XPRS_problem XPRS_probname XPRS_verbose)
|
||
|
|
||
|
|
||
|
############################################################################################################################
|
||
|
# mmsystem module elements
|
||
|
############################################################################################################################
|
||
|
|
||
|
mmsystem_functions = %w(
|
||
|
addmonths
|
||
|
copytext cuttext
|
||
|
deltext
|
||
|
endswith expandpath
|
||
|
fcopy fdelete findfiles findtext fmove
|
||
|
getasnumber getchar getcwd getdate getday getdaynum getdays getdirsep
|
||
|
getendparse setendparse
|
||
|
getenv getfsize getfstat getftime gethour getminute getmonth getmsec getpathsep
|
||
|
getqtype setqtype
|
||
|
getsecond
|
||
|
getsepchar setsepchar
|
||
|
getsize
|
||
|
getstart setstart
|
||
|
getsucc setsucc
|
||
|
getsysinfo getsysstat gettime
|
||
|
gettmpdir
|
||
|
gettrim settrim
|
||
|
getweekday getyear
|
||
|
inserttext isvalid
|
||
|
makedir makepath newtar
|
||
|
newzip nextfield
|
||
|
openpipe
|
||
|
parseextn parseint parsereal parsetext pastetext pathmatch pathsplit
|
||
|
qsort quote
|
||
|
readtextline regmatch regreplace removedir removefiles
|
||
|
setchar setdate setday setenv sethour
|
||
|
setminute setmonth setmsec setsecond settime setyear sleep startswith system
|
||
|
tarlist textfmt tolower toupper trim
|
||
|
untar unzip
|
||
|
ziplist
|
||
|
)
|
||
|
|
||
|
mmsystem_parameters = %w(datefmt datetimefmt monthnames sys_endparse sys_fillchar sys_pid sys_qtype sys_regcache sys_sepchar)
|
||
|
|
||
|
############################################################################################################################
|
||
|
# mmjobs module elements
|
||
|
############################################################################################################################
|
||
|
|
||
|
mmjobs_instance_mgmt_functions = %w(
|
||
|
clearaliases connect
|
||
|
disconnect
|
||
|
findxsrvs
|
||
|
getaliases getbanner gethostalias
|
||
|
sethostalias
|
||
|
)
|
||
|
|
||
|
mmjobs_model_mgmt_functions = %w(
|
||
|
compile
|
||
|
detach
|
||
|
getannidents getannotations getexitcode getgid getid getnode getrmtid getstatus getuid
|
||
|
load
|
||
|
reset resetmodpar run
|
||
|
setcontrol setdefstream setmodpar setworkdir stop
|
||
|
unload
|
||
|
)
|
||
|
|
||
|
mmjobs_synchornization_functions = %w(
|
||
|
dropnextevent
|
||
|
getclass getfromgid getfromid getfromuid getnextevent getvalue
|
||
|
isqueueempty
|
||
|
nullevent
|
||
|
peeknextevent
|
||
|
send setgid setuid
|
||
|
wait waitfor
|
||
|
)
|
||
|
|
||
|
mmjobs_functions = mmjobs_instance_mgmt_functions + mmjobs_model_mgmt_functions + mmjobs_synchornization_functions
|
||
|
|
||
|
mmjobs_parameters = %w(conntmpl defaultnode fsrvdelay fsrvnbiter fsrvport jobid keepalive nodenumber parentnumber)
|
||
|
|
||
|
|
||
|
state :whitespace do
|
||
|
# Spaces
|
||
|
rule %r/\s+/m, Text
|
||
|
# ! Comments
|
||
|
rule %r((!).*$\n?), Comment::Single
|
||
|
# (! Comments !)
|
||
|
rule %r(\(!.*?!\))m, Comment::Multiline
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
# From Mosel documentation:
|
||
|
# Constant strings of characters must be quoted with single (') or double quote (") and may extend over several lines. Strings enclosed in double quotes may contain C-like escape sequences introduced by the 'backslash'
|
||
|
# character (\a \b \f \n \r \t \v \xxx with xxx being the character code as an octal number).
|
||
|
# Each sequence is replaced by the corresponding control character (e.g. \n is the `new line' command) or, if no control character exists, by the second character of the sequence itself (e.g. \\ is replaced by '\').
|
||
|
# The escape sequences are not interpreted if they are contained in strings that are enclosed in single quotes.
|
||
|
|
||
|
state :single_quotes do
|
||
|
rule %r/'/, Str::Single, :pop!
|
||
|
rule %r/[^']+/, Str::Single
|
||
|
end
|
||
|
|
||
|
state :double_quotes do
|
||
|
rule %r/"/, Str::Double, :pop!
|
||
|
rule %r/(\\"|\\[0-7]{1,3}\D|\\[abfnrtv]|\\\\)/, Str::Escape
|
||
|
rule %r/[^"]/, Str::Double
|
||
|
end
|
||
|
|
||
|
state :base do
|
||
|
|
||
|
rule %r{"}, Str::Double, :double_quotes
|
||
|
rule %r{'}, Str::Single, :single_quotes
|
||
|
|
||
|
rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num
|
||
|
rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation
|
||
|
# rule %r{'([^']|'')*'}, Str
|
||
|
# rule %r/"(\\\\|\\"|[^"])*"/, Str
|
||
|
|
||
|
|
||
|
|
||
|
rule %r/(true|false)\b/i, Name::Builtin
|
||
|
rule %r/\b(#{core_keywords.join('|')})\b/i, Keyword
|
||
|
rule %r/\b(#{core_functions.join('|')})\b/, Name::Builtin
|
||
|
|
||
|
|
||
|
|
||
|
rule %r/\b(#{mmxprs_functions.join('|')})\b/, Name::Function
|
||
|
rule %r/\b(#{mmxpres_constants.join('|')})\b/, Name::Constant
|
||
|
rule %r/\b(#{mmxprs_parameters.join('|')})\b/i, Name::Property
|
||
|
|
||
|
rule %r/\b(#{mmsystem_functions.join('|')})\b/i, Name::Function
|
||
|
rule %r/\b(#{mmsystem_parameters.join('|')})\b/, Name::Property
|
||
|
|
||
|
rule %r/\b(#{mmjobs_functions.join('|')})\b/i, Name::Function
|
||
|
rule %r/\b(#{mmjobs_parameters.join('|')})\b/, Name::Property
|
||
|
|
||
|
rule id, Name
|
||
|
end
|
||
|
|
||
|
state :root do
|
||
|
mixin :whitespace
|
||
|
mixin :base
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|