perl.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. define(["require", "exports"], function (require, exports) {
  6. 'use strict';
  7. Object.defineProperty(exports, "__esModule", { value: true });
  8. exports.conf = {
  9. comments: {
  10. lineComment: '#',
  11. },
  12. brackets: [['{', '}'], ['[', ']'], ['(', ')']],
  13. autoClosingPairs: [
  14. { open: '{', close: '}' },
  15. { open: '[', close: ']' },
  16. { open: '(', close: ')' },
  17. { open: '"', close: '"' },
  18. { open: "'", close: "'" },
  19. { open: '`', close: '`' },
  20. ],
  21. surroundingPairs: [
  22. { open: '{', close: '}' },
  23. { open: '[', close: ']' },
  24. { open: '(', close: ')' },
  25. { open: '"', close: '"' },
  26. { open: "'", close: "'" },
  27. { open: '`', close: '`' },
  28. ],
  29. };
  30. exports.language = {
  31. defaultToken: '',
  32. tokenPostfix: '.perl',
  33. brackets: [
  34. { token: 'delimiter.bracket', open: '{', close: '}' },
  35. { token: 'delimiter.parenthesis', open: '(', close: ')' },
  36. { token: 'delimiter.square', open: '[', close: ']' },
  37. ],
  38. // https://learn.perl.org/docs/keywords.html
  39. // Perl syntax
  40. keywords: [
  41. '__DATA__',
  42. 'else',
  43. 'lock',
  44. '__END__',
  45. 'elsif',
  46. 'lt',
  47. '__FILE__',
  48. 'eq',
  49. '__LINE__',
  50. 'exp',
  51. 'ne',
  52. 'sub',
  53. '__PACKAGE__',
  54. 'for',
  55. 'no',
  56. 'and',
  57. 'foreach',
  58. 'or',
  59. 'unless',
  60. 'cmp',
  61. 'ge',
  62. 'package',
  63. 'until',
  64. 'continue',
  65. 'gt',
  66. 'while',
  67. 'CORE',
  68. 'if',
  69. 'xor',
  70. 'do',
  71. 'le',
  72. '__DIE__',
  73. '__WARN__',
  74. ],
  75. // Perl functions
  76. builtinFunctions: [
  77. '-A',
  78. 'END',
  79. 'length',
  80. 'setpgrp',
  81. '-B',
  82. 'endgrent',
  83. 'link',
  84. 'setpriority',
  85. '-b',
  86. 'endhostent',
  87. 'listen',
  88. 'setprotoent',
  89. '-C',
  90. 'endnetent',
  91. 'local',
  92. 'setpwent',
  93. '-c',
  94. 'endprotoent',
  95. 'localtime',
  96. 'setservent',
  97. '-d',
  98. 'endpwent',
  99. 'log',
  100. 'setsockopt',
  101. '-e',
  102. 'endservent',
  103. 'lstat',
  104. 'shift',
  105. '-f',
  106. 'eof',
  107. 'map',
  108. 'shmctl',
  109. '-g',
  110. 'eval',
  111. 'mkdir',
  112. 'shmget',
  113. '-k',
  114. 'exec',
  115. 'msgctl',
  116. 'shmread',
  117. '-l',
  118. 'exists',
  119. 'msgget',
  120. 'shmwrite',
  121. '-M',
  122. 'exit',
  123. 'msgrcv',
  124. 'shutdown',
  125. '-O',
  126. 'fcntl',
  127. 'msgsnd',
  128. 'sin',
  129. '-o',
  130. 'fileno',
  131. 'my',
  132. 'sleep',
  133. '-p',
  134. 'flock',
  135. 'next',
  136. 'socket',
  137. '-r',
  138. 'fork',
  139. 'not',
  140. 'socketpair',
  141. '-R',
  142. 'format',
  143. 'oct',
  144. 'sort',
  145. '-S',
  146. 'formline',
  147. 'open',
  148. 'splice',
  149. '-s',
  150. 'getc',
  151. 'opendir',
  152. 'split',
  153. '-T',
  154. 'getgrent',
  155. 'ord',
  156. 'sprintf',
  157. '-t',
  158. 'getgrgid',
  159. 'our',
  160. 'sqrt',
  161. '-u',
  162. 'getgrnam',
  163. 'pack',
  164. 'srand',
  165. '-w',
  166. 'gethostbyaddr',
  167. 'pipe',
  168. 'stat',
  169. '-W',
  170. 'gethostbyname',
  171. 'pop',
  172. 'state',
  173. '-X',
  174. 'gethostent',
  175. 'pos',
  176. 'study',
  177. '-x',
  178. 'getlogin',
  179. 'print',
  180. 'substr',
  181. '-z',
  182. 'getnetbyaddr',
  183. 'printf',
  184. 'symlink',
  185. 'abs',
  186. 'getnetbyname',
  187. 'prototype',
  188. 'syscall',
  189. 'accept',
  190. 'getnetent',
  191. 'push',
  192. 'sysopen',
  193. 'alarm',
  194. 'getpeername',
  195. 'quotemeta',
  196. 'sysread',
  197. 'atan2',
  198. 'getpgrp',
  199. 'rand',
  200. 'sysseek',
  201. 'AUTOLOAD',
  202. 'getppid',
  203. 'read',
  204. 'system',
  205. 'BEGIN',
  206. 'getpriority',
  207. 'readdir',
  208. 'syswrite',
  209. 'bind',
  210. 'getprotobyname',
  211. 'readline',
  212. 'tell',
  213. 'binmode',
  214. 'getprotobynumber',
  215. 'readlink',
  216. 'telldir',
  217. 'bless',
  218. 'getprotoent',
  219. 'readpipe',
  220. 'tie',
  221. 'break',
  222. 'getpwent',
  223. 'recv',
  224. 'tied',
  225. 'caller',
  226. 'getpwnam',
  227. 'redo',
  228. 'time',
  229. 'chdir',
  230. 'getpwuid',
  231. 'ref',
  232. 'times',
  233. 'CHECK',
  234. 'getservbyname',
  235. 'rename',
  236. 'truncate',
  237. 'chmod',
  238. 'getservbyport',
  239. 'require',
  240. 'uc',
  241. 'chomp',
  242. 'getservent',
  243. 'reset',
  244. 'ucfirst',
  245. 'chop',
  246. 'getsockname',
  247. 'return',
  248. 'umask',
  249. 'chown',
  250. 'getsockopt',
  251. 'reverse',
  252. 'undef',
  253. 'chr',
  254. 'glob',
  255. 'rewinddir',
  256. 'UNITCHECK',
  257. 'chroot',
  258. 'gmtime',
  259. 'rindex',
  260. 'unlink',
  261. 'close',
  262. 'goto',
  263. 'rmdir',
  264. 'unpack',
  265. 'closedir',
  266. 'grep',
  267. 'say',
  268. 'unshift',
  269. 'connect',
  270. 'hex',
  271. 'scalar',
  272. 'untie',
  273. 'cos',
  274. 'index',
  275. 'seek',
  276. 'use',
  277. 'crypt',
  278. 'INIT',
  279. 'seekdir',
  280. 'utime',
  281. 'dbmclose',
  282. 'int',
  283. 'select',
  284. 'values',
  285. 'dbmopen',
  286. 'ioctl',
  287. 'semctl',
  288. 'vec',
  289. 'defined',
  290. 'join',
  291. 'semget',
  292. 'wait',
  293. 'delete',
  294. 'keys',
  295. 'semop',
  296. 'waitpid',
  297. 'DESTROY',
  298. 'kill',
  299. 'send',
  300. 'wantarray',
  301. 'die',
  302. 'last',
  303. 'setgrent',
  304. 'warn',
  305. 'dump',
  306. 'lc',
  307. 'sethostent',
  308. 'write',
  309. 'each',
  310. 'lcfirst',
  311. 'setnetent',
  312. ],
  313. // File handlers
  314. builtinFileHandlers: ['ARGV', 'STDERR', 'STDOUT', 'ARGVOUT', 'STDIN', 'ENV'],
  315. // Perl variables
  316. builtinVariables: [
  317. '$!',
  318. '$^RE_TRIE_MAXBUF',
  319. '$LAST_REGEXP_CODE_RESULT',
  320. '$"',
  321. '$^S',
  322. '$LIST_SEPARATOR',
  323. '$#',
  324. '$^T',
  325. '$MATCH',
  326. '$$',
  327. '$^TAINT',
  328. '$MULTILINE_MATCHING',
  329. '$%',
  330. '$^UNICODE',
  331. '$NR',
  332. '$&',
  333. '$^UTF8LOCALE',
  334. '$OFMT',
  335. "$'",
  336. '$^V',
  337. '$OFS',
  338. '$(',
  339. '$^W',
  340. '$ORS',
  341. '$)',
  342. '$^WARNING_BITS',
  343. '$OS_ERROR',
  344. '$*',
  345. '$^WIDE_SYSTEM_CALLS',
  346. '$OSNAME',
  347. '$+',
  348. '$^X',
  349. '$OUTPUT_AUTO_FLUSH',
  350. '$,',
  351. '$_',
  352. '$OUTPUT_FIELD_SEPARATOR',
  353. '$-',
  354. '$`',
  355. '$OUTPUT_RECORD_SEPARATOR',
  356. '$.',
  357. '$a',
  358. '$PERL_VERSION',
  359. '$/',
  360. '$ACCUMULATOR',
  361. '$PERLDB',
  362. '$0',
  363. '$ARG',
  364. '$PID',
  365. '$:',
  366. '$ARGV',
  367. '$POSTMATCH',
  368. '$;',
  369. '$b',
  370. '$PREMATCH',
  371. '$<',
  372. '$BASETIME',
  373. '$PROCESS_ID',
  374. '$=',
  375. '$CHILD_ERROR',
  376. '$PROGRAM_NAME',
  377. '$>',
  378. '$COMPILING',
  379. '$REAL_GROUP_ID',
  380. '$?',
  381. '$DEBUGGING',
  382. '$REAL_USER_ID',
  383. '$@',
  384. '$EFFECTIVE_GROUP_ID',
  385. '$RS',
  386. '$[',
  387. '$EFFECTIVE_USER_ID',
  388. '$SUBSCRIPT_SEPARATOR',
  389. '$\\',
  390. '$EGID',
  391. '$SUBSEP',
  392. '$]',
  393. '$ERRNO',
  394. '$SYSTEM_FD_MAX',
  395. '$^',
  396. '$EUID',
  397. '$UID',
  398. '$^A',
  399. '$EVAL_ERROR',
  400. '$WARNING',
  401. '$^C',
  402. '$EXCEPTIONS_BEING_CAUGHT',
  403. '$|',
  404. '$^CHILD_ERROR_NATIVE',
  405. '$EXECUTABLE_NAME',
  406. '$~',
  407. '$^D',
  408. '$EXTENDED_OS_ERROR',
  409. '%!',
  410. '$^E',
  411. '$FORMAT_FORMFEED',
  412. '%^H',
  413. '$^ENCODING',
  414. '$FORMAT_LINE_BREAK_CHARACTERS',
  415. '%ENV',
  416. '$^F',
  417. '$FORMAT_LINES_LEFT',
  418. '%INC',
  419. '$^H',
  420. '$FORMAT_LINES_PER_PAGE',
  421. '%OVERLOAD',
  422. '$^I',
  423. '$FORMAT_NAME',
  424. '%SIG',
  425. '$^L',
  426. '$FORMAT_PAGE_NUMBER',
  427. '@+',
  428. '$^M',
  429. '$FORMAT_TOP_NAME',
  430. '@-',
  431. '$^N',
  432. '$GID',
  433. '@_',
  434. '$^O',
  435. '$INPLACE_EDIT',
  436. '@ARGV',
  437. '$^OPEN',
  438. '$INPUT_LINE_NUMBER',
  439. '@INC',
  440. '$^P',
  441. '$INPUT_RECORD_SEPARATOR',
  442. '@LAST_MATCH_START',
  443. '$^R',
  444. '$LAST_MATCH_END',
  445. '$^RE_DEBUG_FLAGS',
  446. '$LAST_PAREN_MATCH',
  447. ],
  448. // operators
  449. symbols: /[:+\-\^*$&%@=<>!?|\/~\.]/,
  450. quoteLikeOps: ['qr', 'm', 's', 'q', 'qq', 'qx', 'qw', 'tr', 'y'],
  451. escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
  452. // The main tokenizer for our languages
  453. tokenizer: {
  454. root: [
  455. { include: '@whitespace' },
  456. [
  457. /[a-zA-Z\-_][\w\-_]*/,
  458. {
  459. cases: {
  460. '@keywords': 'keyword',
  461. '@builtinFunctions': 'type.identifier',
  462. '@builtinFileHandlers': 'variable.predefined',
  463. '@quoteLikeOps': { token: '@rematch', next: 'quotedConstructs' },
  464. '@default': '',
  465. },
  466. },
  467. ],
  468. // Perl variables
  469. [
  470. /[\$@%][*@#?\+\-\$!\w\\\^><~:;\.]+/,
  471. {
  472. cases: {
  473. '@builtinVariables': 'variable.predefined',
  474. '@default': 'variable',
  475. },
  476. },
  477. ],
  478. { include: '@strings' },
  479. { include: '@dblStrings' },
  480. // Perl Doc
  481. { include: '@perldoc' },
  482. // Here Doc
  483. { include: '@heredoc' },
  484. [/[{}\[\]()]/, '@brackets'],
  485. // RegExp
  486. [
  487. /[\/](?:(?:\[(?:\\]|[^\]])+\])|(?:\\\/|[^\]\/]))*[\/]\w*\s*(?=[).,;]|$)/,
  488. 'regexp',
  489. ],
  490. [/@symbols/, 'operators'],
  491. { include: '@numbers' },
  492. [/[,;]/, 'delimiter'],
  493. ],
  494. whitespace: [
  495. [/\s+/, 'white'],
  496. [/(^#!.*$)/, 'metatag'],
  497. [/(^#.*$)/, 'comment'],
  498. ],
  499. numbers: [
  500. [/\d*\.\d+([eE][\-+]?\d+)?/, 'number.float'],
  501. [/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/, 'number.hex'],
  502. [/\d+/, 'number'],
  503. ],
  504. // Single quote string
  505. strings: [[/'/, 'string', '@stringBody']],
  506. stringBody: [
  507. [/'/, 'string', '@popall'],
  508. [/\\'/, 'string.escape'],
  509. [/./, 'string'],
  510. ],
  511. // Double quote string
  512. dblStrings: [[/"/, 'string', '@dblStringBody']],
  513. dblStringBody: [
  514. [/"/, 'string', '@popall'],
  515. [/@escapes/, 'string.escape'],
  516. [/\\./, 'string.escape.invalid'],
  517. { include: '@variables' },
  518. [/./, 'string'],
  519. ],
  520. // Quoted constructs
  521. // Percent strings in Ruby are similar to quote-like operators in Perl.
  522. // This is adapted from pstrings in ../ruby/ruby.ts.
  523. quotedConstructs: [
  524. [/(q|qw|tr|y)\s*\(/, { token: 'string.delim', switchTo: '@qstring.(.)' }],
  525. [/(q|qw|tr|y)\s*\[/, { token: 'string.delim', switchTo: '@qstring.[.]' }],
  526. [/(q|qw|tr|y)\s*\{/, { token: 'string.delim', switchTo: '@qstring.{.}' }],
  527. [/(q|qw|tr|y)\s*</, { token: 'string.delim', switchTo: '@qstring.<.>' }],
  528. [/(q|qw|tr|y)#/, { token: 'string.delim', switchTo: '@qstring.#.#' }],
  529. [/(q|qw|tr|y)\s*([^A-Za-z0-9#\s])/, { token: 'string.delim', switchTo: '@qstring.$2.$2' }],
  530. [/(q|qw|tr|y)\s+(\w)/, { token: 'string.delim', switchTo: '@qstring.$2.$2' }],
  531. [/(qr|m|s)\s*\(/, { token: 'regexp.delim', switchTo: '@qregexp.(.)' }],
  532. [/(qr|m|s)\s*\[/, { token: 'regexp.delim', switchTo: '@qregexp.[.]' }],
  533. [/(qr|m|s)\s*\{/, { token: 'regexp.delim', switchTo: '@qregexp.{.}' }],
  534. [/(qr|m|s)\s*</, { token: 'regexp.delim', switchTo: '@qregexp.<.>' }],
  535. [/(qr|m|s)#/, { token: 'regexp.delim', switchTo: '@qregexp.#.#' }],
  536. [/(qr|m|s)\s*([^A-Za-z0-9_#\s])/, { token: 'regexp.delim', switchTo: '@qregexp.$2.$2' }],
  537. [/(qr|m|s)\s+(\w)/, { token: 'regexp.delim', switchTo: '@qregexp.$2.$2' }],
  538. [/(qq|qx)\s*\(/, { token: 'string.delim', switchTo: '@qqstring.(.)' }],
  539. [/(qq|qx)\s*\[/, { token: 'string.delim', switchTo: '@qqstring.[.]' }],
  540. [/(qq|qx)\s*\{/, { token: 'string.delim', switchTo: '@qqstring.{.}' }],
  541. [/(qq|qx)\s*</, { token: 'string.delim', switchTo: '@qqstring.<.>' }],
  542. [/(qq|qx)#/, { token: 'string.delim', switchTo: '@qqstring.#.#' }],
  543. [/(qq|qx)\s*([^A-Za-z0-9#\s])/, { token: 'string.delim', switchTo: '@qqstring.$2.$2' }],
  544. [/(qq|qx)\s+(\w)/, { token: 'string.delim', switchTo: '@qqstring.$2.$2' }],
  545. ],
  546. // Non-expanded quoted string
  547. // qstring<open>.<close>
  548. // open = open delimiter
  549. // close = close delimiter
  550. qstring: [
  551. [/\\./, 'string.escape'],
  552. [/./, {
  553. cases: {
  554. '$#==$S3': { token: 'string.delim', next: '@pop' },
  555. '$#==$S2': { token: 'string.delim', next: '@push' },
  556. '@default': 'string'
  557. }
  558. }],
  559. ],
  560. // Quoted regexp
  561. // qregexp.<open>.<close>
  562. // open = open delimiter
  563. // close = close delimiter
  564. qregexp: [
  565. { include: '@variables' },
  566. [/\\./, 'regexp.escape'],
  567. [/./, {
  568. cases: {
  569. '$#==$S3': { token: 'regexp.delim', next: '@regexpModifiers' },
  570. '$#==$S2': { token: 'regexp.delim', next: '@push' },
  571. '@default': 'regexp'
  572. }
  573. }],
  574. ],
  575. regexpModifiers: [
  576. [/[msixpodualngcer]+/, { token: 'regexp.modifier', next: '@popall' }],
  577. ],
  578. // Expanded quoted string
  579. // qqstring.<open>.<close>
  580. // open = open delimiter
  581. // close = close delimiter
  582. qqstring: [
  583. { include: '@variables' },
  584. { include: '@qstring' },
  585. ],
  586. heredoc: [
  587. [
  588. /<<\s*['"`]?([\w\-]+)['"`]?/,
  589. { token: 'string.heredoc.delimiter', next: '@heredocBody.$1' },
  590. ],
  591. ],
  592. heredocBody: [
  593. [
  594. /^([\w\-]+)$/,
  595. {
  596. cases: {
  597. '$1==$S2': [{ token: 'string.heredoc.delimiter', next: '@popall' }],
  598. '@default': 'string.heredoc',
  599. },
  600. },
  601. ],
  602. [/./, 'string.heredoc'],
  603. ],
  604. perldoc: [[/^=\w/, 'comment.doc', '@perldocBody']],
  605. perldocBody: [
  606. [/^=cut\b/, 'type.identifier', '@popall'],
  607. [/./, 'comment.doc'],
  608. ],
  609. variables: [
  610. [/\$\w+/, 'variable'],
  611. [/@\w+/, 'variable'],
  612. [/%\w+/, 'variable'],
  613. ],
  614. },
  615. };
  616. });