Implementation
final sas = Mode(
refs: {},
name: "SAS",
case_insensitive: true,
keywords: {
"literal": [
"null",
"missing",
"_all_",
"_automatic_",
"_character_",
"_infile_",
"_n_",
"_name_",
"_null_",
"_numeric_",
"_user_",
"_webout_"
],
"keyword": [
"do",
"if",
"then",
"else",
"end",
"until",
"while",
"abort",
"array",
"attrib",
"by",
"call",
"cards",
"cards4",
"catname",
"continue",
"datalines",
"datalines4",
"delete",
"delim",
"delimiter",
"display",
"dm",
"drop",
"endsas",
"error",
"file",
"filename",
"footnote",
"format",
"goto",
"in",
"infile",
"informat",
"input",
"keep",
"label",
"leave",
"length",
"libname",
"link",
"list",
"lostcard",
"merge",
"missing",
"modify",
"options",
"output",
"out",
"page",
"put",
"redirect",
"remove",
"rename",
"replace",
"retain",
"return",
"select",
"set",
"skip",
"startsas",
"stop",
"title",
"update",
"waitsas",
"where",
"window",
"x|0",
"systask",
"add",
"and",
"alter",
"as",
"cascade",
"check",
"create",
"delete",
"describe",
"distinct",
"drop",
"foreign",
"from",
"group",
"having",
"index",
"insert",
"into",
"in",
"key",
"like",
"message",
"modify",
"msgtype",
"not",
"null",
"on",
"or",
"order",
"primary",
"references",
"reset",
"restrict",
"select",
"set",
"table",
"unique",
"update",
"validate",
"view",
"where"
]
},
contains: [
Mode(
className: "keyword",
begin: "^\\s*(proc [\\w\\d_]+|data|run|quit)[\\s;]"),
Mode(className: "variable", begin: "&[a-zA-Z_&][a-zA-Z0-9_]*\\.?"),
Mode(
begin: ["^\\s*", "datalines;|cards;", "(?:.*\\n)+", "^\\s*;\\s*\$"],
className: {"2": "keyword", "3": "string"}),
Mode(
begin: ["%mend|%macro", "\\s+", "[a-zA-Z_&][a-zA-Z0-9_]*"],
className: {"1": "built_in", "3": "title.function"}),
Mode(
className: "built_in",
begin:
"%(?:bquote|nrbquote|cmpres|qcmpres|compstor|datatyp|display|do|else|end|eval|global|goto|if|index|input|keydef|label|left|length|let|local|lowcase|macro|mend|nrbquote|nrquote|nrstr|put|qcmpres|qleft|qlowcase|qscan|qsubstr|qsysfunc|qtrim|quote|qupcase|scan|str|substr|superq|syscall|sysevalf|sysexec|sysfunc|sysget|syslput|sysprod|sysrc|sysrput|then|to|trim|unquote|until|upcase|verify|while|window)"),
Mode(className: "title.function", begin: "%[a-zA-Z_][a-zA-Z_0-9]*"),
Mode(
className: "meta",
begin:
"(?:abs|addr|airy|arcos|arsin|atan|attrc|attrn|band|betainv|blshift|bnot|bor|brshift|bxor|byte|cdf|ceil|cexist|cinv|close|cnonct|collate|compbl|compound|compress|cos|cosh|css|curobs|cv|daccdb|daccdbsl|daccsl|daccsyd|dacctab|dairy|date|datejul|datepart|datetime|day|dclose|depdb|depdbsl|depdbsl|depsl|depsl|depsyd|depsyd|deptab|deptab|dequote|dhms|dif|digamma|dim|dinfo|dnum|dopen|doptname|doptnum|dread|dropnote|dsname|erf|erfc|exist|exp|fappend|fclose|fcol|fdelete|fetch|fetchobs|fexist|fget|fileexist|filename|fileref|finfo|finv|fipname|fipnamel|fipstate|floor|fnonct|fnote|fopen|foptname|foptnum|fpoint|fpos|fput|fread|frewind|frlen|fsep|fuzz|fwrite|gaminv|gamma|getoption|getvarc|getvarn|hbound|hms|hosthelp|hour|ibessel|index|indexc|indexw|input|inputc|inputn|int|intck|intnx|intrr|irr|jbessel|juldate|kurtosis|lag|lbound|left|length|lgamma|libname|libref|log|log10|log2|logpdf|logpmf|logsdf|lowcase|max|mdy|mean|min|minute|mod|month|mopen|mort|n|netpv|nmiss|normal|note|npv|open|ordinal|pathname|pdf|peek|peekc|pmf|point|poisson|poke|probbeta|probbnml|probchi|probf|probgam|probhypr|probit|probnegb|probnorm|probt|put|putc|putn|qtr|quote|ranbin|rancau|ranexp|rangam|range|rank|rannor|ranpoi|rantbl|rantri|ranuni|repeat|resolve|reverse|rewind|right|round|saving|scan|sdf|second|sign|sin|sinh|skewness|soundex|spedis|sqrt|std|stderr|stfips|stname|stnamel|substr|sum|symget|sysget|sysmsg|sysprod|sysrc|system|tan|tanh|time|timepart|tinv|tnonct|today|translate|tranwrd|trigamma|trim|trimn|trunc|uniform|upcase|uss|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|weekday|year|yyq|zipfips|zipname|zipnamel|zipstate)(?=\\()"),
Mode(
className: "string", variants: [APOS_STRING_MODE, QUOTE_STRING_MODE]),
Mode(scope: "comment", begin: "\\*", end: ";", contains: [
Mode(
scope: "doctag",
begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",
end: "(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",
excludeBegin: true,
relevance: 0),
Mode(
begin:
"[ ]+((?:I|a|is|so|us|to|at|if|in|it|on|[A-Za-z]+['](d|ve|re|ll|t|s|n)|[A-Za-z]+[-][a-z]+|[A-Za-z][a-z]{2,})[.]?[:]?([.][ ]|[ ])){3}")
]),
C_BLOCK_COMMENT_MODE
]);