using context-free grammars to generate CDFG files
Posted: Sun Jun 12, 2005 9:16 am
This grammar:
startshape r2
rule r1 0.753 {
SQUARE { x 0.06 y 1.89 s 0.77 r 1.350 b 0.7 }
SQUARE { x -1.180 y -0.943 s 0.46 r -97.1 b -0.4 }
}
rule r2 0.624 {
r2 { x 1.72 y 0.9 s 0.123 r -0.599 b 0.4 }
CIRCLE { x -0.354 y 1.833 s 0.74 r -42.60 b -0.1 }
r2 { x -0.758 y 1.6 s 0.7217 r 2.75 b 0.5 }
}
rule r2 0.948 {
r1 { x -0.9 y -1.5 s 1.9565 r 03.43 b 0.7 }
SQUARE { x -0.6 y -1.3 s 1.75 r 79.5 b 0.2 }
r1 { x -1.531 y 0.247 s 0.676 r 3.5 b -0.7 }
r2 { x 0.677 y 1.988 s 0.84 r -7.807 b -0.6 }
CIRCLE { x -0.3 y -0.218 s 0.7746 r -0.959 b 0.7 }
}
rule r2 0.902 {
r1 { x 0.11 y 1.9 s 0.6518 r 59.179 b -0.9 }
r2 { x -0.508 y -1.9 s 0.805 r 62.77 b 0.2 }
CIRCLE { x -0.560 y -1.20 s 0.9863 r 9.05 b -0.4 }
CIRCLE { x 0.513 y -0.0 s 0.9628 r 78.1 b 0.2 }
}
was generated by this rmutt grammar. It's ugly, because rmutt doesn't directly support random numbers:
grammar:
"startshape " rulename "\n"
rule{4}
;
rule: "rule " rulename " " prob " " rulebody "\n";
rulename: "r" ("1"|"2");
rulebody: "{\n" shape_clause rulename_clause* "}\n";
shape_clause: shape " " shapemod "\n";
rulename_clause: rulename " " mod "\n";
clause: shape_clause | rulename_clause;
shape: "SQUARE"|"CIRCLE";
mod: "{ x " nxy " y " nxy " s " ns " r " nr " b " nb " }";
shapemod: "{ x " nxy " y " nxy " s " nss " r " nr " b " nb " }";
nxy: "-"? "0." digit{1,3};
ns: "0." highdigit digit{1,3} &20 | "1." digit{1,3};
nss: ("0"&4|"1"&2|"2") "." highdigit digit{1,3};
nr: "-"? digit{1} "." digit{1,3};
prob: ns;
nb: "-"? "0." digit;
highdigit: "9"&9|"8"&8|"7"&7|"6"&6|"5"&5|"4"&4|"3"&3|"2"&2|"1";
digit: "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";
startshape r2
rule r1 0.753 {
SQUARE { x 0.06 y 1.89 s 0.77 r 1.350 b 0.7 }
SQUARE { x -1.180 y -0.943 s 0.46 r -97.1 b -0.4 }
}
rule r2 0.624 {
r2 { x 1.72 y 0.9 s 0.123 r -0.599 b 0.4 }
CIRCLE { x -0.354 y 1.833 s 0.74 r -42.60 b -0.1 }
r2 { x -0.758 y 1.6 s 0.7217 r 2.75 b 0.5 }
}
rule r2 0.948 {
r1 { x -0.9 y -1.5 s 1.9565 r 03.43 b 0.7 }
SQUARE { x -0.6 y -1.3 s 1.75 r 79.5 b 0.2 }
r1 { x -1.531 y 0.247 s 0.676 r 3.5 b -0.7 }
r2 { x 0.677 y 1.988 s 0.84 r -7.807 b -0.6 }
CIRCLE { x -0.3 y -0.218 s 0.7746 r -0.959 b 0.7 }
}
rule r2 0.902 {
r1 { x 0.11 y 1.9 s 0.6518 r 59.179 b -0.9 }
r2 { x -0.508 y -1.9 s 0.805 r 62.77 b 0.2 }
CIRCLE { x -0.560 y -1.20 s 0.9863 r 9.05 b -0.4 }
CIRCLE { x 0.513 y -0.0 s 0.9628 r 78.1 b 0.2 }
}
was generated by this rmutt grammar. It's ugly, because rmutt doesn't directly support random numbers:
grammar:
"startshape " rulename "\n"
rule{4}
;
rule: "rule " rulename " " prob " " rulebody "\n";
rulename: "r" ("1"|"2");
rulebody: "{\n" shape_clause rulename_clause* "}\n";
shape_clause: shape " " shapemod "\n";
rulename_clause: rulename " " mod "\n";
clause: shape_clause | rulename_clause;
shape: "SQUARE"|"CIRCLE";
mod: "{ x " nxy " y " nxy " s " ns " r " nr " b " nb " }";
shapemod: "{ x " nxy " y " nxy " s " nss " r " nr " b " nb " }";
nxy: "-"? "0." digit{1,3};
ns: "0." highdigit digit{1,3} &20 | "1." digit{1,3};
nss: ("0"&4|"1"&2|"2") "." highdigit digit{1,3};
nr: "-"? digit{1} "." digit{1,3};
prob: ns;
nb: "-"? "0." digit;
highdigit: "9"&9|"8"&8|"7"&7|"6"&6|"5"&5|"4"&4|"3"&3|"2"&2|"1";
digit: "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";