sas.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. /*
  2. Language: SAS
  3. Author: Mauricio Caceres <mauricio.caceres.bravo@gmail.com>
  4. Description: Syntax Highlighting for SAS
  5. Category: scientific
  6. */
  7. /** @type LanguageFn */
  8. function sas(hljs) {
  9. const regex = hljs.regex;
  10. // Data step and PROC SQL statements
  11. const SAS_KEYWORDS = [
  12. "do",
  13. "if",
  14. "then",
  15. "else",
  16. "end",
  17. "until",
  18. "while",
  19. "abort",
  20. "array",
  21. "attrib",
  22. "by",
  23. "call",
  24. "cards",
  25. "cards4",
  26. "catname",
  27. "continue",
  28. "datalines",
  29. "datalines4",
  30. "delete",
  31. "delim",
  32. "delimiter",
  33. "display",
  34. "dm",
  35. "drop",
  36. "endsas",
  37. "error",
  38. "file",
  39. "filename",
  40. "footnote",
  41. "format",
  42. "goto",
  43. "in",
  44. "infile",
  45. "informat",
  46. "input",
  47. "keep",
  48. "label",
  49. "leave",
  50. "length",
  51. "libname",
  52. "link",
  53. "list",
  54. "lostcard",
  55. "merge",
  56. "missing",
  57. "modify",
  58. "options",
  59. "output",
  60. "out",
  61. "page",
  62. "put",
  63. "redirect",
  64. "remove",
  65. "rename",
  66. "replace",
  67. "retain",
  68. "return",
  69. "select",
  70. "set",
  71. "skip",
  72. "startsas",
  73. "stop",
  74. "title",
  75. "update",
  76. "waitsas",
  77. "where",
  78. "window",
  79. "x|0",
  80. "systask",
  81. "add",
  82. "and",
  83. "alter",
  84. "as",
  85. "cascade",
  86. "check",
  87. "create",
  88. "delete",
  89. "describe",
  90. "distinct",
  91. "drop",
  92. "foreign",
  93. "from",
  94. "group",
  95. "having",
  96. "index",
  97. "insert",
  98. "into",
  99. "in",
  100. "key",
  101. "like",
  102. "message",
  103. "modify",
  104. "msgtype",
  105. "not",
  106. "null",
  107. "on",
  108. "or",
  109. "order",
  110. "primary",
  111. "references",
  112. "reset",
  113. "restrict",
  114. "select",
  115. "set",
  116. "table",
  117. "unique",
  118. "update",
  119. "validate",
  120. "view",
  121. "where"
  122. ];
  123. // Built-in SAS functions
  124. const FUNCTIONS = [
  125. "abs",
  126. "addr",
  127. "airy",
  128. "arcos",
  129. "arsin",
  130. "atan",
  131. "attrc",
  132. "attrn",
  133. "band",
  134. "betainv",
  135. "blshift",
  136. "bnot",
  137. "bor",
  138. "brshift",
  139. "bxor",
  140. "byte",
  141. "cdf",
  142. "ceil",
  143. "cexist",
  144. "cinv",
  145. "close",
  146. "cnonct",
  147. "collate",
  148. "compbl",
  149. "compound",
  150. "compress",
  151. "cos",
  152. "cosh",
  153. "css",
  154. "curobs",
  155. "cv",
  156. "daccdb",
  157. "daccdbsl",
  158. "daccsl",
  159. "daccsyd",
  160. "dacctab",
  161. "dairy",
  162. "date",
  163. "datejul",
  164. "datepart",
  165. "datetime",
  166. "day",
  167. "dclose",
  168. "depdb",
  169. "depdbsl",
  170. "depdbsl",
  171. "depsl",
  172. "depsl",
  173. "depsyd",
  174. "depsyd",
  175. "deptab",
  176. "deptab",
  177. "dequote",
  178. "dhms",
  179. "dif",
  180. "digamma",
  181. "dim",
  182. "dinfo",
  183. "dnum",
  184. "dopen",
  185. "doptname",
  186. "doptnum",
  187. "dread",
  188. "dropnote",
  189. "dsname",
  190. "erf",
  191. "erfc",
  192. "exist",
  193. "exp",
  194. "fappend",
  195. "fclose",
  196. "fcol",
  197. "fdelete",
  198. "fetch",
  199. "fetchobs",
  200. "fexist",
  201. "fget",
  202. "fileexist",
  203. "filename",
  204. "fileref",
  205. "finfo",
  206. "finv",
  207. "fipname",
  208. "fipnamel",
  209. "fipstate",
  210. "floor",
  211. "fnonct",
  212. "fnote",
  213. "fopen",
  214. "foptname",
  215. "foptnum",
  216. "fpoint",
  217. "fpos",
  218. "fput",
  219. "fread",
  220. "frewind",
  221. "frlen",
  222. "fsep",
  223. "fuzz",
  224. "fwrite",
  225. "gaminv",
  226. "gamma",
  227. "getoption",
  228. "getvarc",
  229. "getvarn",
  230. "hbound",
  231. "hms",
  232. "hosthelp",
  233. "hour",
  234. "ibessel",
  235. "index",
  236. "indexc",
  237. "indexw",
  238. "input",
  239. "inputc",
  240. "inputn",
  241. "int",
  242. "intck",
  243. "intnx",
  244. "intrr",
  245. "irr",
  246. "jbessel",
  247. "juldate",
  248. "kurtosis",
  249. "lag",
  250. "lbound",
  251. "left",
  252. "length",
  253. "lgamma",
  254. "libname",
  255. "libref",
  256. "log",
  257. "log10",
  258. "log2",
  259. "logpdf",
  260. "logpmf",
  261. "logsdf",
  262. "lowcase",
  263. "max",
  264. "mdy",
  265. "mean",
  266. "min",
  267. "minute",
  268. "mod",
  269. "month",
  270. "mopen",
  271. "mort",
  272. "n",
  273. "netpv",
  274. "nmiss",
  275. "normal",
  276. "note",
  277. "npv",
  278. "open",
  279. "ordinal",
  280. "pathname",
  281. "pdf",
  282. "peek",
  283. "peekc",
  284. "pmf",
  285. "point",
  286. "poisson",
  287. "poke",
  288. "probbeta",
  289. "probbnml",
  290. "probchi",
  291. "probf",
  292. "probgam",
  293. "probhypr",
  294. "probit",
  295. "probnegb",
  296. "probnorm",
  297. "probt",
  298. "put",
  299. "putc",
  300. "putn",
  301. "qtr",
  302. "quote",
  303. "ranbin",
  304. "rancau",
  305. "ranexp",
  306. "rangam",
  307. "range",
  308. "rank",
  309. "rannor",
  310. "ranpoi",
  311. "rantbl",
  312. "rantri",
  313. "ranuni",
  314. "repeat",
  315. "resolve",
  316. "reverse",
  317. "rewind",
  318. "right",
  319. "round",
  320. "saving",
  321. "scan",
  322. "sdf",
  323. "second",
  324. "sign",
  325. "sin",
  326. "sinh",
  327. "skewness",
  328. "soundex",
  329. "spedis",
  330. "sqrt",
  331. "std",
  332. "stderr",
  333. "stfips",
  334. "stname",
  335. "stnamel",
  336. "substr",
  337. "sum",
  338. "symget",
  339. "sysget",
  340. "sysmsg",
  341. "sysprod",
  342. "sysrc",
  343. "system",
  344. "tan",
  345. "tanh",
  346. "time",
  347. "timepart",
  348. "tinv",
  349. "tnonct",
  350. "today",
  351. "translate",
  352. "tranwrd",
  353. "trigamma",
  354. "trim",
  355. "trimn",
  356. "trunc",
  357. "uniform",
  358. "upcase",
  359. "uss",
  360. "var",
  361. "varfmt",
  362. "varinfmt",
  363. "varlabel",
  364. "varlen",
  365. "varname",
  366. "varnum",
  367. "varray",
  368. "varrayx",
  369. "vartype",
  370. "verify",
  371. "vformat",
  372. "vformatd",
  373. "vformatdx",
  374. "vformatn",
  375. "vformatnx",
  376. "vformatw",
  377. "vformatwx",
  378. "vformatx",
  379. "vinarray",
  380. "vinarrayx",
  381. "vinformat",
  382. "vinformatd",
  383. "vinformatdx",
  384. "vinformatn",
  385. "vinformatnx",
  386. "vinformatw",
  387. "vinformatwx",
  388. "vinformatx",
  389. "vlabel",
  390. "vlabelx",
  391. "vlength",
  392. "vlengthx",
  393. "vname",
  394. "vnamex",
  395. "vtype",
  396. "vtypex",
  397. "weekday",
  398. "year",
  399. "yyq",
  400. "zipfips",
  401. "zipname",
  402. "zipnamel",
  403. "zipstate"
  404. ];
  405. // Built-in macro functions
  406. const MACRO_FUNCTIONS = [
  407. "bquote",
  408. "nrbquote",
  409. "cmpres",
  410. "qcmpres",
  411. "compstor",
  412. "datatyp",
  413. "display",
  414. "do",
  415. "else",
  416. "end",
  417. "eval",
  418. "global",
  419. "goto",
  420. "if",
  421. "index",
  422. "input",
  423. "keydef",
  424. "label",
  425. "left",
  426. "length",
  427. "let",
  428. "local",
  429. "lowcase",
  430. "macro",
  431. "mend",
  432. "nrbquote",
  433. "nrquote",
  434. "nrstr",
  435. "put",
  436. "qcmpres",
  437. "qleft",
  438. "qlowcase",
  439. "qscan",
  440. "qsubstr",
  441. "qsysfunc",
  442. "qtrim",
  443. "quote",
  444. "qupcase",
  445. "scan",
  446. "str",
  447. "substr",
  448. "superq",
  449. "syscall",
  450. "sysevalf",
  451. "sysexec",
  452. "sysfunc",
  453. "sysget",
  454. "syslput",
  455. "sysprod",
  456. "sysrc",
  457. "sysrput",
  458. "then",
  459. "to",
  460. "trim",
  461. "unquote",
  462. "until",
  463. "upcase",
  464. "verify",
  465. "while",
  466. "window"
  467. ];
  468. const LITERALS = [
  469. "null",
  470. "missing",
  471. "_all_",
  472. "_automatic_",
  473. "_character_",
  474. "_infile_",
  475. "_n_",
  476. "_name_",
  477. "_null_",
  478. "_numeric_",
  479. "_user_",
  480. "_webout_"
  481. ];
  482. return {
  483. name: 'SAS',
  484. case_insensitive: true,
  485. keywords: {
  486. literal: LITERALS,
  487. keyword: SAS_KEYWORDS
  488. },
  489. contains: [
  490. {
  491. // Distinct highlight for proc <proc>, data, run, quit
  492. className: 'keyword',
  493. begin: /^\s*(proc [\w\d_]+|data|run|quit)[\s;]/
  494. },
  495. {
  496. // Macro variables
  497. className: 'variable',
  498. begin: /&[a-zA-Z_&][a-zA-Z0-9_]*\.?/
  499. },
  500. {
  501. begin: [
  502. /^\s*/,
  503. /datalines;|cards;/,
  504. /(?:.*\n)+/,
  505. /^\s*;\s*$/
  506. ],
  507. className: {
  508. 2: "keyword",
  509. 3: "string"
  510. }
  511. },
  512. {
  513. begin: [
  514. /%mend|%macro/,
  515. /\s+/,
  516. /[a-zA-Z_&][a-zA-Z0-9_]*/
  517. ],
  518. className: {
  519. 1: "built_in",
  520. 3: "title.function"
  521. }
  522. },
  523. { // Built-in macro variables
  524. className: 'built_in',
  525. begin: '%' + regex.either(...MACRO_FUNCTIONS)
  526. },
  527. {
  528. // User-defined macro functions
  529. className: 'title.function',
  530. begin: /%[a-zA-Z_][a-zA-Z_0-9]*/
  531. },
  532. {
  533. // TODO: this is most likely an incorrect classification
  534. // built_in may need more nuance
  535. // https://github.com/highlightjs/highlight.js/issues/2521
  536. className: 'meta',
  537. begin: regex.either(...FUNCTIONS) + '(?=\\()'
  538. },
  539. {
  540. className: 'string',
  541. variants: [
  542. hljs.APOS_STRING_MODE,
  543. hljs.QUOTE_STRING_MODE
  544. ]
  545. },
  546. hljs.COMMENT('\\*', ';'),
  547. hljs.C_BLOCK_COMMENT_MODE
  548. ]
  549. };
  550. }
  551. export { sas as default };