FAIL (noscript)
// to handle empty case
content := 'content-start' template;
content := 'content-start';
template := template tag;
template := template 'text';
template := tag;
template := 'text';
tag := directives 'eod';
tag := 'eod';
directives := directives ";" directive;
directives := directives ";";
directives := directive;
// directives := ";"; // XXX
directive := get;
directive := set;
directive := block;
directive := if;
get := 'GET' righthand;
get := righthand;
righthand := expression filters conditions; // XXX
righthand := expression filters; // XXX
righthand := expression conditions; // XXX
righthand := expression;
set := 'SET' set-expression;
set := set-expression;
set-expressions := set-expression; //XXX
set-expression := variable-name "=" righthand;
block := 'BLOCK' block-name 'eod' template 'END';
block := 'BLOCK' block-name 'eod' 'END';
// XXX 'eod' template -> optional-content
block-name := 'identifier';
block-name := 'number';
block-name := path; // XXX
if := if-unless expression optional-content else 'END';
if := if-unless expression optional-content 'END';
if-unless := 'IF';
if-unless := 'UNLESS';
else := 'ELSE' optional-content;
else := elsif;
elsif := 'ELSIF' expression optional-content else;
elsif := 'ELSIF' expression optional-content;
optional-content := 'eod' template;
optional-content := 'eod';
optional-content := ';' directives 'eod' template;
optional-content := ';' directives 'eod';
optional-content := ';' directives ';';
optional-content := ';';
expression := expression "&&" expression1;
expression := expression "||" expression1;
expression := expression1;
expression1 := expression1 "==" expression2;
expression1 := expression1 "!=" expression2;
expression1 := expression1 "<=" expression2;
expression1 := expression1 ">=" expression2;
expression1 := expression1 "<" expression2;
expression1 := expression1 ">" expression2;
expression1 := expression2;
expression2 := expression2 "+" expression3;
expression2 := expression2 "-" expression3;
expression2 := expression2 "_" expression3;
expression2 := expression3;
expression3 := expression3 "*" expression4;
expression3 := expression3 "/" expression4;
expression3 := expression3 "div" expression4;
expression3 := expression3 "mod" expression4;
expression3 := expression4;
expression4 := "not" term;
expression4 := term;
term := scalar-term;
term := "(" expression ")";
scalar-term := lvalue;
scalar-term := 'string';
scalar-term := "number";
lvalue := lvalue "." variable-name;
lvalue := variable-name;
variable-name := "identifier";