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
|