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
|
use core.lang;
use lang.bs;
// Borrow the low-level syntax from Basic Storm.
optional delimiter = SDelimiter;
required delimiter = SRequiredDelimiter;
// Backend-agnostic version of the syntax. There might be more specialized variants for use
// with specific backends for additional convenience.
lang.bs.SAtom => block(l) : "layout" #keyword ~ SLayoutRoot(block) l;
LayoutRoot SLayoutRoot(Block block);
SLayoutRoot => createRoot(block) : SLayout(me) -> add;
// Define an instance of a Layout object with associated properties.
LayoutBlock SLayout(LayoutRoot block);
SLayout => LayoutBlock(block, name, params) : SType name, ("(", SParamList(block.block) params, ")",)? "{" [, SLayoutContent(me),]+ "}";
// Contents of a Layout object.
void SLayoutContent(LayoutBlock block);
SLayoutContent : (SLayoutItem(block),)*;
// One property or a nested layout object.
void SLayoutItem(LayoutBlock block);
// A property, either in this layout or its parent.
SLayoutItem => add(block, name, params) : SName name #varName - (":", SParamList(block.block) params)?, ";";
// A nested layout item.
SLayoutItem => add(block, l) : SLayout(block) l;
// Parameter list.
Actuals SParamList(Block root);
SParamList => Actuals() : ;
SParamList => Actuals() : lang.bs.SExpr(root) -> add - (, ",", lang.bs.SExpr(root) -> add)*;
|