1 | /* eslint-disable regexp/no-dupe-characters-character-class */
|
---|
2 | (function (Prism) {
|
---|
3 |
|
---|
4 | /**
|
---|
5 | * Regular expression for characters that are not allowed in identifiers.
|
---|
6 | *
|
---|
7 | * @type {string}
|
---|
8 | */
|
---|
9 | var nonId = /\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;
|
---|
10 |
|
---|
11 | /**
|
---|
12 | * Surround a regular expression for IDs with patterns for non-ID sequences.
|
---|
13 | *
|
---|
14 | * @param {string} pattern A regular expression for identifiers.
|
---|
15 | * @param {string} [flags] The regular expression flags.
|
---|
16 | * @returns {RegExp} A wrapped regular expression for identifiers.
|
---|
17 | */
|
---|
18 | function wrapId(pattern, flags) {
|
---|
19 | return RegExp(pattern.replace(/<nonId>/g, nonId), flags);
|
---|
20 | }
|
---|
21 |
|
---|
22 | Prism.languages.kumir = {
|
---|
23 | 'comment': {
|
---|
24 | pattern: /\|.*/
|
---|
25 | },
|
---|
26 |
|
---|
27 | 'prolog': {
|
---|
28 | pattern: /#.*/,
|
---|
29 | greedy: true
|
---|
30 | },
|
---|
31 |
|
---|
32 | 'string': {
|
---|
33 | pattern: /"[^\n\r"]*"|'[^\n\r']*'/,
|
---|
34 | greedy: true
|
---|
35 | },
|
---|
36 |
|
---|
37 | 'boolean': {
|
---|
38 | pattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source),
|
---|
39 | lookbehind: true
|
---|
40 | },
|
---|
41 |
|
---|
42 | 'operator-word': {
|
---|
43 | pattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source),
|
---|
44 | lookbehind: true,
|
---|
45 | alias: 'keyword'
|
---|
46 | },
|
---|
47 |
|
---|
48 | 'system-variable': {
|
---|
49 | pattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source),
|
---|
50 | lookbehind: true,
|
---|
51 | alias: 'keyword'
|
---|
52 | },
|
---|
53 |
|
---|
54 | 'type': [
|
---|
55 | {
|
---|
56 | pattern: wrapId(/(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[<nonId>]|$)/.source),
|
---|
57 | lookbehind: true,
|
---|
58 | alias: 'builtin'
|
---|
59 | },
|
---|
60 | {
|
---|
61 | pattern: wrapId(/(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.source),
|
---|
62 | lookbehind: true,
|
---|
63 | alias: 'important'
|
---|
64 | }
|
---|
65 | ],
|
---|
66 |
|
---|
67 | /**
|
---|
68 | * Should be performed after searching for type names because of "таб".
|
---|
69 | * "таб" is a reserved word, but never used without a preceding type name.
|
---|
70 | * "НАЗНАЧИТЬ", "Фввод", and "Фвывод" are not reserved words.
|
---|
71 | */
|
---|
72 | 'keyword': {
|
---|
73 | pattern: wrapId(/(^|[<nonId>])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/.source),
|
---|
74 | lookbehind: true
|
---|
75 | },
|
---|
76 |
|
---|
77 | /** Should be performed after searching for reserved words. */
|
---|
78 | 'name': {
|
---|
79 | // eslint-disable-next-line regexp/no-super-linear-backtracking
|
---|
80 | pattern: wrapId(/(^|[<nonId>])[^\d<nonId>][^<nonId>]*(?:\x20+[^<nonId>]+)*(?=[<nonId>]|$)/.source),
|
---|
81 | lookbehind: true
|
---|
82 | },
|
---|
83 |
|
---|
84 | /** Should be performed after searching for names. */
|
---|
85 | 'number': {
|
---|
86 | pattern: wrapId(/(^|[<nonId>])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[<nonId>]|$)/.source, 'i'),
|
---|
87 | lookbehind: true
|
---|
88 | },
|
---|
89 |
|
---|
90 | /** Should be performed after searching for words. */
|
---|
91 | 'punctuation': /:=|[(),:;\[\]]/,
|
---|
92 |
|
---|
93 | /**
|
---|
94 | * Should be performed after searching for
|
---|
95 | * - numeric constants (because of "+" and "-");
|
---|
96 | * - punctuation marks (because of ":=" and "=").
|
---|
97 | */
|
---|
98 | 'operator-char': {
|
---|
99 | pattern: /\*\*?|<[=>]?|>=?|[-+/=]/,
|
---|
100 | alias: 'operator'
|
---|
101 | }
|
---|
102 | };
|
---|
103 |
|
---|
104 | Prism.languages.kum = Prism.languages.kumir;
|
---|
105 |
|
---|
106 | }(Prism));
|
---|