start = expression expression = expression:statement* { return expression.join("") } statement = functionCall / variable / text arg = "|" value:expression { return value; } optionalArgs = arg+ args = value:expression optionalArgs? functionCall = "%" name:identifier "<" args:args ">" length:resultLength? { return options.callFunction(name, args, length); } variable = "{" name:identifier "}" length:resultLength? { return options.getVariableValue(name, length); } resultLength = "[" length:number unit:lengthUnit "]" { return { length, unit }; } lengthUnit = "ch"? identifier = [a-z0-9-]+ { return text(); } number = [0-9]+ { return Number(text()); } text = char+ { return text(); } char = !"%" !"{" !"|" !">" escapedChar escapedChar = "\\\\%" / "\\\\{" / "\\\\|" / "\\\\>" / .