VMXTemplate/template.y

60 lines
2.3 KiB
Plaintext
Raw Normal View History

2013-04-19 13:50:42 +04:00
// Контекстно-свободная грамматика шаблонизатора
// Подразумевается, что лексический анализатор зависим от работы синтаксического,
// знает о его состоянии и соответственно выдаёт либо лексемы "внутри" блоков кода,
// либо литералы "вне" оных
// Олдстайл BEGIN .. END ликвидирован
2013-04-19 23:26:52 +04:00
// Возможно, нужно сделать 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 ".."
2013-04-20 03:42:30 +04:00
%left "||" "or" "xor"
%left "&&" "and"
2013-04-19 13:50:42 +04:00
%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
2013-04-20 03:42:30 +04:00
chunk: literal | "<!--" code_chunk "-->" | "{" exp "}" | error
2013-04-19 13:50:42 +04:00
code_chunk: c_if | c_set | c_fn | c_for | exp
2013-04-20 03:42:30 +04:00
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"
2013-04-19 13:50:42 +04:00
c_elseifs: "<!--" elseif exp "-->" | c_elseifs chunks "<!--" elseif exp "-->"
2013-04-20 03:42:30 +04:00
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"
fn: "function" | "block" | "macro"
for: "for" | "foreach"
elseif: "else" "if" | "elsif" | "elseif"
2012-07-30 03:06:38 +04:00
2013-04-19 13:50:42 +04:00
exp: exp ".." exp |
2013-04-20 03:42:30 +04:00
exp "||" exp | exp "or" exp | exp "xor" exp |
exp "&&" exp | exp "and" exp |
2013-04-19 13:50:42 +04:00
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-04-20 03:42:30 +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
%%