@@ -112,6 +112,7 @@ function parser() {
112
112
, tokens = [ ]
113
113
, whitespace = [ ]
114
114
, errored = false
115
+ , program
115
116
, token
116
117
, node
117
118
@@ -132,14 +133,17 @@ function parser() {
132
133
node . expecting = '(eof)'
133
134
node . mode = STMTLIST
134
135
node . token = { type : '(program)' , data : '(program)' }
136
+ program = node
135
137
138
+ stream . program = program
136
139
state . unshift ( node )
137
140
return stream
138
141
139
142
// stream functions ---------------------------------------------
140
143
141
144
function write ( input ) {
142
145
if ( input . type === 'whitespace' || input . type === 'line-comment' || input . type === 'block-comment' ) {
146
+
143
147
whitespace . push ( input )
144
148
return
145
149
}
@@ -148,7 +152,8 @@ function parser() {
148
152
149
153
if ( token && whitespace . length ) {
150
154
token . preceding = token . preceding || [ ]
151
- token . preceding . concat ( whitespace . splice ( 0 , whitespace . length ) )
155
+ token . preceding = token . preceding . concat ( whitespace )
156
+ whitespace = [ ]
152
157
}
153
158
154
159
while ( take ( ) ) switch ( state [ 0 ] . mode ) {
@@ -182,16 +187,19 @@ function parser() {
182
187
return
183
188
}
184
189
190
+ stream . emit ( 'end' )
185
191
stream . readable = false
186
192
stream . closed = true
187
193
stream . emit ( 'close' )
188
194
}
189
195
190
196
191
197
function destroy ( ) {
192
- this . write = function ( ) { }
193
- this . writable = false
194
- this . emit ( 'close' )
198
+ stream . emit ( 'end' )
199
+
200
+ stream . write = function ( ) { }
201
+ stream . writable = false
202
+ stream . emit ( 'close' )
195
203
}
196
204
197
205
function take ( ) {
@@ -220,10 +228,10 @@ function parser() {
220
228
for ( var i = 0 , len = this . length - 1 ; i < len ; ++ i ) {
221
229
pad += ' |'
222
230
}
223
- console . log ( pad , '\\' + _node . type )
231
+ console . log ( pad , '\\' + _node . type , _node . token . data )
224
232
}
225
233
226
- if ( add_child ) node . children . push ( _node )
234
+ if ( add_child && node !== _node ) node . children . push ( _node )
227
235
node = _node
228
236
229
237
return ret
@@ -426,8 +434,6 @@ function parser() {
426
434
427
435
tokens . shift ( )
428
436
429
- // push old child back onto stack without emitting it.
430
-
431
437
state . unshift ( expr ( ',' , ';' ) )
432
438
return
433
439
}
@@ -464,6 +470,7 @@ function parser() {
464
470
return unexpected ( 'expected user-defined name, got ' + token . data )
465
471
}
466
472
473
+ state [ 0 ] . data = token . data
467
474
return state . shift ( ) , tokens . shift ( )
468
475
}
469
476
@@ -589,7 +596,20 @@ function parser() {
589
596
}
590
597
591
598
function advance ( op , t ) {
592
- return function ( ) { return assert ( t || 'operator' , op ) && ( tokens . shift ( ) , Advance ) }
599
+ t = t || 'operator'
600
+ return function ( ) {
601
+ if ( ! assert ( t , op ) ) return
602
+
603
+ var last = tokens . shift ( )
604
+ , children = state [ 0 ] . children
605
+ , last_node = children [ children . length - 1 ]
606
+
607
+ if ( last_node && last_node . token && last . preceding ) {
608
+ last_node . token . succeeding = last_node . token . succeeding || [ ]
609
+ last_node . token . succeeding = last_node . token . succeeding . concat ( last . preceding )
610
+ }
611
+ return Advance
612
+ }
593
613
}
594
614
595
615
function advance_expr ( until ) {
@@ -638,7 +658,11 @@ function parser() {
638
658
, advance_ident ( true )
639
659
, advance ( '{' )
640
660
, function ( ) {
641
- if ( token . data === '}' ) { popstmt ( ) ( ) , tokens . shift ( ) ; return }
661
+ if ( token . data === '}' ) {
662
+ state [ 0 ] . token . succeeding = token . preceding
663
+ popstmt ( ) ( ) , tokens . shift ( ) ;
664
+ return
665
+ }
642
666
if ( token . data === ';' ) { tokens . shift ( ) ; return }
643
667
state . unshift ( decl ( NO_ASSIGN_ALLOWED ) )
644
668
}
@@ -754,7 +778,7 @@ function parser() {
754
778
, advance ( '{' )
755
779
, advance_stmtlist ( )
756
780
, advance ( '}' )
757
- , popstmt ( )
781
+ , function ( ) { return state . shift ( ) , state . shift ( ) , state . shift ( ) }
758
782
)
759
783
760
784
parse_function_args =
0 commit comments