perl.js 16 KB

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