VMXTemplate/template.y

50 lines
1.6 KiB
Plaintext
Raw Normal View History

2012-09-26 00:58:18 +04:00
// Грамматика Новой-Новой Версии шаблонизатора.
// Конфликтов нет.
2012-07-30 03:06:38 +04:00
// BEGIN, возможно, ещё будет ликвидирован.
2012-08-13 02:27:20 +04:00
// FIXME не хватает foreach($a as $k => $v)
2012-07-30 03:06:38 +04:00
%token literal
%token name
%%
inst: "<!--" code "-->" | "{" exp "}"
code: "IF" exp | "ELSE" | elseif exp | "END" | "END" varref |
"SET" varref | "SET" varref '=' exp |
fn name '(' arglist ')' | fn name '(' arglist ')' '=' exp |
for varref '=' exp | for varref |
"BEGIN" name bparam | exp
bparam: |
bp1 | bp2 | bp3 |
bp1 bp2 | bp2 bp1 | bp1 bp3 | bp3 bp1 | bp2 bp3 | bp3 bp2 |
bp1 bp2 bp3 | bp1 bp3 bp2 | bp2 bp1 bp3 | bp2 bp3 bp1 | bp3 bp1 bp2 | bp3 bp2 bp1
bp1: "AT" exp
bp2: "BY" exp
bp3: "TO" exp
fn: "FUNCTION" | "BLOCK" | "MACRO"
for: "FOR" | "FOREACH"
elseif: "ELSE" "IF" | "ELSIF" | "ELSEIF"
2013-02-22 01:16:10 +04:00
exp: p4 | p4 ".." exp
2012-07-30 03:06:38 +04:00
p4: p5 | p5 "||" p4 | p5 "OR" p4 | p5 "XOR" p4
2013-03-30 00:57:58 +04:00
p5: bitand | bitand "&&" p5 | bitand "AND" p5
bitand: p6 | p6 "&" bitand
2012-07-30 03:06:38 +04:00
p6: p7 | p7 "==" p7 | p7 "!=" p7
p7: p8 | p8 '<' p8 | p8 '>' p8 | p8 "<=" p8 | p8 ">=" p8
p8: p9 | p9 '+' p8 | p9 '-' p8
p9: p10 | p10 '*' p9 | p10 '/' p9 | p10 '%' p9
p10: p11 | '-' p11
2013-02-17 15:45:17 +04:00
p11: nonbrace | '(' exp ')' varpath | '!' p11 | "NOT" p11
2012-09-26 23:46:15 +04:00
nonbrace: '{' hash '}' | literal | varref | func '(' list_or_gthash ')' | func nonbrace
list_or_gthash: list | gthash
2012-07-30 03:06:38 +04:00
func: name | varref varpart
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 |
2012-09-26 00:58:18 +04:00
gthash: gtpair | gtpair ',' gthash |
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
%%