perl.ts 12 KB

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