1
+ (*
2
+ #### Glossar
3
+
4
+ Terminal => no further conversion possible
5
+ => UPPERCASE
6
+ => quoted literal
7
+ => regex
8
+ => name reffering to a terminal def
9
+ => e.g.:
10
+ identifiers (names used for vars);
11
+ keywords (class, var, ...);
12
+ literals (define vals in the lang);
13
+ separators and delimiters;
14
+ whitespaces;
15
+ comments;
16
+
17
+ Non-Terminal => further conversion
18
+ => lowercase
19
+ => obtained by grouping Terminals and other Non-Terminals
20
+ => Goal: obtain an AST --> Tree with a Non-Terminal as
21
+ Root that will contain another Non-Terminal ....
22
+
23
+ Production-Rule => EBNF grammar is substantially a list of production rules
24
+ *)
25
+
26
+ (*
27
+ #### Dictonary TERMINAL
28
+
29
+ INT => 0...9
30
+ STRING => a...z
31
+ NOTE => a...g
32
+ PARENTHESIS => (...)
33
+ COMMA => ,
34
+ AT => 'AT'
35
+ TEMPO => 'TEMPO'
36
+ PLAY => 'PLAY'
37
+ WITH => 'WITH'
38
+ TOGETHER => 'TOGETHER'
39
+ MUSICIAN => 'MUSICIAN'
40
+ INSTRUMENT => 'INSTRUMENT'
41
+ ISTRUMENTID => 'Piano' ...
42
+ NOTES => 'NOTES'
43
+ CHORD => 'CHORD'
44
+ PATTERN => 'PATTERN'
45
+ LOOP => 'LOOP'
46
+ *)
47
+
48
+ (*
49
+ #### Example
50
+
51
+ PLAY piano_1, piano_2, violine_1 AT 10, drummer_1 WITH TEMPO 80
52
+
53
+ MUSICIAN piano_1
54
+ INSTRUMENT Piano
55
+ PLAY d,e,f,g,CHORD(c,d)
56
+
57
+ MUSICIAN piano_2
58
+ INSTRUMENT Piano
59
+ PLAY CHORD(a,b)
60
+
61
+ MUSICIAN violine_1
62
+ INSTRUMENT Violine
63
+ PLAY c,f
64
+
65
+ MUSICIAN drummer_1
66
+ INSTRUMENT HiHat
67
+ PLAY LOOP(c,c,c,c)
68
+
69
+
70
+
71
+ *)
72
+
73
+ (* ********************* Terminals ***************************)
74
+
75
+ LOOP : 'LOOP' ;
76
+ PATTERN : 'PATTERN' ;
77
+ CHORD : 'CHORD' ;
78
+ NOTES : 'NOTES' ;
79
+ INSTRUMENT : 'INSTRUMENT' ;
80
+ MUSICIAN : 'MUSICIAN' ;
81
+ TOGETHER : 'TOGETHER' ;
82
+ WITH : 'WITH' ;
83
+ PLAY : 'PLAY' ;
84
+ TEMPO : 'TEMPO' ;
85
+ AT : 'AT' ;
86
+
87
+ COMMA : ',' ;
88
+ LPARAN : '(' ;
89
+ RPARAN : ')' ;
90
+
91
+ ISTRUMENTID
92
+ : 'Piano' | 'Guitar' | ...
93
+ ;
94
+
95
+ NOTE
96
+ : 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g'
97
+ ;
98
+
99
+ STRING
100
+ : [a-z]+
101
+ ;
102
+
103
+ INT
104
+ : [0-9]+
105
+ ;
106
+
107
+
108
+ (* ********************* Non-Terminals ***********************)
109
+
110
+ identifier
111
+ : STRING
112
+ ;
113
+
114
+
115
+
116
+ song
117
+ : track
118
+ ;
119
+
120
+ track
121
+ : PLAY musicVars (tempo)?
122
+ ;
123
+
124
+ tempo
125
+ : WITH TEMPO INT
126
+ ;
127
+
128
+ musicVars
129
+ : musicVar (COMMA musicVar)*
130
+ ;
131
+
132
+ musicVar
133
+ : identifier (AT INT)?
134
+ ;
135
+
136
+
137
+
138
+ musician
139
+ : MUSICIAN identifier INSTRUMENT ISTRUMENTID PLAY (noteElements | loopElements)
140
+ ;
141
+
142
+ noteElements
143
+ : noteElement (COMMA noteElement)*
144
+ ;
145
+
146
+ loopElements
147
+ : LOOP LPARAN noteElements RPARAN
148
+ ;
149
+
150
+ noteElement
151
+ : chord
152
+ | NOTE
153
+ ;
154
+
155
+ chord
156
+ : LPARAN NOTE NOTE (COMMA NOTE)* RPARAN
157
+ ;
0 commit comments