-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.grm
42 lines (32 loc) · 1.48 KB
/
grammar.grm
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
%ignore /\n*/
%ignore /[ \t\v\f\r]*/
%%
Song -> MM %{ return translate_mml(n1.val); %}
;
MM -> MM M %{ return n1.val.concat(n2.val); %}
| M %{ return n1.val; %}
;
M -> SS '|' %{ return determine_beats(n1.val); %}
;
SS -> SS S %{ return n1.val.concat(n2.val); %}
| S %{ return [n1.val]; %}
;
S -> C B %{ return {'notes': n1.val, 'beats': count(n2.val)}; %}
| C %{ return {'notes': n1.val, 'beats': 1}; %}
| NN B %{ return {'notes': n1.val, 'beats': count(n2.val)}; %}
| NN %{ return {'notes': n1.val, 'beats': 1}; %}
| REST B %{ return {'notes': n1.val, 'beats': count(n2.val)}; %}
| REST %{ return {'notes': n1.val, 'beats': 1}; %}
| O %{ return n1.val; %}
;
C -> '(' NN ')' %{ return n2.val; %}
;
NN -> NN ',' NOTE %{ return n1.val.concat([convert(n3.val)]); %}
| NOTE %{ return [convert(n1.val)]; %}
;
NOTE -> /[ABCDEFG](b|#)?/ %{ return n1.val; %}
| '`' NOTE %{ return '`' + n2.val; %}
;
REST -> /_/ %{ return ['r']; %};
B -> /-*/;
O -> /(\<|\>)?/;