@@ -17,6 +17,7 @@ var Advance = new Object
17
17
var DEBUG = false
18
18
19
19
var _ = 0
20
+ , IDENT = _ ++
20
21
, STMT = _ ++
21
22
, STMTLIST = _ ++
22
23
, STRUCT = _ ++
@@ -33,7 +34,6 @@ var _ = 0
33
34
, PREPROCESSOR = _ ++
34
35
, KEYWORD = _ ++
35
36
, KEYWORD_OR_IDENT = _ ++
36
- , IDENT = _ ++
37
37
, RETURN = _ ++
38
38
, BREAK = _ ++
39
39
, CONTINUE = _ ++
@@ -54,7 +54,8 @@ var token_map = {
54
54
55
55
// map of stmt types to human
56
56
var stmt_type = _ = [
57
- 'stmt'
57
+ 'ident'
58
+ , 'stmt'
58
59
, 'stmtlist'
59
60
, 'struct'
60
61
, 'function'
@@ -70,7 +71,6 @@ var stmt_type = _ = [
70
71
, 'preprocessor'
71
72
, 'keyword'
72
73
, 'keyword_or_ident'
73
- , 'ident'
74
74
, 'return'
75
75
, 'break'
76
76
, 'continue'
@@ -127,6 +127,11 @@ function parser() {
127
127
state . fake = special_fake
128
128
state . unexpected = unexpected
129
129
state . scope = new Scope ( state )
130
+ state . create_node = function ( ) {
131
+ var n = mknode ( IDENT , token )
132
+ n . parent = stream . program
133
+ return n
134
+ }
130
135
131
136
// setup root node
132
137
node = stmtlist ( )
@@ -309,9 +314,9 @@ function parser() {
309
314
case 'if' : return state . unshift ( ifstmt ( ) ) ;
310
315
case 'while' : return state . unshift ( whilestmt ( ) ) ;
311
316
case 'do' : return state . unshift ( dowhilestmt ( ) ) ;
312
- case 'break' : return state . fake ( mknode ( BREAK , token , node ) ) , tokens . shift ( )
313
- case 'continue' : return state . fake ( mknode ( CONTINUE , token , node ) ) , tokens . shift ( )
314
- case 'discard' : return state . fake ( mknode ( DISCARD , token , node ) ) , tokens . shift ( )
317
+ case 'break' : return state . fake ( mknode ( BREAK , token ) ) , tokens . shift ( )
318
+ case 'continue' : return state . fake ( mknode ( CONTINUE , token ) ) , tokens . shift ( )
319
+ case 'discard' : return state . fake ( mknode ( DISCARD , token ) ) , tokens . shift ( )
315
320
case 'return' : return state . unshift ( returnstmt ( ) ) ;
316
321
}
317
322
if ( token . data === 'struct' )
@@ -516,7 +521,7 @@ function parser() {
516
521
function n ( type ) {
517
522
// this is a function factory that suffices for most kinds of expressions and statements
518
523
return function ( ) {
519
- return mknode ( type , token , node )
524
+ return mknode ( type , token )
520
525
}
521
526
}
522
527
@@ -688,7 +693,7 @@ function parser() {
688
693
var lookup
689
694
if ( token . type === 'ident' ) {
690
695
if ( ! ( lookup = state . scope . find ( token . data ) ) ) {
691
- return
696
+ lookup = state . create_node ( )
692
697
}
693
698
694
699
if ( lookup . parent . type === 'struct' ) {
@@ -798,11 +803,10 @@ function parser() {
798
803
}
799
804
}
800
805
801
- function mknode ( mode , sourcetoken , parent ) {
806
+ function mknode ( mode , sourcetoken ) {
802
807
return {
803
808
mode : mode
804
809
, token : sourcetoken
805
- , parent : parent
806
810
, children : [ ]
807
811
, type : stmt_type [ mode ]
808
812
, id : ( Math . random ( ) * 0xFFFFFFFF ) . toString ( 16 )
0 commit comments