-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsounds.jison
62 lines (52 loc) · 1.27 KB
/
sounds.jison
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
%lex
%%
[^\n\S]+ /* skip whitespace */
[^=/|\s]+ return 'SYM';
'=' return '=';
'/' return '/';
'|' return '|';
\n return 'EOL';
<<EOF>> return 'EOF';
/lex
%start sounds
%%
sounds : sound* EOF
{
var o;
$$ = {cats: {}, rules: [], rewrites: []};
for (o in $1) {
var obj = $1[o];
if (obj instanceof Cat) {
$$.cats[obj.name] = obj.symbols;
}
else if (obj instanceof Rule) {
$$.rules.push(obj);
}
else if (obj instanceof Rewrite) {
$$.rewrites.push(obj);
}
}
}
;
sound
: cat {$$=$1}
| rule {$$=$1}
| rewrite {$$=$1}
;
cat : SYM '=' SYM EOL {$$ = new Cat($1,$3)} ;
rule : SYM '/' SYM '/' SYM EOL {$$ = new Rule($1,$3,$5)} ;
rewrite : SYM '|' SYM EOL {$$ = new Rewrite($1,$3);} ;
%%
function Cat(name, symbols) {
this.name = name;
this.symbols = symbols;
}
function Rule(tgt, repl, pat) {
this.tgt = tgt;
this.repl = repl;
this.pat = pat;
}
function Rewrite(before, after) {
this.before = before;
this.after = after;
}