perl.js 18 KB

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