summaryrefslogtreecommitdiffstats
path: root/public/prism/prism-bison.js
blob: 2d150f18c701d6cbe0fd582ebd0aeb28239a540a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Prism.languages.bison = Prism.languages.extend('c', {});

Prism.languages.insertBefore('bison', 'comment', {
  bison: {
    // This should match all the beginning of the file
    // including the prologue(s), the bison declarations and
    // the grammar rules.
    pattern: /^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,
    inside: {
      c: {
        // Allow for one level of nested braces
        pattern: /%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,
        inside: {
          delimiter: {
            pattern: /^%?\{|%?\}$/,
            alias: 'punctuation',
          },
          'bison-variable': {
            pattern: /[$@](?:<[^\s>]+>)?[\w$]+/,
            alias: 'variable',
            inside: {
              punctuation: /<|>/,
            },
          },
          rest: Prism.languages.c,
        },
      },
      comment: Prism.languages.c.comment,
      string: Prism.languages.c.string,
      property: /\S+(?=:)/,
      keyword: /%\w+/,
      number: {
        pattern: /(^|[^@])\b(?:0x[\da-f]+|\d+)/i,
        lookbehind: true,
      },
      punctuation: /%[%?]|[|:;\[\]<>]/,
    },
  },
});
/span>pattern: RegExp(/(^|[^\\])/.source + multilineComment), lookbehind: true, greedy: true, }, { pattern: /(^|[^\\:])\/\/.*/, lookbehind: true, greedy: true, }, ], string: { pattern: /b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/, greedy: true, }, char: { pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/, greedy: true, }, attribute: { pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/, greedy: true, alias: 'attr-name', inside: { string: null, // see below }, }, // Closure params should not be confused with bitwise OR | 'closure-params': { pattern: /([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/, lookbehind: true, greedy: true, inside: { 'closure-punctuation': { pattern: /^\||\|$/, alias: 'punctuation', }, rest: null, // see below }, }, 'lifetime-annotation': { pattern: /'\w+/, alias: 'symbol', }, 'fragment-specifier': { pattern: /(\$\w+:)[a-z]+/, lookbehind: true, alias: 'punctuation', }, variable: /\$\w+/, 'function-definition': { pattern: /(\bfn\s+)\w+/, lookbehind: true, alias: 'function', }, 'type-definition': { pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/, lookbehind: true, alias: 'class-name', }, 'module-declaration': [ { pattern: /(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/, lookbehind: true, alias: 'namespace', }, { pattern: /(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/, lookbehind: true, alias: 'namespace', inside: { punctuation: /::/, }, }, ], keyword: [ // https://github.com/rust-lang/reference/blob/master/src/keywords.md /\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/, // primitives and str // https://doc.rust-lang.org/stable/rust-by-example/primitives.html /\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/, ], // functions can technically start with an upper-case letter, but this will introduce a lot of false positives // and Rust's naming conventions recommend snake_case anyway. // https://doc.rust-lang.org/1.0.0/style/style/naming/README.html function: /\b[a-z_]\w*(?=\s*(?:::\s*<|\())/, macro: { pattern: /\b\w+!/, alias: 'property', }, constant: /\b[A-Z_][A-Z_\d]+\b/, 'class-name': /\b[A-Z]\w*\b/, namespace: { pattern: /(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/, inside: { punctuation: /::/, }, }, // Hex, oct, bin, dec numbers with visual separators and type suffix number: /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/, boolean: /\b(?:false|true)\b/, punctuation: /->|\.\.=|\.{1,3}|::|[{}[\];(),:]/, operator: /[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/, }; Prism.languages.rust['closure-params'].inside.rest = Prism.languages.rust; Prism.languages.rust['attribute'].inside['string'] = Prism.languages.rust['string']; })(Prism);