// L-system grammar for PEG.js // ========================== Ruleset "ruleset" = rules:Rule+ { var result = {ruleset:{}} for (var i = 0; i < rules.length; ++i) { var rule = rules[i] result.ruleset[rule.predecessor.name] = { params : rule.predecessor.params, successor : rule.successor } } return result } / axiom:ModuleExpr { return { axiom : { name : axiom.name, args : axiom.args.map(function(e){return eval("("+e+")")}) } } } Rule "rule" = predc:Predecessor Whitespace"->" Whitespace succ:Successor Whitespace";" Whitespace{ return { predecessor : predc, successor : succ } } Predecessor "predecessor" = name:Ident "(" params:ParamsList ")" { return { name: name, params: params } } ParamsList "parameters list"= "void" {return []} / l:(Ident ",")* p:Ident { return l.map(function(x) { return x[0]; }).concat([p]) } Ident "identifier" = Whitespace str:[a-zA-Z_]+ Whitespace { return str.join("") } Successor "successor" = modexprs:ModuleExpr+ { return modexprs } ModuleExpr "module expression" = name:Ident Whitespace "(" args:ArgList ")" Whitespace { return { name:name, args:args } } / "[" Whitespace{ return { name : "[", args : [] } } / "]" Whitespace{ return { name : "]", args : [] } } ArgList "argument list" = "void" { return [] } / l:(Arg ",")* a:Arg { return l.map(function(x) { return x[0]; }).concat([a]) } Arg "argument" = InstantArg / DeferredArg InstantArg "argument" = Whitespace "\"" arg:[^"]+ "\"" Whitespace { return arg.join("") } DeferredArg "deferred argument" = Whitespace "defer(" Whitespace arg:InstantArg Whitespace ")" { return "function(ctx) { return ("+arg+") }" } Whitespace = [ \t\n]*