# -*- coding: utf-8 -*- #
module Rouge
module Lexers
class SAS < RegexLexer
title "SAS"
desc "SAS (Statistical Analysis Software)"
tag 'sas'
filenames '*.sas'
mimetypes 'application/x-sas', 'application/x-stat-sas', 'application/x-sas-syntax'
def self.data_step_statements
# from Data step statements - SAS 9.4 Statements reference
# http://support.sas.com/documentation/cdl/en/lestmtsref/68024/PDF/default/lestmtsref.pdf
@data_step_statements ||= Set.new %w(
ABORT ARRAY ATTRIB BY CALL CARDS CARDS4 CATNAME CHECKPOINT
EXECUTE_ALWAYS CONTINUE DATA DATALINES DATALINES4 DELETE DESCRIBE
DISPLAY DM DO UNTIL WHILE DROP END ENDSAS ERROR EXECUTE FILE FILENAME
FOOTNOTE FORMAT GO TO IF THEN ELSE INFILE INFORMAT INPUT
KEEP LABEL LEAVE LENGTH LIBNAME LINK LIST LOCK LOSTCARD MERGE
MISSING MODIFY OPTIONS OUTPUT PAGE PUT PUTLOG REDIRECT REMOVE RENAME
REPLACE RESETLINE RETAIN RETURN RUN SASFILE SELECT SET SKIP STOP
SYSECHO TITLE UPDATE WHERE WINDOW X
)
# label:
# Sum
end
def self.sas_functions
# from SAS 9.4 Functions and CALL Routines reference
# http://support.sas.com/documentation/cdl/en/lefunctionsref/67960/PDF/default/lefunctionsref.pdf
@sas_functions ||= Set.new %w(
ABS ADDR ADDRLONG AIRY ALLCOMB ALLPERM ANYALNUM ANYALPHA ANYCNTRL
ANYDIGIT ANYFIRST ANYGRAPH ANYLOWER ANYNAME ANYPRINT ANYPUNCT
ANYSPACE ANYUPPER ANYXDIGIT ARCOS ARCOSH ARSIN ARSINH ARTANH ATAN
ATAN2 ATTRC ATTRN BAND BETA BETAINV BLACKCLPRC BLACKPTPRC
BLKSHCLPRC BLKSHPTPRC BLSHIFT BNOT BOR BRSHIFT BXOR BYTE CAT CATQ
CATS CATT CATX CDF CEIL CEILZ CEXIST CHAR CHOOSEC CHOOSEN CINV
CLOSE CMISS CNONCT COALESCE COALESCEC COLLATE COMB COMPARE COMPBL
COMPFUZZ COMPGED COMPLEV COMPOUND COMPRESS CONSTANT CONVX CONVXP
COS COSH COT COUNT COUNTC COUNTW CSC CSS CUMIPMT CUMPRINC CUROBS
CV DACCDB DACCDBSL DACCSL DACCSYD DACCTAB DAIRY DATDIF DATE
DATEJUL DATEPART DATETIME DAY DCLOSE DCREATE DEPDB DEPDBSL DEPSL
DEPSYD DEPTAB DEQUOTE DEVIANCE DHMS DIF DIGAMMA DIM DINFO DIVIDE
DNUM DOPEN DOPTNAME DOPTNUM DOSUBL DREAD DROPNOTE DSNAME
DSNCATLGD DUR DURP EFFRATE ENVLEN ERF ERFC EUCLID EXIST EXP FACT
FAPPEND FCLOSE FCOL FCOPY FDELETE FETCH FETCHOBS FEXIST FGET
FILEEXIST FILENAME FILEREF FINANCE FIND FINDC FINDW FINFO FINV
FIPNAME FIPNAMEL FIPSTATE FIRST FLOOR FLOORZ FMTINFO FNONCT FNOTE
FOPEN FOPTNAME FOPTNUM FPOINT FPOS FPUT FREAD FREWIND FRLEN FSEP
FUZZ FWRITE GAMINV GAMMA GARKHCLPRC GARKHPTPRC GCD GEODIST
GEOMEAN GEOMEANZ GETOPTION GETVARC GETVARN GRAYCODE HARMEAN
HARMEANZ HBOUND HMS HOLIDAY HOLIDAYCK HOLIDAYCOUNT HOLIDAYNAME
HOLIDAYNX HOLIDAYNY HOLIDAYTEST HOUR HTMLDECODE HTMLENCODE
IBESSEL IFC IFN INDEX INDEXC INDEXW INPUT INPUTC INPUTN INT
INTCINDEX INTCK INTCYCLE INTFIT INTFMT INTGET INTINDEX INTNX
INTRR INTSEAS INTSHIFT INTTEST INTZ IORCMSG IPMT IQR IRR JBESSEL
JULDATE JULDATE7 KURTOSIS LAG LARGEST LBOUND LCM LCOMB LEFT
LENGTH LENGTHC LENGTHM LENGTHN LEXCOMB LEXCOMBI LEXPERK LEXPERM
LFACT LGAMMA LIBNAME LIBREF LOG LOG1PX LOG10 LOG2 LOGBETA LOGCDF
LOGISTIC LOGPDF LOGSDF LOWCASE LPERM LPNORM MAD MARGRCLPRC
MARGRPTPRC MAX MD5 MDY MEAN MEDIAN MIN MINUTE MISSING MOD
MODEXIST MODULE MODULEC MODULEN MODZ MONTH MOPEN MORT MSPLINT
MVALID N NETPV NLITERAL NMISS NOMRATE NORMAL NOTALNUM NOTALPHA
NOTCNTRL NOTDIGIT NOTE NOTFIRST NOTGRAPH NOTLOWER NOTNAME
NOTPRINT NOTPUNCT NOTSPACE NOTUPPER NOTXDIGIT NPV NVALID NWKDOM
OPEN ORDINAL PATHNAME PCTL PDF PEEK PEEKC PEEKCLONG PEEKLONG PERM
PMT POINT POISSON PPMT PROBBETA PROBBNML PROBBNRM PROBCHI PROBF
PROBGAM PROBHYPR PROBIT PROBMC PROBNEGB PROBNORM PROBT PROPCASE
PRXCHANGE PRXMATCH PRXPAREN PRXPARSE PRXPOSN PTRLONGADD PUT PUTC
PUTN PVP QTR QUANTILE QUOTE RANBIN RANCAU RAND RANEXP RANGAM
RANGE RANK RANNOR RANPOI RANTBL RANTRI RANUNI RENAME REPEAT
RESOLVE REVERSE REWIND RIGHT RMS ROUND ROUNDE ROUNDZ SAVING
SAVINGS SCAN SDF SEC SECOND SHA256 SHA256HEX SHA256HMACHEX SIGN
SIN SINH SKEWNESS SLEEP SMALLEST SOAPWEB SOAPWEBMETA
SOAPWIPSERVICE SOAPWIPSRS SOAPWS SOAPWSMETA SOUNDEX SPEDIS SQRT
SQUANTILE STD STDERR STFIPS STNAME STNAMEL STRIP SUBPAD SUBSTR
SUBSTRN SUM SUMABS SYMEXIST SYMGET SYMGLOBL SYMLOCAL SYSEXIST
SYSGET SYSMSG SYSPARM SYSPROCESSID SYSPROCESSNAME SYSPROD SYSRC
SYSTEM TAN TANH TIME TIMEPART TIMEVALUE TINV TNONCT TODAY
TRANSLATE TRANSTRN TRANWRD TRIGAMMA TRIM TRIMN TRUNC TSO TYPEOF
TZONEID TZONENAME TZONEOFF TZONES2U TZONEU2S UNIFORM UPCASE
URLDECODE URLENCODE USS UUIDGEN VAR VARFMT VARINFMT VARLABEL
VARLEN VARNAME VARNUM VARRAY VARRAYX VARTYPE VERIFY VFORMAT
VFORMATD VFORMATDX VFORMATN VFORMATNX VFORMATW VFORMATWX VFORMATX
VINARRAY VINARRAYX VINFORMAT VINFORMATD VINFORMATDX VINFORMATN
VINFORMATNX VINFORMATW VINFORMATWX VINFORMATX VLABEL VLABELX
VLENGTH VLENGTHX VNAME VNAMEX VTYPE VTYPEX VVALUE VVALUEX WEEK
WEEKDAY WHICHC WHICHN WTO YEAR YIELDP YRDIF YYQ ZIPCITY
ZIPCITYDISTANCE ZIPFIPS ZIPNAME ZIPNAMEL ZIPSTATE
)
end
def self.sas_macro_statements
# from SAS 9.4 Macro Language Reference
# Chapter 12
@sas_macro_statements ||= Set.new %w(
%COPY %DISPLAY %GLOBAL %INPUT %LET %MACRO %PUT %SYMDEL %SYSCALL
%SYSEXEC %SYSLPUT %SYSMACDELETE %SYSMSTORECLEAR %SYSRPUT %WINDOW
%ABORT %DO %TO %UNTIL %WHILE %END %GOTO %IF %THEN %ELSE %LOCAL
%RETURN
%INCLUDE %LIST %RUN
)
# Omitted:
# %label: Identifies the destination of a %GOTO statement.
# %MEND
end
def self.sas_macro_functions
# from SAS 9.4 Macro Language Reference
# Chapter 12
@sas_macro_functions ||= Set.new %w(
%BQUOTE %NRBQUOTE %EVAL %INDEX %LENGTH %QUOTE %NRQUOTE %SCAN
%QSCAN %STR %NRSTR %SUBSTR %QSUBSTR %SUPERQ %SYMEXIST %SYMGLOBL
%SYMLOCAL %SYSEVALF %SYSFUNC %QSYSFUNC %SYSGET %SYSMACEXEC
%SYSMACEXIST %SYSMEXECDEPTH %SYSMEXECNAME %SYSPROD %UNQUOTE
%UPCASE %QUPCASE
)
end
def self.sas_auto_macro_vars
# from SAS 9.4 Macro Language Reference
# Chapter 12
@sas_auto_macro_vars ||= Set.new %w(
&SYSADDRBITS &SYSBUFFR &SYSCC &SYSCHARWIDTH &SYSCMD &SYSDATASTEPPHASE &SYSDATE
&SYSDATE9 &SYSDAY &SYSDEVIC &SYSDMG &SYSDSN &SYSENCODING &SYSENDIAN &SYSENV
&SYSERR &SYSERRORTEXT &SYSFILRC &SYSHOSTINFOLONG &SYSHOSTNAME &SYSINDEX
&SYSINFO &SYSJOBID &SYSLAST &SYSLCKRC &SYSLIBRC &SYSLOGAPPLNAME &SYSMACRONAME
&SYSMENV &SYSMSG &SYSNCPU &SYSNOBS &SYSODSESCAPECHAR &SYSODSPATH &SYSPARM
&SYSPBUFF &SYSPRINTTOLIST &SYSPRINTTOLOG &SYSPROCESSID &SYSPROCESSMODE
&SYSPROCESSNAME &SYSPROCNAME &SYSRC &SYSSCP &SYSSCPL &SYSSITE &SYSSIZEOFLONG
&SYSSIZEOFPTR &SYSSIZEOFUNICODE &SYSSTARTID &SYSSTARTNAME &SYSTCPIPHOSTNAME
&SYSTIME &SYSTIMEZONE &SYSTIMEZONEIDENT &SYSTIMEZONEOFFSET &SYSUSERID &SYSVER
&SYSVLONG &SYSVLONG4 &SYSWARNINGTEXT
)
end
def self.proc_keywords
# Create a hash with keywords for common PROCs, keyed by PROC name
@proc_keywords ||= {}
@proc_keywords["SQL"] ||= Set.new %w(
ALTER TABLE CONNECT CREATE INDEX VIEW DELETE DESCRIBE DISCONNECT DROP EXECUTE
INSERT RESET SELECT UPDATE VALIDATE ADD CONSTRAINT DROP FOREIGN KEY PRIMARY
MODIFY LIKE AS ORDER BY USING FROM INTO SET VALUES RESET DISTINCT UNIQUE
WHERE GROUP HAVING LEFT RIGHT INNER JOIN ON
)
# from SAS 9.4 SQL Procedure User's Guide
@proc_keywords["MEANS"] ||= Set.new %w(
BY CLASS FREQ ID OUTPUT OUT TYPES VAR WAYS WEIGHT
ATTRIB FORMAT LABEL WHERE
DESCENDING NOTSORTED
NOTHREADS NOTRAP PCTLDEF SUMSIZE THREADS CLASSDATA COMPLETETYPES
EXCLUSIVE MISSING FW MAXDEC NONOBS NOPRINT ORDER FORMATTED FREQ
UNFORMATTED PRINT PRINTALLTYPES PRINTIDVARS STACKODSOUTPUT
CHARTYPE DESCENDTYPES IDMIN
ALPHA EXCLNPWGT QMARKERS QMETHOD QNTLDEF VARDEF
CLM CSS CV KURTOSIS KURT LCLM MAX MEAN MIN MODE N
NMISS RANGE SKEWNESS SKEW STDDEV STD STDERR SUM SUMWGT UCLM USS VAR
MEDIAN P50 Q1 P25 Q3 P75 P1 P90 P5 P95 P10 P99 P20 P30 P40 P60 P70
P80 QRANGE
PROBT PRT T
ASCENDING GROUPINTERNAL MLF PRELOADFMT
MAXID AUTOLABEL AUTONAME KEEPLEN LEVELS NOINHERIT
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["DATASETS"] ||= Set.new %w(
AGE APPEND ATTRIB AUDIT CHANGE CONTENTS COPY DELETE EXCHANGE
EXCLUDE FORMAT IC CREATE DELETE REACTIVATE INDEX CENTILES INFORMAT
INITIATE LABEL LOG MODIFY REBUILD RENAME REPAIR RESUME SAVE SELECT
SUSPEND TERMINATE USER_VAR XATTR ADD OPTIONS REMOVE SET
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["SORT"] ||= Set.new %w(
BY DESCENDING KEY ASCENDING ASC DESC DATECOPY FORCE OVERWRITE
PRESORTED SORTSIZE TAGSORT DUPOUT OUT UNIQUEOUT NODUPKEY NOUNIQUEKEY
NOTHREADS THREADS EQUALS NOEQUALS
ATTRIB FORMAT LABEL WHERE
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["PRINT"] ||= Set.new %w(
BY DESCENDING NOTSORTED PAGEBY SUMBY ID STYLE SUM VAR CONTENTS DATA
GRANDTOTAL_LABEL HEADING LABEL SPLIT SUMLABEL NOSUMLABEL
BLANKLINE COUNT DOUBLE N NOOBS OBS ROUND
ROWS UNIFORM WIDTH
ATTRIB FORMAT LABEL WHERE
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["APPEND"] ||= Set.new %w(
BASE APPENDVER DATA ENCRYPTKEY FORCE GETSORT NOWARN
ATTRIB FORMAT LABEL WHERE
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["TRANSPOSE"] ||= Set.new %w(
DELIMITER LABEL LET NAME OUT PREFIX SUFFIX BY DESCENDING NOTSORTED
COPY ID IDLABEL VAR INDB
ATTRIB FORMAT LABEL WHERE
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["FREQ"] ||= Set.new %w(
BY EXACT OUTPUT TABLES TEST WEIGHT
COMPRESS DATA FORMCHAR NLEVELS NOPRINT ORDER PAGE FORMATTED FREQ
INTERNAL
AGREE BARNARD BINOMIAL BIN CHISQ COMOR EQOR ZELEN FISHER JT KAPPA
KENTB TAUB LRCHI MCNEM MEASURES MHCHI OR ODDSRATIO PCHI PCORR RELRISK
RISKDIFF SCORR SMDCR SMDRC STUTC TAUC TREND WTKAP WTKAPPA
OUT AJCHI ALL BDCHI CMH CMH1 CMH2 CMHCOR CMHGA CMHRMS COCHQ CONTGY
CRAMV EQKAP EQWKP GAMMA GS GAILSIMON LAMCR LAMDAS LAMRC LGOR LGRRC1
LGRRC2 MHOR MHRRC1 MHRRC2 N NMISS PHI PLCORR RDIF1 RDIF2 RISKDIFF1
RISKDIFF2 RRC1 RELRISK1 RRC2 RELRISK2 RSK1 RISK1 RSK11 RISK11 RSK12
RISK12 RSK21 RISK21 RSK22 RISK22 TSYMM BOWKER U UCR URC
CELLCHI2 CUMCOL DEVIATION EXPECTED MISSPRINT PEARSONREF PRINTWKTS
SCOROUT SPARSE STDRES TOTPCT
CONTENTS CROSSLIST FORMAT LIST MAXLEVELS NOCOL NOCUM NOFREQ NOPERCENT
NOPRINT NOROW NOSPARSE NOWARN PLOTS OUT OUTCUM OUTEXPECT OUTPCT
ZEROS
)
# from Base SAS 9.4 Procedures Guide: Statistical Procedures, Fourth Edition
@proc_keywords["CORR"] ||= Set.new %w(
BY FREQ ID PARTIAL VAR WEIGHT WITH
DATA OUTH OUTK OUTP OUTPLC OUTPLS OUTS
EXCLNPWGHT FISHER HOEFFDING KENDALL NOMISS PEARSON POLYCHORIC
POLYSERIAL ALPHA COV CSSCP SINGULAR SSCP VARDEF PLOTS MATRIX SCATTER
BEST NOCORR NOPRINT NOPROB NOSIMPLE RANK
)
# from Base SAS 9.4 Procedures Guide: Statistical Procedures, Fourth Edition
@proc_keywords["REPORT"] ||= Set.new %w(
BREAK BY DESCENDING NOTSORTED COLUMN COMPUTE STYLE LINE ENDCOMP
CALL DEFINE _ROW_ FREQ RBREAK WEIGHT
ATTRIB FORMAT LABEL WHERE
DATA NOALIAS NOCENTER NOCOMPLETECOLS NOCOMPLETEROWS NOTHREADS
NOWINDOWS OUT PCTLDEF THREADS WINDOWS COMPLETECOLS NOCOMPLETECOLS
COMPLETEROWS NOCOMPLETEROWS CONTENTS SPANROWS COMMAND HELP PROMPT
BOX BYPAGENO CENTER NOCENTER COLWIDTH FORMCHAR LS MISSING PANELS PS
PSPACE SHOWALL SPACING WRAP EXCLNPWGT QMARKERS QMETHOD QNTLDEF VARDEF
NAMED NOHEADER SPLIT HEADLINE HEADSKIP LIST NOEXEC OUTREPT PROFILE
REPORT
COLOR DOL DUL OL PAGE SKIP SUMMARIZE SUPPRESS UL
BLINK COMMAND HIGHLIGHT RVSVIDEO MERGE REPLACE URL URLBP URLP
AFTER BEFORE _PAGE_ LEFT RIGHT CHARACTER LENGTH
EXCLUSIVE MISSING MLF ORDER DATA FORMATTED FREQ INTERNAL PRELOADFMT
WIDTH
ACROSS ANALYSIS COMPUTED DISPLAY GROUP ORDER
CONTENTS FLOW ID NOPRINT NOZERO PAGE
CSS CV MAX MEAN MIN MODE N NMISS PCTN PCTSUM RANGE STD STDERR SUM
SUMWGT USS VAR
MEDIAN P50 Q1 P25 Q3 P75 P1 P90 P5 P95 P10 P99 P20 P30 P40 P60 P70
P80 QRANGE
PROBT PRT T
)
# from BASE SAS 9.4 Procedures Guide, Fifth Edition
@proc_keywords["METALIB"] ||= Set.new %w(
OMR DBAUTH DBUSER DBPASSWORD EXCLUDE SELECT READ FOLDER FOLDERID
IMPACT_LIMIT NOEXEC PREFIX REPORT UPDATE_RULE DELETE NOADD NODELDUP
NOUPDATE
LIBID LIBRARY LIBURI
TYPE DETAIL SUMMARY
)
# from SAS 9.4 Language Interfaces to Metadata, Third Edition
@proc_keywords["GCHART"] ||= Set.new %w(
DATA ANNOTATE GOUT IMAGEMAP BLOCK HBAR HBAR3D VBAR VBAR3D PIE PIE3D
DONUT STAR ANNO
BY NOTE FORMAT LABEL WHERE
BLOCKMAX CAXIS COUTLINE CTEXT LEGEND NOHEADING NOLEGEND PATTERNID
GROUP MIDPOINT SUBGROUP WOUTLINE DESCRIPTION NAME DISCRETE LEVELS
OLD MISSING HTML_LEGEND HTML URL FREQ G100 SUMVAR TYPE
CAUTOREF CERROR CFRAME CLM CREF FRAME NOFRAME GSPACE IFRAME
IMAGESTYLE TILE FIT LAUTOREF NOSYMBOL PATTERNID SHAPE SPACE
SUBOUTSIDE WAUTOREF WIDTH WOUTLINE WREF
ASCENDING AUTOREF CLIPREF DESCENDING FRONTREF GAXIS MAXIS MINOR
NOAXIS NOBASEREF NOZERO RANGE AXIS REF CFREQ CFREQLABEL NONE CPERCENT
CPERCENTLABEL ERRORBAR BARS BOTH TOP FREQLABEL INSIDE MEAN MEANLABEL
NOSTATS OUTSIDE PERCENT PERCENTLABEL PERCENTSUM SUM
CFILL COUTLINE DETAIL_RADIUS EXPLODE FILL SOLID X INVISIBLE NOHEADING
RADIUS WOUTLINE DETAIL_THRESHOLD DETAIL_PERCENT DETAIL_SLICE
DETAIL_VALUE DONUTPCT LABEL ACROSS DOWN GROUP NOGROUPHEADING SUBGROUP
MATCHCOLOR OTHERCOLOR OTHERLABEL PERCENT ARROW PLABEL PPERCENT SLICE
VALUE
ANGLE ASCENDING CLOCKWISE DESCENDING JSTYLE
NOCONNECT STARMAX STARMIN
)
# from SAS GRAPH 9.4 Reference, Fourth Edition
@proc_keywords["GPLOT"] ||= Set.new %w(
DATA ANNOTATE GOUT IMAGEMAP UNIFORM BUBBLE BUBBLE2 PLOT PLOT2
BCOLOR BFILL BFONT BLABEL BSCALE AREA RADIUS BSIZE DESCRIPTION NAME
AUTOHREF CAUTOHREF CHREF HAXIS HMINOR HREF HREVERSE HZERO LAUTOHREF
LHREF WAUTOHREF WHREF HTML URL
CAXIS CFRAME CTEXT DATAORDER FRAME NOFRAME FRONTREF GRID IFRAME
IMAGESTYLE TILE FIT NOAXIS
AUTOVREF CAUTOVREF CVREF LAUTOVREF LVREF VAXIS VMINOR VREF VREVERSE
VZERO WAUTOVREF WVREF
CBASELINE COUTLINE
AREAS GRID LEGEND NOLASTAREA NOLEGEND OVERLAY REGEQN SKIPMISS
)
# from SAS GRAPH 9.4 Reference, Fourth Edition
@proc_keywords["REG"] ||= Set.new %w(
MODEL BY FREQ ID VAR WEIGHT ADD CODE DELETE MTEST OUTPUT PAINT
PLOT PRINT REFIT RESTRICT REWEIGHT STORE TEST
)
# from SAS/STAT 15.1 User's Guide
@proc_keywords["SGPLOT"] ||= Set.new %w(
STYLEATTRS BAND X Y UPPER LOWER BLOCK BUBBLE DENSITY DOT DROPLINE
ELLIPSE ELLIPSEPARM FRINGE GRADLEGEND HBAR HBARBASIC HBARPARM
HBOX HEATMAP HEATMAPPARM HIGHLOW HISTOGRAM HLINE INSET KEYLEGEND
LINEPARM LOESS NEEDLE PBSPLINE POLYGON REFLINE REG SCATTER SERIES
SPLINE STEP SYMBOLCHAR SYMBOLIMAGE TEXT VBAR VBARBASIC VBARPARM
VBOX VECTOR VLINE WATERFALL XAXIS X2AXIS XAXISTABLE YAXIS Y2AXIS
YAXISTABLE
)
# from ODS Graphics: Procedures Guide, Sixth Edition
return @proc_keywords
end
def self.sas_proc_names
# from SAS Procedures by Name
# http://support.sas.com/documentation/cdl/en/allprodsproc/68038/HTML/default/viewer.htm#procedures.htm
@sas_proc_names ||= Set.new %w(
ACCESS ACECLUS ADAPTIVEREG ALLELE ANOM ANOVA APPEND APPSRV ARIMA
AUTHLIB AUTOREG BCHOICE BOM BOXPLOT BTL BUILD CALENDAR CALIS CALLRFC
CANCORR CANDISC CAPABILITY CASECONTROL CATALOG CATMOD CDISC CDISC
CHART CIMPORT CLP CLUSTER COMPARE COMPILE COMPUTAB CONTENTS CONVERT
COPULA COPY CORR CORRESP COUNTREG CPM CPORT CUSUM CV2VIEW DATEKEYS
DATASETS DATASOURCE DB2EXT DB2UTIL DBCSTAB DBF DBLOAD DELETE DIF
DISCRIM DISPLAY DISTANCE DMSRVADM DMSRVDATASVC DMSRVPROCESSSVC
DOCUMENT DOWNLOAD DQLOCLST DQMATCH DQSCHEME DS2 DTREE ENTROPY ESM
EXPAND EXPLODE EXPORT FACTEX FACTOR FAMILY FASTCLUS FCMP FEDSQL FMM
FONTREG FORECAST FORMAT FORMS FREQ FSBROWSE FSEDIT FSLETTER FSLIST
FSVIEW G3D G3GRID GA GAM GAMPL GANNO GANTT GAREABAR GBARLINE GCHART
GCONTOUR GDEVICE GEE GENESELECT GENMOD GEOCODE GFONT GINSIDE GIS GKPI
GLIMMIX GLM GLMMOD GLMPOWER GLMSELECT GMAP GOPTIONS GPLOT GPROJECT
GRADAR GREDUCE GREMOVE GREPLAY GROOVY GSLIDE GTILE HADOOP HAPLOTYPE
HDMD HPBIN HPCANDISC HPCDM HPCOPULA HPCORR HPCOUNTREG HPDMDB HPDS2
HPFMM HPGENSELECT HPIMPUTE HPLMIXED HPLOGISTIC HPMIXED HPNLMOD
HPPANEL HPPLS HPPRINCOMP HPQUANTSELECT HPQLIM HPREG HPSAMPLE
HPSEVERITY HPSPLIT HPSUMMARY HTSNP HTTP ICLIFETEST ICPHREG IML IMPORT
IMSTAT IMXFER INBREED INFOMAPS INTPOINT IOMOPERATE IRT ISHIKAWA ITEMS
JAVAINFO JSON KDE KRIGE2D LASR LATTICE LIFEREG LIFETEST LOAN
LOCALEDATA LOESS LOGISTIC LP LUA MACONTROL MAPIMPORT MCMC MDC MDDB
MDS MEANS METADATA METALIB METAOPERATE MI MIANALYZE MIGRATE MIXED
MODECLUS MODEL MSCHART MULTTEST MVPDIAGNOSE MVPMODEL MVPMONITOR
NESTED NETDRAW NETFLOW NLIN NLMIXED NLP NPAR1WAY ODSLIST ODSTABLE
ODSTEXT OLAP OLAPCONTENTS OLAPOPERATE OPERATE OPTEX OPTGRAPH OPTIONS
OPTLOAD OPTLP OPTLSO OPTMILP OPTMODEL OPTNET OPTQP OPTSAVE ORTHOREG
PANEL PARETO PDLREG PDS PDSCOPY PHREG PLAN PLM PLOT PLS PM PMENU
POWER PRESENV PRINCOMP PRINQUAL PRINT PRINTTO PROBIT PROTO PRTDEF
PRTEXP PSMOOTH PWENCODE QDEVICE QLIM QUANTLIFE QUANTREG QUANTSELECT
QUEST RANK RAREEVENTS RDC RDPOOL RDSEC RECOMMEND REG REGISTRY RELEASE
RELIABILITY REPORT RISK ROBUSTREG RSREG SCAPROC SCORE SEQDESIGN
SEQTEST SERVER SEVERITY SGDESIGN SGPANEL SGPLOT SGRENDER SGSCATTER
SHEWHART SIM2D SIMILARITY SIMLIN SIMNORMAL SOAP SORT SOURCE SPECTRA
SPP SQL SQOOP SSM STANDARD STATESPACE STDIZE STDRATE STEPDISC STP
STREAM SUMMARY SURVEYFREQ SURVEYIMPUTE SURVEYLOGISTIC SURVEYMEANS
SURVEYPHREG SURVEYREG SURVEYSELECT SYSLIN TABULATE TAPECOPY TAPELABEL
TEMPLATE TIMEDATA TIMEID TIMEPLOT TIMESERIES TPSPLINE TRANSPOSE
TRANSREG TRANTAB TREE TSCSREG TTEST UCM UNIVARIATE UPLOAD VARCLUS
VARCOMP VARIOGRAM VARMAX VASMP X11 X12 X13 XSL
)
end
state :basics do
# Rules to be parsed before the keywords (which are different depending
# on the context)
rule %r/\s+/m, Text
# Single-line comments (between * and ;) - these can actually go onto multiple lines
# case 1 - where it starts a line
rule %r/^\s*%?\*[^;]*;/m, Comment::Single
# case 2 - where it follows the previous statement on the line (after a semicolon)
rule %r/(;)(\s*)(%?\*[^;]*;)/m do
groups Punctuation, Text, Comment::Single
end
# True multiline comments!
rule %r(/[*].*?[*]/)m, Comment::Multiline
# date/time constants (Language Reference pp91-2)
rule %r/'[0-9a-z]+?'d/i, Literal::Date
rule %r/'.+?'dt/i, Literal::Date
rule %r/'[0-9:]+?([a|p]m)?'t/i, Literal::Date
rule %r/'/, Str::Single, :single_string
rule %r/"/, Str::Double, :double_string
rule %r/&[a-z0-9_&.]+/i, Name::Variable
# numeric constants (Language Reference p91)
rule %r/\d[0-9a-f]*x/i, Num::Hex
rule %r/\d[0-9e\-.]+/i, Num # scientific notation
# auto variables from DATA step (Language Reference p46, p37)
rule %r/\b(_n_|_error_|_file_|_infile_|_msg_|_iorc_|_cmd_)\b/i, Name::Builtin::Pseudo
# auto variable list names
rule %r/\b(_character_|_numeric_|_all_)\b/i, Name::Builtin
# datalines/cards etc
rule %r/\b(datalines|cards)(\s*)(;)/i do
groups Keyword, Text, Punctuation
push :datalines
end
rule %r/\b(datalines4|cards4)(\s*)(;)/i do
groups Keyword, Text, Punctuation
push :datalines4
end
# operators (Language Reference p96)
rule %r(\*\*|[\*/\+-]), Operator
rule %r/[^¬~]?=:?|[<>]=?:?/, Operator
rule %r/\b(eq|ne|gt|lt|ge|le|in)\b/i, Operator::Word
rule %r/[&|!¦¬∘~]/, Operator
rule %r/\b(and|or|not)\b/i, Operator::Word
rule %r/(<>|><)/, Operator # min/max
rule %r/\|\|/, Operator # concatenation
# The OF operator should also be highlighted (Language Reference p49)
rule %r/\b(of)\b/i, Operator::Word
rule %r/\b(like)\b/i, Operator::Word # Language Ref p181
rule %r/\d+/, Num::Integer
rule %r/\$/, Keyword::Type
# Macro definitions
rule %r/(%macro|%mend)(\s*)(\w+)/i do
groups Keyword, Text, Name::Function
end
rule %r/%mend/, Keyword
rule %r/%\w+/ do |m|
if self.class.sas_macro_statements.include? m[0].upcase
token Keyword
elsif self.class.sas_macro_functions.include? m[0].upcase
token Keyword
else
token Name
end
end
end
state :basics2 do
# Rules to be parsed after the keywords (which are different depending
# on the context)
# Missing values (Language Reference p81)
rule %r/\s\.[;\s]/, Keyword::Constant # missing
rule %r/\s\.[a-z_]/, Name::Constant # user-defined missing
rule %r/[\(\),;:\{\}\[\]\\\.]/, Punctuation
rule %r/@/, Str::Symbol # line hold specifiers
rule %r/\?/, Str::Symbol # used for format modifiers
rule %r/[^\s]+/, Text # Fallback for anything we haven't matched so far
end
state :root do
mixin :basics
# PROC definitions
rule %r!(proc)(\s+)(\w+)!ix do |m|
@proc_name = m[3].upcase
puts " proc name: #{@proc_name}" if @debug
if self.class.sas_proc_names.include? @proc_name
groups Keyword, Text, Keyword
else
groups Keyword, Text, Name
end
push :proc
end
# Data step definitions
rule %r/(data)(\s+)([\w\.]+)/i do
groups Keyword, Text, Name::Variable
end
# Libname definitions
rule %r/(libname)(\s+)(\w+)/i do
groups Keyword, Text, Name::Variable
end
rule %r/\w+/ do |m|
if self.class.data_step_statements.include? m[0].upcase
token Keyword
elsif self.class.sas_functions.include? m[0].upcase
token Keyword
else
token Name
end
end
mixin :basics2
end
state :single_string do
rule %r/''/, Str::Escape
rule %r/'/, Str::Single, :pop!
rule %r/[^']+/, Str::Single
end
state :double_string do
rule %r/&[a-z0-9_&]+\.?/i, Str::Interpol
rule %r/""/, Str::Escape
rule %r/"/, Str::Double, :pop!
rule %r/[^&"]+/, Str::Double
# Allow & to be used as character if not already matched as macro variable
rule %r/&/, Str::Double
end
state :datalines do
rule %r/[^;]/, Literal::String::Heredoc
rule %r/;/, Punctuation, :pop!
end
state :datalines4 do
rule %r/;{4}/, Punctuation, :pop!
rule %r/[^;]/, Literal::String::Heredoc
rule %r/;{,3}/, Literal::String::Heredoc
end
# PROCS
state :proc do
rule %r/(quit|run)/i, Keyword, :pop!
mixin :basics
rule %r/\w+/ do |m|
if self.class.data_step_statements.include? m[0].upcase
token Keyword
elsif self.class.sas_functions.include? m[0].upcase
token Keyword
elsif self.class.proc_keywords.has_key?(@proc_name) and self.class.proc_keywords[@proc_name].include? m[0].upcase
token Keyword
else
token Name
end
end
mixin :basics2
end
end #class SAS
end #module Lexers
end #module Rouge