Remove duplicate varref.method() handling from grammar, use namekw in all grammars

databind
Vitaliy Filippov 2015-04-12 22:55:30 +03:00
parent cd71d391c8
commit b94652978c
6 changed files with 2573 additions and 2645 deletions

File diff suppressed because it is too large Load Diff

View File

@ -269,20 +269,6 @@ nonbrace: '{' hash/h '}' {
| name/f nonbrace/arg { | name/f nonbrace/arg {
$$ = $this->template->compile_function($f, [ $arg ]); $$ = $this->template->compile_function($f, [ $arg ]);
} }
| method/f '(' ')' {
$$ = [ $f.'()', true ];
}
| method/f '(' list/args ')' {
$argv = [];
foreach ($args as $a) {
$argv[] = $a[0];
}
$$ = [ $f.'('.implode(', ', $argv).')', true ];
}
.
method: varref/v '.' namekw/m {
$$ = $v[0].'->'.$m;
}
. .
list: exp/e { list: exp/e {
$$ = [ $e ]; $$ = [ $e ];
@ -338,10 +324,10 @@ varpart: '.' namekw/n {
| '[' exp/e ']' { | '[' exp/e ']' {
$$ = '['.$e[0].']'; $$ = '['.$e[0].']';
} }
| '.' name/n '(' ')' { | '.' namekw/n '(' ')' {
$$ = '->'.$n.'()'; $$ = '->'.$n.'()';
} }
| '.' name/n '(' list/l ')' { | '.' namekw/n '(' list/l ')' {
$argv = []; $argv = [];
foreach ($l as $a) { foreach ($l as $a) {
$argv[] = $a[0]; $argv[] = $a[0];

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
* Homepage: http://yourcmc.ru/wiki/VMX::Template * Homepage: http://yourcmc.ru/wiki/VMX::Template
* License: GNU GPLv3 or later * License: GNU GPLv3 or later
* Author: Vitaliy Filippov, 2006-2015 * Author: Vitaliy Filippov, 2006-2015
* Version: V3 (LALR), 2015-04-10 * Version: V3 (LALR), 2015-04-12
* *
* The template engine is split into two parts: * The template engine is split into two parts:
* (1) This file - always used when running templates * (1) This file - always used when running templates

View File

@ -50,8 +50,7 @@ exp: exp ".." exp |
p10 p10
p10: p11 | '-' p11 p10: p11 | '-' p11
p11: nonbrace | '(' exp ')' varpath | '!' p11 | "NOT" p11 p11: nonbrace | '(' exp ')' varpath | '!' p11 | "NOT" p11
nonbrace: '{' hash '}' | literal | varref | name '(' ')' | name '(' list ')' | name '(' gthash ')' | name nonbrace | method '(' ')' | method '(' list ')' nonbrace: '{' hash '}' | literal | varref | name '(' ')' | name '(' list ')' | name '(' gthash ')' | name nonbrace
method: varref '.' namekw
list: exp | exp ',' list list: exp | exp ',' list
arglist: name | name ',' arglist | arglist: name | name ',' arglist |
hash: pair | pair ',' hash | hash: pair | pair ',' hash |
@ -59,7 +58,7 @@ gthash: gtpair | gtpair ',' gthash
pair: exp ',' exp | gtpair pair: exp ',' exp | gtpair
gtpair: exp "=>" exp gtpair: exp "=>" exp
varref: name | varref varpart varref: name | varref varpart
varpart: '.' namekw | '[' exp ']' varpart: '.' namekw | '[' exp ']' | '.' namekw '(' ')' | '.' namekw '(' list ')'
varpath: | varpath varpart varpath: | varpath varpart
namekw: name | "IF" | "END" | "ELSE" | "ELSIF" | "ELSEIF" | "SET" | "OR" | "XOR" | "AND" | "NOT" | "FUNCTION" | "BLOCK" | "MACRO" | "FOR" | "FOREACH" namekw: name | "IF" | "END" | "ELSE" | "ELSIF" | "ELSEIF" | "SET" | "OR" | "XOR" | "AND" | "NOT" | "FUNCTION" | "BLOCK" | "MACRO" | "FOR" | "FOREACH"
%% %%

View File

@ -316,16 +316,16 @@ varref: name {
[ $_[1][0] . $_[2], 0 ]; [ $_[1][0] . $_[2], 0 ];
} }
; ;
varpart: '.' name { varpart: '.' namekw {
"->{'".addcslashes($_[2], "'")."'}"; "->{'".addcslashes($_[2], "'")."'}";
} }
| '[' exp ']' { | '[' exp ']' {
($_[2][1] eq 'i' ? '->['.$_[2][0].']' : "->{".$_[2][0]."}"); ($_[2][1] eq 'i' ? '->['.$_[2][0].']' : "->{".$_[2][0]."}");
} }
| '.' name '(' ')' { | '.' namekw '(' ')' {
'->'.$_[2].'()'; '->'.$_[2].'()';
} }
| '.' name '(' list ')' { | '.' namekw '(' list ')' {
'->'.$_[2].'('.join(', ', map { $_->[0] } @{$_[4]}).')'; '->'.$_[2].'('.join(', ', map { $_->[0] } @{$_[4]}).')';
} }
; ;
@ -336,5 +336,7 @@ varpath: {
$_[1] . $_[2]; $_[1] . $_[2];
} }
; ;
namekw: name | 'IF' | 'END' | 'ELSE' | 'ELSIF' | 'ELSEIF' | 'SET' | 'OR' | 'XOR' | 'AND' | 'NOT' | 'FUNCTION' | 'BLOCK' | 'MACRO' | 'FOR' | 'FOREACH'
;
%% %%