1"""
2 pygments.lexers.bare
3 ~~~~~~~~~~~~~~~~~~~~
4
5 Lexer for the BARE schema.
6
7 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
8 :license: BSD, see LICENSE for details.
9"""
10
11from pygments.lexer import RegexLexer, words, bygroups
12from pygments.token import Text, Comment, Keyword, Name, Literal, Whitespace
13
14__all__ = ['BareLexer']
15
16
17class BareLexer(RegexLexer):
18 """
19 For BARE schema source.
20 """
21 name = 'BARE'
22 url = 'https://baremessages.org'
23 filenames = ['*.bare']
24 aliases = ['bare']
25 version_added = '2.7'
26
27 keywords = [
28 'type',
29 'enum',
30 'u8',
31 'u16',
32 'u32',
33 'u64',
34 'uint',
35 'i8',
36 'i16',
37 'i32',
38 'i64',
39 'int',
40 'f32',
41 'f64',
42 'bool',
43 'void',
44 'data',
45 'string',
46 'optional',
47 'map',
48 ]
49
50 tokens = {
51 'root': [
52 (r'(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)(\{)',
53 bygroups(Keyword, Whitespace, Name.Class, Whitespace, Text), 'struct'),
54 (r'(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)(\()',
55 bygroups(Keyword, Whitespace, Name.Class, Whitespace, Text), 'union'),
56 (r'(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)',
57 bygroups(Keyword, Whitespace, Name, Whitespace), 'typedef'),
58 (r'(enum)(\s+)([A-Z][a-zA-Z0-9]+)(\s+\{)',
59 bygroups(Keyword, Whitespace, Name.Class, Whitespace), 'enum'),
60 (r'#.*?$', Comment),
61 (r'\s+', Whitespace),
62 ],
63 'struct': [
64 (r'\{', Text, '#push'),
65 (r'\}', Text, '#pop'),
66 (r'([a-zA-Z0-9]+)(:)(\s*)',
67 bygroups(Name.Attribute, Text, Whitespace), 'typedef'),
68 (r'\s+', Whitespace),
69 ],
70 'union': [
71 (r'\)', Text, '#pop'),
72 (r'(\s*)(\|)(\s*)', bygroups(Whitespace, Text, Whitespace)),
73 (r'[A-Z][a-zA-Z0-9]+', Name.Class),
74 (words(keywords), Keyword),
75 (r'\s+', Whitespace),
76 ],
77 'typedef': [
78 (r'\[\]', Text),
79 (r'#.*?$', Comment, '#pop'),
80 (r'(\[)(\d+)(\])', bygroups(Text, Literal, Text)),
81 (r'<|>', Text),
82 (r'\(', Text, 'union'),
83 (r'(\[)([a-z][a-z-A-Z0-9]+)(\])', bygroups(Text, Keyword, Text)),
84 (r'(\[)([A-Z][a-z-A-Z0-9]+)(\])', bygroups(Text, Name.Class, Text)),
85 (r'([A-Z][a-z-A-Z0-9]+)', Name.Class),
86 (words(keywords), Keyword),
87 (r'\n', Text, '#pop'),
88 (r'\{', Text, 'struct'),
89 (r'\s+', Whitespace),
90 (r'\d+', Literal),
91 ],
92 'enum': [
93 (r'\{', Text, '#push'),
94 (r'\}', Text, '#pop'),
95 (r'([A-Z][A-Z0-9_]*)(\s*=\s*)(\d+)',
96 bygroups(Name.Attribute, Text, Literal)),
97 (r'([A-Z][A-Z0-9_]*)', bygroups(Name.Attribute)),
98 (r'#.*?$', Comment),
99 (r'\s+', Whitespace),
100 ],
101 }