VMXTemplate/template.y

62 lines
2.2 KiB
Plaintext
Raw Normal View History

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"
%left "&"
%nonassoc "==" "!=" "<" ">" "<=" ">="
%left "+" "-"
%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 | exp "-" exp |
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
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
%%