Skip to content

Commit b2380df

Browse files
do not fail on tokens that cannot be identified by scope
1 parent 6db1008 commit b2380df

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed

lib/expr.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ prefix('!')
8181
prefix('~')
8282
prefix('defined')
8383
prefix('(', function() {
84-
var v = expression(0)
84+
this.type = 'group'
85+
this.children = [expression(0)]
8586
advance(')')
86-
return v
87+
return this
8788
})
8889
prefix('++')
8990
prefix('--')
@@ -148,6 +149,7 @@ function symbol(id, binding_power) {
148149
function expression(rbp) {
149150
var left, t = token
150151
advance()
152+
151153
left = t.nud()
152154
while(rbp < token.lbp) {
153155
t = token
@@ -224,7 +226,7 @@ function advance(id) {
224226
type = next.type
225227

226228
if(type === 'ident') {
227-
output = state.scope.find(value)
229+
output = state.scope.find(value) || state.create_node()
228230
} else if(type === 'builtin') {
229231
output = symbol_table['(builtin)']
230232
} else if(type === 'keyword') {

lib/index.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var Advance = new Object
1717
var DEBUG = false
1818

1919
var _ = 0
20+
, IDENT = _++
2021
, STMT = _++
2122
, STMTLIST = _++
2223
, STRUCT = _++
@@ -33,7 +34,6 @@ var _ = 0
3334
, PREPROCESSOR = _++
3435
, KEYWORD = _++
3536
, KEYWORD_OR_IDENT = _++
36-
, IDENT = _++
3737
, RETURN = _++
3838
, BREAK = _++
3939
, CONTINUE = _++
@@ -54,7 +54,8 @@ var token_map = {
5454

5555
// map of stmt types to human
5656
var stmt_type = _ = [
57-
'stmt'
57+
'ident'
58+
, 'stmt'
5859
, 'stmtlist'
5960
, 'struct'
6061
, 'function'
@@ -70,7 +71,6 @@ var stmt_type = _ = [
7071
, 'preprocessor'
7172
, 'keyword'
7273
, 'keyword_or_ident'
73-
, 'ident'
7474
, 'return'
7575
, 'break'
7676
, 'continue'
@@ -127,6 +127,11 @@ function parser() {
127127
state.fake = special_fake
128128
state.unexpected = unexpected
129129
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+
}
130135

131136
// setup root node
132137
node = stmtlist()
@@ -309,9 +314,9 @@ function parser() {
309314
case 'if': return state.unshift(ifstmt());
310315
case 'while': return state.unshift(whilestmt());
311316
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()
315320
case 'return': return state.unshift(returnstmt());
316321
}
317322
if(token.data === 'struct')
@@ -516,7 +521,7 @@ function parser() {
516521
function n(type) {
517522
// this is a function factory that suffices for most kinds of expressions and statements
518523
return function() {
519-
return mknode(type, token, node)
524+
return mknode(type, token)
520525
}
521526
}
522527

@@ -688,7 +693,7 @@ function parser() {
688693
var lookup
689694
if(token.type === 'ident') {
690695
if(!(lookup = state.scope.find(token.data))) {
691-
return
696+
lookup = state.create_node()
692697
}
693698

694699
if(lookup.parent.type === 'struct') {
@@ -798,11 +803,10 @@ function parser() {
798803
}
799804
}
800805

801-
function mknode(mode, sourcetoken, parent) {
806+
function mknode(mode, sourcetoken) {
802807
return {
803808
mode: mode
804809
, token: sourcetoken
805-
, parent: parent
806810
, children: []
807811
, type: stmt_type[mode]
808812
, id: (Math.random() * 0xFFFFFFFF).toString(16)

lib/scope.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ proto.find = function(name, fail) {
3333
return this.scopes[i][name]
3434
}
3535
}
36-
return (fail === undefined || fail) ? this.state.unexpected(
37-
'attempted to lookup undefined symbol '+name
38-
) : null
36+
37+
return null
3938
}

0 commit comments

Comments
 (0)