This commit is contained in:
@@ -0,0 +1,312 @@
|
||||
# -*- 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
|
||||
Reference in New Issue
Block a user