@@ -96,112 +96,117 @@ module.exports = {
96
96
97
97
if ( this . token === '@' )
98
98
return this . node ( 'silent' ) ( this . next ( ) . read_expr ( ) ) ;
99
-
100
- switch ( this . token ) {
101
- case '-' :
102
- var result = this . node ( ) ;
99
+ if ( this . token === '+' )
100
+ return this . node ( 'unary' ) ( '+' , this . next ( ) . read_expr ( ) ) ;
101
+ if ( this . token === '!' )
102
+ return this . node ( 'unary' ) ( '!' , this . next ( ) . read_expr ( ) ) ;
103
+ if ( this . token === '~' )
104
+ return this . node ( 'unary' ) ( '~' , this . next ( ) . read_expr ( ) ) ;
105
+
106
+ if ( this . token === '-' ) {
107
+ var result = this . node ( ) ;
108
+ this . next ( ) ;
109
+ if (
110
+ this . token === this . tok . T_LNUMBER ||
111
+ this . token === this . tok . T_DNUMBER
112
+ ) {
113
+ // negative number
114
+ result = result ( 'number' , '-' + this . text ( ) ) ;
103
115
this . next ( ) ;
104
- if (
105
- this . token === this . tok . T_LNUMBER ||
106
- this . token === this . tok . T_DNUMBER
107
- ) {
108
- // negative number
109
- result = result ( 'number' , '-' + this . text ( ) ) ;
110
- this . next ( ) ;
111
- return result ;
112
- } else {
113
- return result ( 'unary' , '-' , this . read_expr ( ) ) ;
114
- }
116
+ return result ;
117
+ } else {
118
+ return result ( 'unary' , '-' , this . read_expr ( ) ) ;
119
+ }
120
+ }
115
121
116
- case '+' :
117
- case '!' :
118
- case '~' :
119
- return this . node ( 'unary' ) ( this . token , this . next ( ) . read_expr ( ) ) ;
122
+ if ( this . token === '(' ) {
123
+ var expr = this . next ( ) . read_expr ( ) ;
124
+ this . expect ( ')' ) && this . next ( ) ;
125
+ // handle dereferencable
126
+ if ( this . token === this . tok . T_OBJECT_OPERATOR ) {
127
+ return this . recursive_variable_chain_scan ( expr , false ) ;
128
+ } else if ( this . token === this . tok . T_CURLY_OPEN || this . token === '[' ) {
129
+ return this . read_dereferencable ( expr ) ;
130
+ } else if ( this . token === '(' ) {
131
+ // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118
132
+ return this . node ( 'call' ) (
133
+ expr , this . read_function_argument_list ( )
134
+ ) ;
135
+ } else {
136
+ return expr ;
137
+ }
138
+ }
120
139
121
- case '(' :
122
- var expr = this . next ( ) . read_expr ( ) ;
123
- if ( this . expect ( ')' ) ) {
124
- this . next ( ) ;
125
- }
140
+ if ( this . token === '`' ) {
141
+ // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1048
142
+ return this . node ( 'shell' ) (
143
+ this . next ( ) . read_encapsed_string ( '`' )
144
+ ) ;
145
+ }
126
146
127
- // handle dereferencable
128
- if ( this . token === this . tok . T_OBJECT_OPERATOR ) {
129
- return this . recursive_variable_chain_scan ( expr , false ) ;
130
- } else if ( this . token === this . tok . T_CURLY_OPEN || this . token === '[' ) {
131
- return this . read_dereferencable ( expr ) ;
132
- } else if ( this . token === '(' ) {
133
- // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118
134
- return this . node ( 'call' ) (
135
- expr , this . read_function_argument_list ( )
136
- ) ;
137
- } else {
138
- return expr ;
139
- }
147
+ if ( this . token === this . tok . T_LIST ) {
148
+ var result = this . node ( 'list' ) , assign = null ;
149
+ var isInner = this . innerList ;
150
+ if ( ! isInner ) {
151
+ assign = this . node ( 'assign' ) ;
152
+ }
153
+ if ( this . next ( ) . expect ( '(' ) ) {
154
+ this . next ( ) ;
155
+ }
140
156
141
- case '`' :
142
- // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1048
143
- var result = this . node ( 'shell' ) ;
144
- var expr = this . next ( ) . read_encapsed_string ( '`' ) ;
145
- return result ( expr ) ;
157
+ if ( ! this . innerList ) this . innerList = true ;
158
+ var assignList = this . read_assignment_list ( ) ;
146
159
147
- case this . tok . T_LIST :
148
- var result = this . node ( 'list' ) , assign = null ;
149
- var isInner = this . innerList ;
150
- if ( ! isInner ) {
151
- assign = this . node ( 'assign' ) ;
160
+ // check if contains at least one assignment statement
161
+ var hasItem = false ;
162
+ for ( var i = 0 ; i < assignList . length ; i ++ ) {
163
+ if ( assignList [ i ] !== null ) {
164
+ hasItem = true ;
165
+ break ;
152
166
}
153
- if ( this . next ( ) . expect ( '(' ) ) {
154
- this . next ( ) ;
155
- }
156
-
157
- if ( ! this . innerList ) this . innerList = true ;
158
- var assignList = this . read_assignment_list ( ) ;
167
+ }
168
+ if ( ! hasItem ) {
169
+ this . raiseError (
170
+ 'Fatal Error : Cannot use empty list on line ' + this . lexer . yylloc . first_line
171
+ ) ;
172
+ }
173
+ if ( this . expect ( ')' ) ) {
174
+ this . next ( ) ;
175
+ }
159
176
160
- // check if contains at least one assignment statement
161
- var hasItem = false ;
162
- for ( var i = 0 ; i < assignList . length ; i ++ ) {
163
- if ( assignList [ i ] !== null ) {
164
- hasItem = true ;
165
- break ;
166
- }
167
- }
168
- if ( ! hasItem ) {
169
- this . raiseError (
170
- 'Fatal Error : Cannot use empty list on line ' + this . lexer . yylloc . first_line
177
+ if ( ! isInner ) {
178
+ this . innerList = false ;
179
+ if ( this . expect ( '=' ) ) {
180
+ return assign (
181
+ result ( assignList ) ,
182
+ this . next ( ) . read_expr ( ) ,
183
+ '='
171
184
) ;
172
- }
173
- if ( this . expect ( ')' ) ) {
174
- this . next ( ) ;
175
- }
176
-
177
- if ( ! isInner ) {
178
- this . innerList = false ;
179
- if ( this . expect ( '=' ) ) {
180
- return assign (
181
- result ( assignList ) ,
182
- this . next ( ) . read_expr ( ) ,
183
- '='
184
- ) ;
185
- } else {
186
- // fallback : list($a, $b);
187
- return result ( assignList ) ;
188
- }
189
185
} else {
186
+ // fallback : list($a, $b);
190
187
return result ( assignList ) ;
191
188
}
189
+ } else {
190
+ return result ( assignList ) ;
191
+ }
192
+ }
192
193
193
- case this . tok . T_CLONE :
194
- return this . node ( 'clone' ) (
195
- this . next ( ) . read_expr ( )
196
- ) ;
194
+ if ( this . token === this . tok . T_CLONE )
195
+ return this . node ( 'clone' ) (
196
+ this . next ( ) . read_expr ( )
197
+ ) ;
198
+
199
+ switch ( this . token ) {
197
200
198
201
case this . tok . T_INC :
199
- var name = this . next ( ) . read_variable ( false , false , false ) ;
200
- return [ 'set' , name , [ 'bin' , '+' , name , [ 'number' , 1 ] ] ] ;
202
+ return this . node ( 'pre' ) (
203
+ '+' , this . next ( ) . read_variable ( false , false , false )
204
+ ) ;
201
205
202
206
case this . tok . T_DEC :
203
- var name = this . next ( ) . read_variable ( false , false , false ) ;
204
- return [ 'set' , name , [ 'bin' , '-' , name , [ 'number' , 1 ] ] ] ;
207
+ return this . node ( 'pre' ) (
208
+ '-' , this . next ( ) . read_variable ( false , false , false )
209
+ ) ;
205
210
206
211
case this . tok . T_NEW :
207
212
return this . next ( ) . read_new_expr ( ) ;
@@ -351,38 +356,49 @@ module.exports = {
351
356
352
357
// operations :
353
358
case this . tok . T_PLUS_EQUAL :
354
- return [ 'set' , expr , [ 'bin' , '+' , expr , this . next ( ) . read_expr ( ) ] ] ;
359
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '+=' ) ;
360
+
355
361
case this . tok . T_MINUS_EQUAL :
356
- return [ 'set' , expr , [ 'bin' , '-' , expr , this . next ( ) . read_expr ( ) ] ] ;
362
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '-=' ) ;
363
+
357
364
case this . tok . T_MUL_EQUAL :
358
- return [ 'set' , expr , [ 'bin' , '*' , expr , this . next ( ) . read_expr ( ) ] ] ;
365
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '*=' ) ;
366
+
359
367
case this . tok . T_POW_EQUAL :
360
- return [ 'set' , expr , [ 'bin' , '**' , expr , this . next ( ) . read_expr ( ) ] ] ;
368
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '**=' ) ;
369
+
361
370
case this . tok . T_DIV_EQUAL :
362
- return [ 'set' , expr , [ 'bin' , '/' , expr , this . next ( ) . read_expr ( ) ] ] ;
371
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '/=' ) ;
372
+
363
373
case this . tok . T_CONCAT_EQUAL :
364
- // NB : convert as string and add
365
- return [ 'set' , expr , [ 'bin' , '.' , expr , this . next ( ) . read_expr ( ) ] ] ;
374
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '.=' ) ;
375
+
366
376
case this . tok . T_MOD_EQUAL :
367
- return [ 'set' , expr , [ 'bin' , '%' , expr , this . next ( ) . read_expr ( ) ] ] ;
377
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '%=' ) ;
378
+
368
379
case this . tok . T_AND_EQUAL :
369
- return [ 'set' , expr , [ 'bin' , '&' , expr , this . next ( ) . read_expr ( ) ] ] ;
380
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '&=' ) ;
381
+
370
382
case this . tok . T_OR_EQUAL :
371
- return [ 'set' , expr , [ 'bin' , '|' , expr , this . next ( ) . read_expr ( ) ] ] ;
383
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '|=' ) ;
384
+
372
385
case this . tok . T_XOR_EQUAL :
373
- return [ 'set' , expr , [ 'bin' , '^' , expr , this . next ( ) . read_expr ( ) ] ] ;
386
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '^=' ) ;
387
+
374
388
case this . tok . T_SL_EQUAL :
375
- return [ 'set' , expr , [ 'bin' , '<<' , expr , this . next ( ) . read_expr ( ) ] ] ;
389
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '<<=' ) ;
390
+
376
391
case this . tok . T_SR_EQUAL :
377
- return [ 'set' , expr , [ 'bin' , '>>' , expr , this . next ( ) . read_expr ( ) ] ] ;
392
+ return this . node ( 'assign' ) ( expr , this . next ( ) . read_expr ( ) , '>>=' ) ;
393
+
378
394
case this . tok . T_INC :
379
395
var result = this . node ( 'post' ) ;
380
396
this . next ( ) ;
381
397
return result ( '+' , expr ) ;
382
398
case this . tok . T_DEC :
383
399
var result = this . node ( 'post' ) ;
384
400
this . next ( ) ;
385
- return result ( '+ ' , expr ) ;
401
+ return result ( '- ' , expr ) ;
386
402
}
387
403
} else if ( this . is ( 'SCALAR' ) ) {
388
404
expr = this . read_scalar ( ) ;
0 commit comments