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
|
use core.lang;
use lang.bs;
use layout;
// Syntax for the DSL used to define pictures. Uses syntax similar to the layout language, but uses
// a different execution model and has some extensions relevant to defining pictures.
delimiter = SDelimiter;
// Entry point. Defines a picture environment.
PictureBlock SPicture(Block block);
SPicture => PictureBlock(pos, block) : "picture" #keyword, "{" [, (SPictureExpr(me),)* ]+ "}";
// Expression inside a picture block.
void SPictureExpr(PictureBlock block);
SPictureExpr => pictureElem(pos, name, params, block)
: SType name, SParamList(block.sub) params, "{" [, (SPictureProperty(me), ";", )* ]+ "}";
SPictureExpr => PictureElem(var, name, params, block)
: SName var #varName, "=", SType name, SParamList(block.sub) params, "{" [, (SPictureProperty(me), ";", )* ]+ "}";
// Regular Basic Storm statements.
SPictureExpr => add(block, expr) : SStmt(block.sub) expr;
// Properties.
void SPictureProperty(PictureElem elem);
SPictureProperty => set(elem, name, params) : SName name #varName - (, ":", SParamList(elem.block) params)?;
// Special case for placement.
SPictureProperty => place(elem, dir, distance, origin)
: SType dir #varName, ":", SExpr(elem.block) distance, "of" #keyword, SExpr(elem.block) origin;
// Special case for animations.
SPictureProperty => set(elem, ani) : SElemAni(elem.block) ani;
//////////////////////////////
// Integration
//////////////////////////////
// Into Basic Storm.
SExpr => block(p) : SPicture(block) p;
// Into the syntax language.
SLayout[50] => asLayoutBlock(block, p) : SPicture(block.block) p;
|