2013-04-19 13:50:42 +04:00
|
|
|
|
// Контекстно-свободная грамматика шаблонизатора
|
|
|
|
|
|
|
|
|
|
// Подразумевается, что лексический анализатор зависим от работы синтаксического,
|
|
|
|
|
// знает о его состоянии и соответственно выдаёт либо лексемы "внутри" блоков кода,
|
|
|
|
|
// либо литералы "вне" оных
|
|
|
|
|
|
|
|
|
|
// Олдстайл BEGIN .. END ликвидирован
|
|
|
|
|
|
|
|
|
|
// TODO foreach ... as key => value
|
2012-07-30 03:06:38 +04:00
|
|
|
|
|
|
|
|
|
%token literal
|
|
|
|
|
%token name
|
|
|
|
|
|
2013-04-19 13:50:42 +04:00
|
|
|
|
%left ".."
|
|
|
|
|
%left "||" "OR" "XOR"
|
|
|
|
|
%left "&&" "AND"
|
|
|
|
|
%nonassoc "==" "!=" "<" ">" "<=" ">="
|
|
|
|
|
%left "+" "-"
|
2013-04-19 17:04:03 +04:00
|
|
|
|
%left "&"
|
2013-04-19 13:50:42 +04:00
|
|
|
|
%left "*" "/" "%"
|
|
|
|
|
|
2012-07-30 03:06:38 +04:00
|
|
|
|
%%
|
2013-04-19 13:50:42 +04:00
|
|
|
|
chunks: | chunks chunk
|
|
|
|
|
chunk: error | literal | "<!--" code_chunk "-->" | "{" exp "}"
|
|
|
|
|
code_chunk: c_if | c_set | c_fn | c_for | exp
|
|
|
|
|
c_if: "IF" exp "-->" chunks "<!--" "END" |
|
|
|
|
|
"IF" exp "-->" chunks "<!--" "ELSE" "-->" chunks "<!--" "END" |
|
|
|
|
|
"IF" exp "-->" chunks c_elseifs chunks "<!--" "END" |
|
|
|
|
|
"IF" exp "-->" chunks c_elseifs chunks "<!--" "ELSE" "-->" chunks "<!--" "END"
|
|
|
|
|
c_elseifs: "<!--" elseif exp "-->" | c_elseifs chunks "<!--" elseif exp "-->"
|
|
|
|
|
c_set: "SET" varref "=" exp | "SET" varref "-->" chunks "<!--" "END"
|
|
|
|
|
c_fn: fn name "(" arglist ")" "=" exp | fn name "(" arglist ")" "-->" chunks "<!--" "END"
|
|
|
|
|
c_for: for varref "=" exp "-->" chunks "<!--" "END"
|
2012-07-30 03:06:38 +04:00
|
|
|
|
fn: "FUNCTION" | "BLOCK" | "MACRO"
|
|
|
|
|
for: "FOR" | "FOREACH"
|
|
|
|
|
elseif: "ELSE" "IF" | "ELSIF" | "ELSEIF"
|
|
|
|
|
|
2013-04-19 13:50:42 +04:00
|
|
|
|
exp: exp ".." exp |
|
|
|
|
|
exp "||" exp | exp "OR" exp | exp "XOR" exp |
|
|
|
|
|
exp "&&" exp | exp "AND" exp |
|
|
|
|
|
exp "==" exp | exp "!=" exp |
|
|
|
|
|
exp "<" exp | exp ">" exp | exp "<=" exp | exp ">=" exp |
|
|
|
|
|
exp "+" exp | exp "-" exp |
|
2013-04-19 17:04:03 +04:00
|
|
|
|
exp "&" exp |
|
2013-04-19 13:50:42 +04:00
|
|
|
|
exp "*" exp | exp "/" exp | exp "%" exp |
|
|
|
|
|
p10
|
2012-07-30 03:06:38 +04:00
|
|
|
|
p10: p11 | '-' p11
|
2013-02-17 15:45:17 +04:00
|
|
|
|
p11: nonbrace | '(' exp ')' varpath | '!' p11 | "NOT" p11
|
2013-04-19 19:55:42 +04:00
|
|
|
|
nonbrace: '{' hash '}' | literal | varref | name '(' ')' | name '(' list ')' | name '(' gthash ')' | name nonbrace | method '(' ')' | method '(' list ')'
|
|
|
|
|
method: varref '.' name
|
2012-09-26 00:58:18 +04:00
|
|
|
|
list: exp | exp ',' list
|
2012-07-30 03:06:38 +04:00
|
|
|
|
arglist: name | name ',' arglist |
|
|
|
|
|
hash: pair | pair ',' hash |
|
2013-04-19 19:55:42 +04:00
|
|
|
|
gthash: gtpair | gtpair ',' gthash
|
2012-09-26 00:58:18 +04:00
|
|
|
|
pair: exp ',' exp | gtpair
|
|
|
|
|
gtpair: exp "=>" exp
|
2012-07-30 03:06:38 +04:00
|
|
|
|
varref: name | varref varpart
|
|
|
|
|
varpart: '.' name | '[' exp ']'
|
|
|
|
|
varpath: | varpath varpart
|
|
|
|
|
%%
|