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