564 lines
26 KiB
Ruby
564 lines
26 KiB
Ruby
# -*- 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
|