-
Notifications
You must be signed in to change notification settings - Fork 2
/
grammar.js
129 lines (95 loc) · 2.77 KB
/
grammar.js
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
module.exports = grammar({
name: "hyprlang",
extras: ($) => [/[ \t]/, $.comment],
conflicts: ($) => [[$.number, $.legacy_hex]],
word: ($) => $.string,
rules: {
configuration: ($) =>
repeat(
choice(
$.source,
$.exec,
$.declaration,
$.assignment,
$.keyword,
$.section,
$._linebreak
)
),
declaration: ($) =>
seq(
$.variable,
"=",
choice($.mod, $.number, $.string_literal),
$._linebreak
),
assignment: ($) => seq($.name, "=", optional($._value), $._linebreak),
keyword: ($) => seq($.name, "=", $.params, $._linebreak),
section: ($) =>
seq(
choice($.name, seq($.name, ":", field("device", $.device_name))),
"{",
$._linebreak,
repeat(choice($.assignment, $.keyword, $.section, $._linebreak)),
"}",
$._linebreak
),
source: ($) => seq("source", "=", $.string, $._linebreak),
exec: ($) => seq(choice("exec", "exec-once"), "=", $.string, $._linebreak),
_value: ($) =>
choice(
$.boolean,
$.number,
$.vec2,
$.display,
$.gradient,
$.mod,
$.keys,
$.string,
$.variable,
prec(1, $.color),
prec(1, $.position)
),
boolean: () => choice("true", "false", "on", "off", "yes", "no"),
number: ($) =>
choice($._zero, seq(optional(choice("+", "-")), /[0-9][0-9\.]*/)),
vec2: ($) => seq($.number, $.number),
color: ($) => choice($.legacy_hex, $.rgb),
legacy_hex: ($) => seq($._zero, "x", $.hex),
rgb: ($) =>
seq(choice("rgb", "rgba"), "(", choice($.hex, $.number_tuple), ")"),
gradient: ($) => seq($.color, repeat($.color), optional($.angle)),
number_tuple: ($) => seq($.number, repeat(seq(",", $.number))),
display: ($) => seq($.position, optional(seq("@", $.number))),
position: ($) => seq($.number, "x", $.number),
hex: () => /[0-9a-fA-F]{6,8}/,
angle: () => seq(/[0-9]{1,3}/, "deg"),
mod: () =>
choice(
"SHIFT",
"CAPS",
"CTRL",
"CONTROL",
"ALT",
"MOD2",
"MOD3",
"SUPER",
"WIN",
"LOGO",
"MOD4",
"MOD5",
"TAB"
),
keys: ($) => choice(seq($.mod, $.mod), seq($.variable, $.mod)),
string: () => token(prec(-1, /[^\n,#]+|.*##.*/)),
string_literal: () => token(prec(-1, /[^\n#]+|.*##.*/)),
params: ($) =>
prec(-1, seq($._value, repeat(seq(",", optional($._value))))),
name: () => /[\w][\w\d\.\-]*/,
device_name: () => /[\w\d][\w\d\/\.\-:]*/,
variable: () => seq("$", /\w[\w\d]*/),
_zero: () => "0",
_linebreak: () => "\n",
comment: () => seq("#", /.*/),
},
});