-
Notifications
You must be signed in to change notification settings - Fork 0
/
grammar.py
72 lines (40 loc) · 1.73 KB
/
grammar.py
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
#!/usr/bin/python
from pyparsing import *
toInt = (lambda s,l,t: int(t[0]))
isStr = (lambda targ: (lambda s,l,t: t[0] == targ))
string = QuotedString("\'") | QuotedString("\"")
# SHET Paths/Args
shet_url = Word("/", alphanums+"_/" )
shet_arg = string | Word(srange("[0-9]")).setParseAction(toInt)
shet_action = (shet_url("url")
+ Optional("=")("property")
+ Group(ZeroOrMore(shet_arg))("args"))
# Modifier prefixes
hold = Optional("_")
middle_switch = Optional("^")
# Buttons
button_literal = Word(srange("[0-9]"), exact = 1).setParseAction(toInt)
button_chord = Group(button_literal + OneOrMore(button_literal))
button_grouping_type = Literal("any") | Literal("one")
button_names = button_literal("button") + Suppress(":") + Optional(string)("name")
button_grouping = (button_grouping_type("type")
+ nestedExpr("(", ")",
delimitedList(Group(button_names)))("elements"))
buttons = Optional(button_chord("chord")
| button_literal("literal")
| button_grouping("grouping"))
# Binding
binding = (hold("hold") + middle_switch("middle_switch")
+ buttons("buttons")
+ Suppress("=>")
+ shet_action("action")
+ Suppress(";"))
# Mode Blocks
mode_alias = Word(srange("[A-Z_]"))
mode_literal = Group(Word(srange("[0-9]"))("type").setParseAction(toInt)
+ Literal(":").suppress()
+ Word(srange("[0-9]"))("mode").setParseAction(toInt))
mode = mode_alias("alias") | mode_literal("literal")
mode_block = (mode
+ nestedExpr("{", "}", OneOrMore(Group(binding)))("bindings"))
Grammar = OneOrMore(Group(mode_block)).ignore(cStyleComment)