- improvement reduce number of lexer tokens on operators and if conditions

This commit is contained in:
Uwe Tews
2015-05-16 14:47:12 +02:00
parent 22bccee350
commit d21921de22
5 changed files with 2820 additions and 2105 deletions

View File

@@ -1,4 +1,9 @@
 ===== 3.1.24.dev ===== (xx.xx.2015)
16.05.2015
- bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33
- improvement remove not needed ?><?php transitions from compiled code
- improvement reduce number of lexer tokens on operators and if conditions
13.05.2015
- improvement remove not needed ?><?php transitions from compiled code
- improvement of debugging:
@@ -7,7 +12,6 @@
- display Smarty version number
- Truncate lenght of Origin display and extend strin value display to 80 character
- bugfix in Smarty_Security 'nl2br' should be a trusted modifier, not PHP function (code.google issue 223)
- bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33
12.05.2015
- bugfix {$smarty.constant.TEST} did fail on undefined constant https://github.com/smarty-php/smarty/issues/28

View File

@@ -245,7 +245,7 @@ class Smarty_Internal_Templatelexer
smartyblockchildparent = /[\$]smarty\.block\.(child|parent)/
integer = /\d+/
hex = /0[xX][0-9a-fA-F]+/
math = /\s*(\*|\/|\%)\s*/
math = /\s*([*]{1,2}|[%\/^&]|[<>]{2})\s*/
comment = /SMARTYldel\*([\S\s]*?)\*SMARTYrdel/
incdec = /\+\+|\-\-/
unimath = /\s*(\+|\-)\s*/
@@ -276,25 +276,9 @@ class Smarty_Internal_Templatelexer
id = /[0-9]*[a-zA-Z_]\w*/
literal = /literal/
strip = /strip/
equals = /\s*==\s*|\s+eq\s+/
notequals = /\s*!=\s*|\s*<>\s*|\s+(ne|neq)\s+/
greaterthan = /\s*>\s*|\s+gt\s+/
lessthan = /\s*<\s*|\s+lt\s+/
greaterequal = /\s*>=\s*|\s+(ge|gte)\s+/
lessequal = /\s*<=\s*|\s+(le|lte)\s+/
mod = /\s+mod\s+/
identity = /\s*===\s*/
noneidentity = /\s*!==\s*/
isoddby = /\s+is\s+odd\s+by\s+/
isnotoddby = /\s+is\s+not\s+odd\s+by\s+/
isodd = /\s+is\s+odd/
isnotodd = /\s+is\s+not\s+odd/
isevenby = /\s+is\s+even\s+by\s+/
isnotevenby = /\s+is\s+not\s+even\s+by\s+/
iseven = /\s+is\s+even/
isnoteven = /\s+is\s+not\s+even/
isdivby = /\s+is\s+div\s+by\s+/
isnotdivby = /\s+is\s+not\s+div\s+by\s+/
lop = /\s*(([!=][=]{1,2})|([<][=>]?)|([>][=]?)|[&|]{2})\s*/
tlop = /\s+(eq|ne|neg|gt|ge|gte|lt|le|lte|mod|and|or|xor|(is\s+(not\s+)?(odd|even|div)\s+by))\s+/
scond = /\s+is\s+(not\s+)?(odd|even)/
isin = /\s+is\s+in\s+/
as = /\s+as\s+/
to = /\s+to\s+/
@@ -306,9 +290,6 @@ class Smarty_Internal_Templatelexer
setfilter = /setfilter\s+/
instanceof = /\s+instanceof\s+/
not = /!\s*|not\s+/
land = /\s*\&\&\s*|\s*and\s+/
lor = /\s*\|\|\s*|\s*or\s+/
lxor = /\s*xor\s+/
typecast = /\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\)\s*/
double_quote = /"/
single_quote = /'/
@@ -480,76 +461,18 @@ class Smarty_Internal_Templatelexer
instanceof {
$this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
}
identity{
$this->token = Smarty_Internal_Templateparser::TP_IDENTITY;
lop {
$this->token = Smarty_Internal_Templateparser::TP_LOGOP;
}
noneidentity{
$this->token = Smarty_Internal_Templateparser::TP_NONEIDENTITY;
tlop {
$this->token = Smarty_Internal_Templateparser::TP_TLOGOP;
}
equals{
$this->token = Smarty_Internal_Templateparser::TP_EQUALS;
}
notequals{
$this->token = Smarty_Internal_Templateparser::TP_NOTEQUALS;
}
greaterequal{
$this->token = Smarty_Internal_Templateparser::TP_GREATEREQUAL;
}
lessequal{
$this->token = Smarty_Internal_Templateparser::TP_LESSEQUAL;
}
greaterthan{
$this->token = Smarty_Internal_Templateparser::TP_GREATERTHAN;
}
lessthan{
$this->token = Smarty_Internal_Templateparser::TP_LESSTHAN;
}
mod{
$this->token = Smarty_Internal_Templateparser::TP_MOD;
scond {
$this->token = Smarty_Internal_Templateparser::TP_SINGLECOND;
}
not{
$this->token = Smarty_Internal_Templateparser::TP_NOT;
}
land {
$this->token = Smarty_Internal_Templateparser::TP_LAND;
}
lor {
$this->token = Smarty_Internal_Templateparser::TP_LOR;
}
lxor {
$this->token = Smarty_Internal_Templateparser::TP_LXOR;
}
isoddby {
$this->token = Smarty_Internal_Templateparser::TP_ISODDBY;
}
isnotoddby {
$this->token = Smarty_Internal_Templateparser::TP_ISNOTODDBY;
}
isodd {
$this->token = Smarty_Internal_Templateparser::TP_ISODD;
}
isnotodd {
$this->token = Smarty_Internal_Templateparser::TP_ISNOTODD;
}
isevenby {
$this->token = Smarty_Internal_Templateparser::TP_ISEVENBY;
}
isnotevenby {
$this->token = Smarty_Internal_Templateparser::TP_ISNOTEVENBY;
}
iseven{
$this->token = Smarty_Internal_Templateparser::TP_ISEVEN;
}
isnoteven {
$this->token = Smarty_Internal_Templateparser::TP_ISNOTEVEN;
}
isdivby {
$this->token = Smarty_Internal_Templateparser::TP_ISDIVBY;
}
isnotdivby {
$this->token = Smarty_Internal_Templateparser::TP_ISNOTDIVBY;
}
typecast {
$this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
}
@@ -562,7 +485,6 @@ class Smarty_Internal_Templatelexer
openB {
$this->token = Smarty_Internal_Templateparser::TP_OPENB;
}
closeB {
$this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
}

View File

@@ -660,8 +660,11 @@ expr(res) ::= expr(e) modifierlist(l). {
// if expression
// simple expression
expr(res) ::= expr(e1) ifcond(c) expr(e2). {
res = e1.c.e2;
expr(res) ::= expr(e1) lop(c) expr(e2). {
res = (isset(c['pre']) ? c['pre'] : '') . e1.c['op'].e2 . (isset(c['pre']) ? ')' : '');
}
expr(res) ::= expr(e1) scond(c). {
res = c . e1 . ')';
}
expr(res) ::= expr(e1) ISIN array(a). {
@@ -672,53 +675,9 @@ expr(res) ::= expr(e1) ISIN value(v). {
res = 'in_array('.e1.',(array)'.v.')';
}
expr(res) ::= expr(e1) lop(o) expr(e2). {
res = e1.o.e2;
}
expr(res) ::= expr(e1) ISDIVBY expr(e2). {
res = '!('.e1.' % '.e2.')';
}
expr(res) ::= expr(e1) ISNOTDIVBY expr(e2). {
res = '('.e1.' % '.e2.')';
}
expr(res) ::= expr(e1) ISEVEN. {
res = '!(1 & '.e1.')';
}
expr(res) ::= expr(e1) ISNOTEVEN. {
res = '(1 & '.e1.')';
}
expr(res) ::= expr(e1) ISEVENBY expr(e2). {
res = '!(1 & '.e1.' / '.e2.')';
}
expr(res) ::= expr(e1) ISNOTEVENBY expr(e2). {
res = '(1 & '.e1.' / '.e2.')';
}
expr(res) ::= expr(e1) ISODD. {
res = '(1 & '.e1.')';
}
expr(res) ::= expr(e1) ISNOTODD. {
res = '!(1 & '.e1.')';
}
expr(res) ::= expr(e1) ISODDBY expr(e2). {
res = '(1 & '.e1.' / '.e2.')';
}
expr(res) ::= expr(e1) ISNOTODDBY expr(e2). {
res = '!(1 & '.e1.' / '.e2.')';
}
expr(res) ::= variable(v1) INSTANCEOF(i) ns1(v2). {
res = v1.i.v2;
}
}
//
@@ -1199,52 +1158,45 @@ static_class_access(res) ::= DOLLAR ID(v) arrayindex(a) objectchain(oc). {
// if conditions and operators
ifcond(res) ::= EQUALS. {
res = '==';
lop(res) ::= LOGOP(o). {
res['op'] = ' '. trim(o) . ' ';
}
ifcond(res) ::= NOTEQUALS. {
res = '!=';
lop(res) ::= TLOGOP(o). {
static $lops = array(
'eq' => array('op' => ' == ', 'pre' => null),
'ne' => array('op' => ' != ', 'pre' => null),
'neq' => array('op' => ' != ', 'pre' => null),
'gt' => array('op' => ' > ', 'pre' => null),
'ge' => array('op' => ' >= ', 'pre' => null),
'gte' => array('op' => ' >= ', 'pre' => null),
'lt' => array('op' => ' < ', 'pre' => null),
'le' => array('op' => ' <= ', 'pre' => null),
'lte' => array('op' => ' <= ', 'pre' => null),
'mod' => array('op' => ' % ', 'pre' => null),
'and' => array('op' => ' && ', 'pre' => null),
'or' => array('op' => ' || ', 'pre' => null),
'xor' => array('op' => ' xor ', 'pre' => null),
'isdivby' => array('op' => ' % ', 'pre' => '!('),
'isnotdivby' => array('op' => ' % ', 'pre' => '('),
'isevenby' => array('op' => ' / ', 'pre' => '!(1 & '),
'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '),
'isoddby' => array('op' => ' / ', 'pre' => '(1 & '),
'isnotoddby' => array('op' => ' / ', 'pre' => '!(1 & '),
);
$op = strtolower(str_replace(' ', '', o));
res = $lops[$op];
}
ifcond(res) ::= GREATERTHAN. {
res = '>';
}
ifcond(res) ::= LESSTHAN. {
res = '<';
}
ifcond(res) ::= GREATEREQUAL. {
res = '>=';
}
ifcond(res) ::= LESSEQUAL. {
res = '<=';
}
ifcond(res) ::= IDENTITY. {
res = '===';
}
ifcond(res) ::= NONEIDENTITY. {
res = '!==';
}
ifcond(res) ::= MOD. {
res = '%';
}
lop(res) ::= LAND. {
res = '&&';
}
lop(res) ::= LOR. {
res = '||';
}
lop(res) ::= LXOR. {
res = ' XOR ';
scond(res) ::= SINGLECOND(o). {
static $scond = array (
'iseven' => '!(1 & ',
'isnoteven' => '(1 & ',
'isodd' => '(1 & ',
'isnotodd' => '!(1 & ',
);
$op = strtolower(str_replace(' ', '', o));
res = $scond[$op];
}
//

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long