QSP.tmLanguage.json 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. {
  2. "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
  3. "name": "QSP",
  4. "patterns": [
  5. {
  6. "include": "#preprocessor"
  7. },
  8. {
  9. "include": "#qsp-general-structures"
  10. }
  11. ],
  12. "repository": {
  13. "preprocessor": {
  14. "comment": "preprocessor text",
  15. "patterns": [
  16. {
  17. "name": "meta.preprocessor.start.qsp",
  18. "match": "^\\s*(#)\\s?.+$"
  19. },
  20. {
  21. "name": "meta.preprocessor.end.qsp",
  22. "match": "^-{1,2}\\S.*?\\S-{1,2}$"
  23. }
  24. ]
  25. },
  26. "comments": {
  27. "comment": "singe and multiline comments starting with !",
  28. "patterns": [
  29. {
  30. "comment": "comments without possible multiline chars",
  31. "match": "(?:^|\\s?[&])\\s*((!!?)[^{'\"]*?$\\n?)",
  32. "captures": {
  33. "1": {
  34. "name": "comment.line.qsp"
  35. },
  36. "2": {
  37. "name": "punctuation.definition.comment.qsp"
  38. }
  39. }
  40. },
  41. {
  42. "comment": "comments with multiline chars",
  43. "begin": "(?:^|\\s?[&])\\s*(!!?)",
  44. "beginCaptures": {
  45. "0": {
  46. "name": "comment.block.qsp"
  47. },
  48. "1": {
  49. "name": "punctuation.definition.comment.qsp"
  50. }
  51. },
  52. "patterns": [
  53. {
  54. "name": "comment.block.qsp",
  55. "match": "\\G",
  56. "include": "#comment-block"
  57. }
  58. ]
  59. }
  60. ]
  61. },
  62. "comment-block": {
  63. "patterns": [
  64. {
  65. "match": "(\\s*[^{'\"]*)(?=$)",
  66. "captures": {
  67. "1": {
  68. "name": "comment.block.text.qsp"
  69. }
  70. }
  71. },
  72. {
  73. "include": "#comment-block-quote"
  74. },
  75. {
  76. "include": "#comment-block-bracket-curly"
  77. },
  78. {
  79. "match": "(\\s*[^{'\"]*)(?!$)",
  80. "captures": {
  81. "1": {
  82. "name": "comment.block.text.qsp"
  83. }
  84. }
  85. },
  86. {
  87. "comment": "continue parsing after the comment ends",
  88. "begin": "($\\n?)",
  89. "pattern": {
  90. "match": "\\G",
  91. "include": "#qsp-general-structures"
  92. }
  93. }
  94. ]
  95. },
  96. "comment-block-quote": {
  97. "name": "comment.block.quote.qsp",
  98. "begin": "('|\")",
  99. "end": "(\\1)"
  100. },
  101. "comment-block-bracket-curly": {
  102. "name": "comment.block.bracket.curly.qsp",
  103. "begin": "[{]",
  104. "patterns": [
  105. {
  106. "include": "#comment-block-bracket-curly"
  107. },
  108. {
  109. "include": "#comment-block-quote"
  110. }
  111. ],
  112. "end": "([}])"
  113. },
  114. "qsp-general-structures": {
  115. "comment": "the general structures for this language",
  116. "patterns": [
  117. {
  118. "include": "#comments"
  119. },
  120. {
  121. "include": "#qsp-control-structures"
  122. },
  123. {
  124. "include": "#if-branches"
  125. },
  126. {
  127. "include": "#qsp-expression"
  128. },
  129. {
  130. "include": "#preprocessor"
  131. },
  132. {
  133. "include": "#single-words"
  134. }
  135. ]
  136. },
  137. "qsp-control-structures": {
  138. "comment": "some specialized structures",
  139. "patterns": [
  140. {
  141. "include": "#qsp-code-block"
  142. },
  143. {
  144. "include": "#loops"
  145. }
  146. ]
  147. },
  148. "qsp-code-block": {
  149. "comment": "code blocks for this language, only possible for 'act' or 'if'",
  150. "name": "meta.structure.codeblock.qsp",
  151. "patterns": [
  152. {
  153. "include": "#qsp-code-block-if"
  154. },
  155. {
  156. "include": "#qsp-code-block-act"
  157. }
  158. ]
  159. },
  160. "qsp-code-block-if": {
  161. "name": "meta.structure.codeblock.if.qsp",
  162. "begin": "^\\s*(?i:(if))\\b(.*\\S.*)(:)\\s*$\\n?",
  163. "beginCaptures": {
  164. "1": {
  165. "patterns": [
  166. {
  167. "include": "#keywords-if"
  168. }
  169. ]
  170. },
  171. "2": {
  172. "patterns": [
  173. {
  174. "include": "#if-condition"
  175. }
  176. ]
  177. },
  178. "3": {
  179. "name": "punctuation.separator.if.qsp"
  180. }
  181. },
  182. "patterns": [
  183. {
  184. "comment": "recursivly parse the body",
  185. "include": "#qsp-codeblock-body"
  186. }
  187. ],
  188. "end": "^\\s*(?i:(end))\\b",
  189. "endCaptures": {
  190. "1": {
  191. "patterns": [
  192. {
  193. "include": "#keywords-if"
  194. }
  195. ]
  196. }
  197. }
  198. },
  199. "qsp-code-block-act": {
  200. "name": "meta.structure.codeblock.act.qsp",
  201. "begin": "^\\s*(?i:(act))\\b(.*\\S.*)(:)\\s*$\\n?",
  202. "beginCaptures": {
  203. "1": {
  204. "patterns": [
  205. {
  206. "include": "#keywords-act"
  207. }
  208. ]
  209. },
  210. "2": {
  211. "patterns": [
  212. {
  213. "include": "#qsp-general-structures"
  214. }
  215. ]
  216. },
  217. "3": {
  218. "name": "punctuation.separator.act.qsp"
  219. }
  220. },
  221. "patterns": [
  222. {
  223. "comment": "recursivly parse the body",
  224. "include": "#qsp-codeblock-body"
  225. }
  226. ],
  227. "end": "^\\s*(?i:(end))\\b",
  228. "endCaptures": {
  229. "1": {
  230. "patterns": [
  231. {
  232. "include": "#keywords-act"
  233. }
  234. ]
  235. }
  236. }
  237. },
  238. "qsp-codeblock-body": {
  239. "patterns": [
  240. {
  241. "comment": "this body can contain everything again",
  242. "include": "#qsp-general-structures"
  243. }
  244. ]
  245. },
  246. "qsp-expression": {
  247. "comment": "basically 'act' or 'if' expressions",
  248. "name": "meta.structure.expression.qsp",
  249. "patterns": [
  250. {
  251. "include": "#pairs"
  252. },
  253. {
  254. "include": "#qsp-expression-if"
  255. },
  256. {
  257. "include": "#qsp-expression-act"
  258. },
  259. {
  260. "include": "#single-words"
  261. }
  262. ]
  263. },
  264. "qsp-expression-if": {
  265. "patterns": [
  266. {
  267. "begin": "\\s*\\b(?i:(if))\\b",
  268. "beginCaptures": {
  269. "1": {
  270. "patterns": [
  271. {
  272. "include": "#keywords-if"
  273. }
  274. ]
  275. }
  276. },
  277. "end": "([:])",
  278. "endCaptures": {
  279. "1": {
  280. "name": "punctuation.separator.if.qsp"
  281. }
  282. },
  283. "patterns": [
  284. {
  285. "include": "#qsp-expression"
  286. }
  287. ]
  288. },
  289. {
  290. "begin": "\\s*\\b(?i:(elseif))\\b",
  291. "beginCaptures": {
  292. "1": {
  293. "patterns": [
  294. {
  295. "include": "#keywords-if"
  296. }
  297. ]
  298. }
  299. },
  300. "end": "(?=([:]))",
  301. "endCaptures": {
  302. "1": {
  303. "name": "punctuation.separator.if.qsp"
  304. }
  305. },
  306. "patterns": [
  307. {
  308. "include": "#qsp-expression"
  309. }
  310. ]
  311. },
  312. {
  313. "match": "\\s*\\b(?i:(else))\\b",
  314. "captures": {
  315. "1": {
  316. "patterns": [
  317. {
  318. "include": "#keywords-if"
  319. }
  320. ]
  321. }
  322. }
  323. }
  324. ]
  325. },
  326. "qsp-expression-act": {
  327. "comment": "parse single line act",
  328. "begin": "\\s*\\b(?i:(act))\\b",
  329. "beginCaptures": {
  330. "1": {
  331. "patterns": [
  332. {
  333. "include": "#keywords-act"
  334. }
  335. ]
  336. }
  337. },
  338. "end": "([:])",
  339. "endCaptures": {
  340. "1": {
  341. "name": "punctuation.separator.act.qsp"
  342. }
  343. },
  344. "patterns": [
  345. {
  346. "include": "#qsp-expression"
  347. }
  348. ]
  349. },
  350. "loops": {
  351. "comment": "loop parsing",
  352. "name": "meta.structure.line.loop.qsp",
  353. "patterns": [
  354. {
  355. "match": "^\\s*(:)\\s?(.+?)\\s*$\\n?",
  356. "captures": {
  357. "1": {
  358. "name": "punctuation.separator.loop.qsp"
  359. },
  360. "2": {
  361. "name": "keyword.other.user.loop.qsp"
  362. }
  363. }
  364. },
  365. {
  366. "match": "\\b(?i:(jump))\\s?(['][a-zA-Z_][a-zA-Z0-9_]*?['])",
  367. "captures": {
  368. "1": {
  369. "patterns": [
  370. {"include": "#keywords-loop"}
  371. ]
  372. },
  373. "2": {
  374. "name": "keyword.other.user.loop.end.qsp"
  375. }
  376. }
  377. }
  378. ]
  379. },
  380. "pairs":{
  381. "patterns": [
  382. {"include": "#strings"},
  383. {
  384. "begin": "(\\[)",
  385. "beginCaptures": {
  386. "1":{"name":"punctuation.brackets.square.open.qsp"}
  387. },
  388. "end": "(\\])",
  389. "endCaptures": {
  390. "1":{"name":"punctuation.brackets.square.close.qsp"}
  391. },
  392. "patterns": [
  393. {"include": "#qsp-general-structures"}
  394. ]
  395. },
  396. {
  397. "begin": "([{])",
  398. "beginCaptures": {
  399. "1":{"name":"punctuation.brackets.curly.open.qsp"}
  400. },
  401. "end": "([}])",
  402. "endCaptures": {
  403. "1":{"name":"punctuation.brackets.curly.close.qsp"}
  404. },
  405. "patterns": [
  406. {"include": "#qsp-general-structures"}
  407. ]
  408. },
  409. {
  410. "begin": "([(])",
  411. "beginCaptures": {
  412. "1":{"name":"punctuation.brackets.round.open.qsp"}
  413. },
  414. "end": "([)])",
  415. "endCaptures": {
  416. "1":{"name":"punctuation.brackets.round.close.qsp"}
  417. },
  418. "patterns": [
  419. {"include": "#qsp-general-structures"}
  420. ]
  421. }
  422. ]
  423. },
  424. "strings": {
  425. "comment": "parse string and their inlines",
  426. "patterns": [
  427. {
  428. "begin": "(\")",
  429. "beginCaptures": {
  430. "0":{"name":"string.quoted.double.qsp"},
  431. "1":{"name":"punctuation.definition.string.begin.qsp"}
  432. },
  433. "end": "(\")",
  434. "endCaptures": {
  435. "0":{"name":"string.quoted.double.qsp"},
  436. "1":{"name":"punctuation.definition.string.end.qsp"}
  437. },
  438. "patterns": [
  439. {
  440. "include": "#stringInterpolated"
  441. },
  442. {
  443. "match": ".",
  444. "name": "string.quoted.double.qsp"
  445. }
  446. ]
  447. },
  448. {
  449. "begin": "(')",
  450. "beginCaptures": {
  451. "0":{"name":"string.quoted.single.qsp"},
  452. "1":{"name":"punctuation.definition.string.begin.qsp"}
  453. },
  454. "end": "(')",
  455. "endCaptures": {
  456. "0":{"name":"string.quoted.single.qsp"},
  457. "1":{"name":"punctuation.definition.string.end.qsp"}
  458. },
  459. "patterns": [
  460. {
  461. "include": "#stringInterpolated"
  462. },
  463. {
  464. "comment": "//TODO: html parsing, default doesn't work due to inline code: 'include': 'text.html.basic'"
  465. },
  466. {
  467. "match": ".",
  468. "name": "string.quoted.single.qsp"
  469. }
  470. ]
  471. }
  472. ]
  473. },
  474. "stringInterpolated": {
  475. "name":"meta.interpolation.qsp",
  476. "begin": "(<<)",
  477. "beginCaptures": {
  478. "1":{
  479. "name":"punctuation.definition.stringinterpolation.qsp"
  480. }
  481. },
  482. "end": "(>>)",
  483. "endCaptures": {
  484. "1":{
  485. "name":"punctuation.definition.stringinterpolation.qsp"
  486. }
  487. },
  488. "patterns": [
  489. {
  490. "include": "#qsp-general-structures"
  491. }
  492. ]
  493. },
  494. "if-branches": {
  495. "comment": "'elseif' or 'else' whithin a 'if'-block",
  496. "patterns": [
  497. {
  498. "include": "#elseif-branch"
  499. },
  500. {
  501. "include": "#else-branch"
  502. }
  503. ]
  504. },
  505. "elseif-branch": {
  506. "comment": "elseif statement within if block",
  507. "match": "^\\s*(?i:(elseif))\\b\\s*(.?\\S.*?)(:)\\s*$\\n?",
  508. "captures": {
  509. "0": {
  510. "name": "meta.structure.qsp.codeblock.if.elseif.qsp"
  511. },
  512. "1": {
  513. "patterns": [
  514. {
  515. "include": "#keywords-if"
  516. }
  517. ]
  518. },
  519. "2": {
  520. "patterns": [
  521. {
  522. "include": "#if-condition"
  523. }
  524. ]
  525. },
  526. "3": {
  527. "name": "punctuation.condition.if.qsp"
  528. }
  529. }
  530. },
  531. "else-branch": {
  532. "comment": "else statement within if block",
  533. "match": "^\\s*(?i:(else))\\s*$\\n?",
  534. "captures": {
  535. "0": {
  536. "name": "meta.structure.qsp.codeblock.if.else.qsp"
  537. },
  538. "1": {
  539. "patterns": [
  540. {
  541. "include": "#keywords-if"
  542. }
  543. ]
  544. }
  545. }
  546. },
  547. "if-condition": {
  548. "patterns": [
  549. {
  550. "include": "#condition-pairs"
  551. },
  552. {
  553. "include": "#compare"
  554. },
  555. {
  556. "include": "#single-words"
  557. }
  558. ]
  559. },
  560. "condition-pairs":{
  561. "patterns": [
  562. {"include": "#strings"},
  563. {
  564. "begin": "(\\[)",
  565. "beginCaptures": {
  566. "1":{"name":"punctuation.brackets.square.open.qsp"}
  567. },
  568. "end": "(\\])",
  569. "endCaptures": {
  570. "1":{"name":"punctuation.brackets.square.close.qsp"}
  571. },
  572. "patterns": [
  573. {"include": "#if-condition"}
  574. ]
  575. },
  576. {
  577. "begin": "([(])",
  578. "beginCaptures": {
  579. "1":{"name":"punctuation.brackets.round.open.qsp"}
  580. },
  581. "end": "([)])",
  582. "endCaptures": {
  583. "1":{"name":"punctuation.brackets.round.close.qsp"}
  584. },
  585. "patterns": [
  586. {"include": "#if-condition"}
  587. ]
  588. },
  589. {
  590. "begin": "([{])",
  591. "beginCaptures": {
  592. "1":{"name":"punctuation.brackets.curly.open.qsp"}
  593. },
  594. "end": "([}])",
  595. "endCaptures": {
  596. "1":{"name":"punctuation.brackets.curly.close.qsp"}
  597. },
  598. "patterns": [
  599. {"include": "#qsp-general-structures"}
  600. ]
  601. }
  602. ]
  603. },
  604. "compare": {
  605. "patterns": [
  606. {
  607. "comment": "QSP accepts this, but it complicates text search and is bad practice",
  608. "name": "invalid.keyword.operator.compare.qsp",
  609. "match": "(=(<|>))"
  610. },
  611. {
  612. "name": "keyword.operator.compare.qsp",
  613. "match": "((<|>)?=|!|<>|<|>)"
  614. }
  615. ]
  616. },
  617. "single-words": {
  618. "comment": "patterns for single words",
  619. "patterns": [
  620. {
  621. "include": "#keywords"
  622. },
  623. {
  624. "include": "#entities"
  625. },
  626. {
  627. "include": "#qsp-variables"
  628. },
  629. {
  630. "include": "#constants"
  631. },
  632. {
  633. "include": "#errors"
  634. },
  635. {
  636. "include": "#keywords-if"
  637. },
  638. {
  639. "include": "#keywords-act"
  640. },
  641. {
  642. "include": "#user-variables"
  643. }
  644. ]
  645. },
  646. "keywords": {
  647. "patterns": [
  648. {
  649. "name": "keyword.operator.other.qsp",
  650. "match": "\\b(?i:(mod))\\b"
  651. },
  652. {
  653. "name": "keyword.operator.symbolic.qsp",
  654. "match": "[\\&*/+-]\\s*\\b"
  655. },
  656. {
  657. "name": "keyword.operator.assign.qsp",
  658. "match": "([*/+-]?[=])"
  659. },
  660. {
  661. "name": "keyword.control.exit.qsp",
  662. "match": "\\b(?i:(exit))\\b"
  663. }
  664. ]
  665. },
  666. "keywords-if": {
  667. "patterns": [
  668. {
  669. "name": "keyword.control.if.qsp",
  670. "match": "\\b(?i:(if))\\b"
  671. },
  672. {
  673. "name": "keyword.control.elseif.qsp",
  674. "match": "\\b(?i:(elseif))\\b"
  675. },
  676. {
  677. "name": "keyword.control.else.qsp",
  678. "match": "\\b(?i:(else))\\b"
  679. },
  680. {
  681. "name": "keyword.control.if.end.qsp",
  682. "match": "\\b(?i:(end))\\b"
  683. }
  684. ]
  685. },
  686. "keywords-act": {
  687. "patterns": [
  688. {
  689. "name": "keyword.control.act.qsp",
  690. "match": "\\b(?i:(act))\\b"
  691. },
  692. {
  693. "name": "keyword.control.act.end.qsp",
  694. "match": "\\b(?i:(end))\\b"
  695. }
  696. ]
  697. },
  698. "keywords-loop": {
  699. "patterns": [
  700. {
  701. "name": "keyword.control.loop.qsp",
  702. "match": "\\b(?i:(jump))\\b"
  703. }
  704. ]
  705. },
  706. "entities": {
  707. "patterns": [
  708. {
  709. "name": "entity.name.function.display.qsp",
  710. "match": "((\\s?[*]|^[*]|\\b)(?i:(cl(r|s|a)|clear|(n|p)l|p))|\\b(?i:(view|msg|menu|cmdcl(ea)?r)|showacts|showinput|showobjs|showstat))\\b"
  711. },
  712. {
  713. "name": "entity.name.function.include.qsp",
  714. "match": "\\b(?i:(xgt|xgoto|gt|goto|gs|gosub))\\b"
  715. },
  716. {
  717. "name": "entity.name.function.language.str.qsp",
  718. "match": "((\\b|\\s?[$])(?i:(mid|(u|l)case|trim|replace|str|strfind))|\\b(?i:(val|instr|isnum|len|strpos|strcomp)))\\b"
  719. },
  720. {
  721. "name": "entity.name.function.language.array.qsp",
  722. "match": "\\b(?i:(arrsize|arrpos|arrcomp|copyarr))\\b"
  723. },
  724. {
  725. "name": "entity.name.function.language.math.qsp",
  726. "match": "((\\b|\\s?[$])(?i:(max|min))|\\b(?i:(r(a)?nd)))\\b"
  727. },
  728. {
  729. "name": "entity.name.function.language.main.qsp",
  730. "match": "((\\b|\\s?[$])(?i:(func|dyneval|input|iif|qspver))|\\b(?i:(settimer|loc|dynamic|close(\\sall)?|play|(s|l)et)))\\b"
  731. },
  732. {
  733. "name": "entity.name.function.language.object.qsp",
  734. "match": "\\b(?i:(countobj|delobj|addobj|unsel(ect)?|killobj))\\b"
  735. },
  736. {
  737. "name": "entity.name.function.language.game.qsp",
  738. "match": "\\b(?i:(opengame|openqst|addqst|killqst|savegame|refint))\\b"
  739. },
  740. {
  741. "name": "entity.name.function.language.other.qsp",
  742. "match": "\\b(?i:(rgb|isplay|msecscount|killvar))\\b"
  743. }
  744. ]
  745. },
  746. "qsp-variables": {
  747. "patterns": [
  748. {
  749. "name": "variable.language.object.qsp",
  750. "match": "(\\b|\\s?[$])(?i:(desc|user_text|usrtxt|maintxt|stattxt|curloc|selobj|getobj|delact|selact|curact|result))\\b"
  751. },
  752. {
  753. "name": "variable.language.args.qsp",
  754. "match": "(\\b|\\s?[$])(?i:(args))\\b"
  755. },
  756. {
  757. "name": "variable.language.int.qsp",
  758. "match": "\\b(?i:(disablescroll|disablesubex|nosave|debug|usehtml|(b|f|l)color|fsize))\\b"
  759. },
  760. {
  761. "name": "variable.language.str.qsp",
  762. "match": "\\s?[$](?i:(counter|ongload|ongsave|onnewloc|onactsel|onobjsel|onobjadd|onobjdel|usercom|fname|backimage))\\b"
  763. }
  764. ]
  765. },
  766. "constants": {
  767. "patterns": [
  768. {
  769. "name": "constant.numeric.qsp",
  770. "match": "\\b\\d+\\b"
  771. },
  772. {
  773. "name": "constant.language.qsp",
  774. "match": "\\b(?i:(no|and|or))\\b"
  775. }
  776. ]
  777. },
  778. "errors": {
  779. "name": "invalid.keyword.control.qsp",
  780. "patterns": [
  781. {
  782. "name": "invalid.keyword.control.end.qsp",
  783. "match": "(^|\\b)(?i:(end))\\b"
  784. },
  785. {
  786. "name": "invalid.keyword.control.condition.qsp",
  787. "match": "\\b(?i:(if|elseif|else))\\b"
  788. },
  789. {
  790. "name": "invalid.keyword.control.act.qsp",
  791. "match": "\\b(?i:(act))\\b"
  792. }
  793. ]
  794. },
  795. "user-variables": {
  796. "name": "variable.other.user.qsp",
  797. "match": "(\\B[$])?\\b([a-zA-Z_\\x{7f}-\\x{ff}][a-zA-Z0-9_\\x{7f}-\\x{ff}]*?)\\b"
  798. }
  799. },
  800. "scopeName": "source.qsp"
  801. }