# -*- coding: utf-8 -*- #
# frozen_string_literal: true
# vim: set ts=2 sw=2 et:
module Rouge
module Lexers
class IDLang < RegexLexer
title "IDL"
desc "Interactive Data Language"
tag 'idlang'
filenames '*.idl'
name = /[_A-Z]\w*/i
kind_param = /(\d+|#{name})/
exponent = /[dDeE][+-]\d+/
def self.exec_unit
@exec_unit ||= Set.new %w(
PRO FUNCTION
)
end
def self.keywords
@keywords ||= Set.new %w(
STRUCT INHERITS
RETURN CONTINUE BEGIN END BREAK GOTO
)
end
def self.standalone_statements
# Must not have a comma afterwards
@standalone_statements ||= Set.new %w(
COMMON FORWARD_FUNCTION
)
end
def self.decorators
# Must not have a comma afterwards
@decorators ||= Set.new %w(
COMPILE_OPT
)
end
def self.operators
@operators ||= Set.new %w(
AND= EQ= GE= GT= LE= LT= MOD= NE= OR= XOR= NOT=
)
end
def self.conditionals
@conditionals ||= Set.new %w(
OF DO ENDIF ENDELSE ENDFOR ENDFOREACH ENDWHILE ENDREP ENDCASE ENDSWITCH
IF THEN ELSE FOR FOREACH WHILE REPEAT UNTIL CASE SWITCH
AND EQ GE GT LE LT MOD NE OR XOR NOT
)
end
def self.routines
@routines ||= Set.new %w(
A_CORRELATE ABS ACOS ADAPT_HIST_EQUAL ALOG ALOG10
AMOEBA ANNOTATE ARG_PRESENT ARRAY_EQUAL
ARRAY_INDICES ARROW ASCII_TEMPLATE ASIN ASSOC ATAN
AXIS BAR_PLOT BESELI BESELJ BESELK BESELY BETA
BILINEAR BIN_DATE BINARY_TEMPLATE BINDGEN BINOMIAL
BLAS_AXPY BLK_CON BOX_CURSOR BREAK BREAKPOINT
BROYDEN BYTARR BYTE BYTEORDER BYTSCL C_CORRELATE
CALDAT CALENDAR CALL_EXTERNAL CALL_FUNCTION
CALL_METHOD CALL_PROCEDURE CATCH CD CEIL CHEBYSHEV
CHECK_MATH CHISQR_CVF CHISQR_PDF CHOLDC CHOLSOL
CINDGEN CIR_3PNT CLOSE CLUST_WTS CLUSTER
COLOR_CONVERT COLOR_QUAN COLORMAP_APPLICABLE COMFIT
COMPLEX COMPLEXARR COMPLEXROUND
COMPUTE_MESH_NORMALS COND CONGRID CONJ
CONSTRAINED_MIN CONTOUR CONVERT_COORD CONVOL
COORD2TO3 CORRELATE COS COSH CRAMER CREATE_STRUCT
CREATE_VIEW CROSSP CRVLENGTH CT_LUMINANCE CTI_TEST
CURSOR CURVEFIT CV_COORD CVTTOBM CW_ANIMATE
CW_ANIMATE_GETP CW_ANIMATE_LOAD CW_ANIMATE_RUN
CW_ARCBALL CW_BGROUP CW_CLR_INDEX CW_COLORSEL
CW_DEFROI CW_FIELD CW_FILESEL CW_FORM CW_FSLIDER
CW_LIGHT_EDITOR CW_LIGHT_EDITOR_GET
CW_LIGHT_EDITOR_SET CW_ORIENT CW_PALETTE_EDITOR
CW_PALETTE_EDITOR_GET CW_PALETTE_EDITOR_SET
CW_PDMENU CW_RGBSLIDER CW_TMPL CW_ZOOM DBLARR
DCINDGEN DCOMPLEX DCOMPLEXARR DEFINE_KEY DEFROI
DEFSYSV DELETE_SYMBOL DELLOG DELVAR DERIV DERIVSIG
DETERM DEVICE DFPMIN DIALOG_MESSAGE
DIALOG_PICKFILE DIALOG_PRINTERSETUP
DIALOG_PRINTJOB DIALOG_READ_IMAGE
DIALOG_WRITE_IMAGE DICTIONARY DIGITAL_FILTER DILATE DINDGEN
DISSOLVE DIST DLM_LOAD DLM_REGISTER
DO_APPLE_SCRIPT DOC_LIBRARY DOUBLE DRAW_ROI EFONT
EIGENQL EIGENVEC ELMHES EMPTY ENABLE_SYSRTN EOF
ERASE ERODE ERRORF ERRPLOT EXECUTE EXIT EXP EXPAND
EXPAND_PATH EXPINT EXTRAC EXTRACT_SLICE F_CVF
F_PDF FACTORIAL FFT FILE_CHMOD FILE_DELETE
FILE_EXPAND_PATH FILE_MKDIR FILE_TEST FILE_WHICH
FILE_SEARCH PATH_SEP FILE_DIRNAME FILE_BASENAME
FILE_INFO FILE_MOVE FILE_COPY FILE_LINK FILE_POLL_INPUT
FILEPATH FINDFILE FINDGEN FINITE FIX FLICK FLOAT
FLOOR FLOW3 FLTARR FLUSH FORMAT_AXIS_VALUES
FORWARD_FUNCTION FREE_LUN FSTAT FULSTR FUNCT
FV_TEST FX_ROOT FZ_ROOTS GAMMA GAMMA_CT
GAUSS_CVF GAUSS_PDF GAUSS2DFIT GAUSSFIT GAUSSINT
GET_DRIVE_LIST GET_KBRD GET_LUN GET_SCREEN_SIZE
GET_SYMBOL GETENV GOTO GREG2JUL GRID_TPS GRID3 GS_ITER
H_EQ_CT H_EQ_INT HANNING HASH HEAP_GC HELP HILBERT
HIST_2D HIST_EQUAL HISTOGRAM HLS HOUGH HQR HSV
IBETA IDENTITY IDL_CONTAINER IDLANROI
IDLANROIGROUP IDLFFDICOM IDLFFDXF IDLFFLANGUAGECAT
IDLFFSHAPE IDLGRAXIS IDLGRBUFFER IDLGRCLIPBOARD
IDLGRCOLORBAR IDLGRCONTOUR IDLGRFONT IDLGRIMAGE
IDLGRLEGEND IDLGRLIGHT IDLGRMODEL IDLGRMPEG
IDLGRPALETTE IDLGRPATTERN IDLGRPLOT IDLGRPOLYGON
IDLGRPOLYLINE IDLGRPRINTER IDLGRROI IDLGRROIGROUP
IDLGRSCENE IDLGRSURFACE IDLGRSYMBOL
IDLGRTESSELLATOR IDLGRTEXT IDLGRVIEW
IDLGRVIEWGROUP IDLGRVOLUME IDLGRVRML IDLGRWINDOW
IGAMMA IMAGE_CONT IMAGE_STATISTICS IMAGINARY
INDGEN INT_2D INT_3D INT_TABULATED INTARR INTERPOL
INTERPOLATE INVERT IOCTL ISA ISHFT ISOCONTOUR
ISOSURFACE JOURNAL JUL2GREG JULDAY KEYWORD_SET KRIG2D
KURTOSIS KW_TEST L64INDGEN LABEL_DATE LABEL_REGION
LADFIT LAGUERRE LEEFILT LEGENDRE LINBCG LINDGEN
LINFIT LINKIMAGE LIST LIVE_CONTOUR LIVE_CONTROL
LIVE_DESTROY LIVE_EXPORT LIVE_IMAGE LIVE_INFO
LIVE_LINE LIVE_LOAD LIVE_OPLOT LIVE_PLOT
LIVE_PRINT LIVE_RECT LIVE_STYLE LIVE_SURFACE
LIVE_TEXT LJLCT LL_ARC_DISTANCE LMFIT LMGR LNGAMMA
LNP_TEST LOADCT LOCALE_GET LON64ARR LONARR LONG
LONG64 LSODE LU_COMPLEX LUDC LUMPROVE LUSOL
M_CORRELATE MACHAR MAKE_ARRAY MAKE_DLL MAP_2POINTS
MAP_CONTINENTS MAP_GRID MAP_IMAGE MAP_PATCH
MAP_PROJ_INFO MAP_SET MAX MATRIX_MULTIPLY MD_TEST MEAN
MEANABSDEV MEDIAN MEMORY MESH_CLIP MESH_DECIMATE
MESH_ISSOLID MESH_MERGE MESH_NUMTRIANGLES MESH_OBJ
MESH_SMOOTH MESH_SURFACEAREA MESH_VALIDATE
MESH_VOLUME MESSAGE MIN MIN_CURVE_SURF MK_HTML_HELP
MODIFYCT MOMENT MORPH_CLOSE MORPH_DISTANCE
MORPH_GRADIENT MORPH_HITORMISS MORPH_OPEN
MORPH_THIN MORPH_TOPHAT MPEG_CLOSE MPEG_OPEN
MPEG_PUT MPEG_SAVE MSG_CAT_CLOSE MSG_CAT_COMPILE
MSG_CAT_OPEN MULTI N_ELEMENTS N_PARAMS N_TAGS
NEWTON NORM OBJ_CLASS OBJ_DESTROY OBJ_ISA OBJ_NEW
OBJ_VALID OBJARR ON_ERROR ON_IOERROR ONLINE_HELP
OPEN OPENR OPENW OPENU OPLOT OPLOTERR ORDEREDHASH P_CORRELATE
PARTICLE_TRACE PCOMP PLOT PLOT_3DBOX PLOT_FIELD
PLOTERR PLOTS PNT_LINE POINT_LUN POLAR_CONTOUR
POLAR_SURFACE POLY POLY_2D POLY_AREA POLY_FIT
POLYFILL POLYFILLV POLYSHADE POLYWARP POPD POWELL
PRIMES PRINT PRINTF PRINTD PRODUCT PROFILE PROFILER
PROFILES PROJECT_VOL PS_SHOW_FONTS PSAFM PSEUDO
PTR_FREE PTR_NEW PTR_VALID PTRARR PUSHD QROMB
QROMO QSIMP QUERY_CSV R_CORRELATE R_TEST RADON RANDOMN
RANDOMU RANKS RDPIX READ READF READ_ASCII
READ_BINARY READ_BMP READ_CSV READ_DICOM READ_IMAGE
READ_INTERFILE READ_JPEG READ_PICT READ_PNG
READ_PPM READ_SPR READ_SRF READ_SYLK READ_TIFF
READ_WAV READ_WAVE READ_X11_BITMAP READ_XWD READS
READU REBIN RECALL_COMMANDS RECON3 REDUCE_COLORS
REFORM REGRESS REPLICATE REPLICATE_INPLACE
RESOLVE_ALL RESOLVE_ROUTINE RESTORE RETALL
REVERSE REWIND RK4 ROBERTS ROT ROTATE ROUND
ROUTINE_INFO RS_TEST S_TEST SAVE SAVGOL SCALE3
SCALE3D SCOPE_LEVEL SCOPE_TRACEBACK SCOPE_VARFETCH
SCOPE_VARNAME SEARCH2D SEARCH3D SET_PLOT SET_SHADING
SET_SYMBOL SETENV SETLOG SETUP_KEYS SFIT
SHADE_SURF SHADE_SURF_IRR SHADE_VOLUME SHIFT SHOW3
SHOWFONT SIGNUM SIN SINDGEN SINH SIZE SKEWNESS SKIPF
SLICER3 SLIDE_IMAGE SMOOTH SOBEL SOCKET SORT SPAWN
SPH_4PNT SPH_SCAT SPHER_HARM SPL_INIT SPL_INTERP
SPLINE SPLINE_P SPRSAB SPRSAX SPRSIN SPRSTP SQRT
STANDARDIZE STDDEV STOP STRARR STRCMP STRCOMPRESS
STREAMLINE STREGEX STRETCH STRING STRJOIN STRLEN
STRLOWCASE STRMATCH STRMESSAGE STRMID STRPOS
STRPUT STRSPLIT STRTRIM STRUCT_ASSIGN STRUCT_HIDE
STRUPCASE SURFACE SURFR SVDC SVDFIT SVSOL
SWAP_ENDIAN SWITCH SYSTIME T_CVF T_PDF T3D
TAG_NAMES TAN TANH TAPRD TAPWRT TEK_COLOR
TEMPORARY TETRA_CLIP TETRA_SURFACE TETRA_VOLUME
THIN THREED TIME_TEST2 TIMEGEN TM_TEST TOTAL TRACE
TRANSPOSE TRI_SURF TRIANGULATE TRIGRID TRIQL
TRIRED TRISOL TRNLOG TS_COEF TS_DIFF TS_FCAST
TS_SMOOTH TV TVCRS TVLCT TVRD TVSCL TYPENAME UINDGEN UINT
UINTARR UL64INDGEN ULINDGEN ULON64ARR ULONARR
ULONG ULONG64 UNIQ USERSYM VALUE_LOCATE VARIANCE
VAX_FLOAT VECTOR_FIELD VEL VELOVECT VERT_T3D VOIGT
VORONOI VOXEL_PROJ WAIT WARP_TRI WATERSHED WDELETE
WEOF WF_DRAW WHERE WIDGET_BASE WIDGET_BUTTON
WIDGET_CONTROL WIDGET_DRAW WIDGET_DROPLIST
WIDGET_EVENT WIDGET_INFO WIDGET_LABEL WIDGET_LIST
WIDGET_SLIDER WIDGET_TABLE WIDGET_TEXT WINDOW
WRITE_BMP WRITE_CSV WRITE_IMAGE WRITE_JPEG WRITE_NRIF
WRITE_PICT WRITE_PNG WRITE_PPM WRITE_SPR WRITE_SRF
WRITE_SYLK WRITE_TIFF WRITE_WAV WRITE_WAVE WRITEU
WSET WSHOW WTN WV_APPLET WV_CW_WAVELET WV_CWT
WV_DENOISE WV_DWT WV_FN_COIFLET WV_FN_DAUBECHIES
WV_FN_GAUSSIAN WV_FN_HAAR WV_FN_MORLET WV_FN_PAUL
WV_FN_SYMLET WV_IMPORT_DATA WV_IMPORT_WAVELET
WV_PLOT3D_WPS WV_PLOT_MULTIRES WV_PWT
WV_TOOL_DENOISE XBM_EDIT XDISPLAYFILE XDXF XFONT
XINTERANIMATE XLOADCT XMANAGER XMNG_TMPL XMTOOL
XOBJVIEW XPALETTE XPCOLOR XPLOT3D XREGISTERED XROI
XSQ_TEST XSURFACE XVAREDIT XVOLUME XVOLUME_ROTATE
XVOLUME_WRITE_IMAGE XYOUTS ZOOM ZOOM_24
)
end
state :root do
rule %r/\s+/, Text::Whitespace
# Normal comments
rule %r/;.*$/, Comment::Single
rule %r/\,\s*\,/, Error
rule %r/\!#{name}/, Name::Variable::Global
rule %r/[(),:\&\$]/, Punctuation
## Format statements are quite a strange beast.
## Better process them in their own state.
#rule %r/\b(FORMAT)(\s*)(\()/mi do |m|
# token Keyword, m[1]
# token Text::Whitespace, m[2]
# token Punctuation, m[3]
# push :format_spec
#end
rule %r(
[+-]? # sign
(
(\d+[.]\d*|[.]\d+)(#{exponent})?
| \d+#{exponent} # exponent is mandatory
)
(_#{kind_param})? # kind parameter
)xi, Num::Float
rule %r/\d+(B|S|U|US|LL|L|ULL|UL)?/i, Num::Integer
rule %r/"[0-7]+(B|O|U|ULL|UL|LL|L)?/i, Num::Oct
rule %r/'[0-9A-F]+'X(B|S|US|ULL|UL|U|LL|L)?/i, Num::Hex
rule %r/(#{kind_param}_)?'/, Str::Single, :string_single
rule %r/(#{kind_param}_)?"/, Str::Double, :string_double
rule %r{\#\#|\#|\&\&|\|\||/=|<=|>=|->|\@|\?|[-+*/<=~^{}]}, Operator
# Structures and the like
rule %r/(#{name})(\.)([^\s,]*)/i do
groups Name, Operator, Name
#delegate IDLang, m[3]
end
rule %r/(function|pro)((?:\s|\$\s)+)/i do
groups Keyword, Text::Whitespace
push :funcname
end
rule %r/#{name}/m do |m|
match = m[0].upcase
if self.class.keywords.include? match
token Keyword
elsif self.class.conditionals.include? match
token Keyword
elsif self.class.decorators.include? match
token Name::Decorator
elsif self.class.standalone_statements.include? match
token Keyword::Reserved
elsif self.class.operators.include? match
token Operator::Word
elsif self.class.routines.include? match
token Name::Builtin
else
token Name
end
end
end
state :funcname do
rule %r/#{name}/, Name::Function
rule %r/\s+/, Text::Whitespace
rule %r/(:+|\$)/, Operator
rule %r/;.*/, Comment::Single
# Be done with this state if we hit EOL or comma
rule %r/$/, Text::Whitespace, :pop!
rule %r/,/, Operator, :pop!
end
state :string_single do
rule %r/[^']+/, Str::Single
rule %r/''/, Str::Escape
rule %r/'/, Str::Single, :pop!
end
state :string_double do
rule %r/[^"]+/, Str::Double
rule %r/"/, Str::Double, :pop!
end
state :format_spec do
rule %r/'/, Str::Single, :string_single
rule %r/"/, Str::Double, :string_double
rule %r/\(/, Punctuation, :format_spec
rule %r/\)/, Punctuation, :pop!
rule %r/,/, Punctuation
rule %r/\s+/, Text::Whitespace
# Edit descriptors could be seen as a kind of "format literal".
rule %r/[^\s'"(),]+/, Literal
end
end
end
end