()
| 33077 | } |
| 33078 | |
| 33079 | function parse_stmt() { |
| 33080 | if(state[0].brace) { |
| 33081 | if(token.data !== '}') { |
| 33082 | return unexpected('expected `}`, got '+token.data) |
| 33083 | } |
| 33084 | state[0].brace = false |
| 33085 | return tokens.shift(), state.shift() |
| 33086 | } |
| 33087 | switch(token.type) { |
| 33088 | case 'eof': return state.shift() |
| 33089 | case 'keyword': |
| 33090 | switch(token.data) { |
| 33091 | case 'for': return state.unshift(forstmt()); |
| 33092 | case 'if': return state.unshift(ifstmt()); |
| 33093 | case 'while': return state.unshift(whilestmt()); |
| 33094 | case 'do': return state.unshift(dowhilestmt()); |
| 33095 | case 'break': return state.fake(mknode(BREAK, token)), tokens.shift() |
| 33096 | case 'continue': return state.fake(mknode(CONTINUE, token)), tokens.shift() |
| 33097 | case 'discard': return state.fake(mknode(DISCARD, token)), tokens.shift() |
| 33098 | case 'return': return state.unshift(returnstmt()); |
| 33099 | case 'precision': return state.unshift(precision()); |
| 33100 | } |
| 33101 | return state.unshift(decl(DECL_STATEMENT)) |
| 33102 | case 'ident': |
| 33103 | var lookup |
| 33104 | if(lookup = state.scope.find(token.data)) { |
| 33105 | if(lookup.parent.type === 'struct') { |
| 33106 | // this is strictly untrue, you could have an |
| 33107 | // expr that starts with a struct constructor. |
| 33108 | // ... sigh |
| 33109 | return state.unshift(decl(DECL_STATEMENT)) |
| 33110 | } |
| 33111 | return state.unshift(expr(';')) |
| 33112 | } |
| 33113 | case 'operator': |
| 33114 | if(token.data === '{') { |
| 33115 | state[0].brace = true |
| 33116 | var n = stmtlist() |
| 33117 | n.expecting = '}' |
| 33118 | return tokens.shift(), state.unshift(n) |
| 33119 | } |
| 33120 | if(token.data === ';') { |
| 33121 | return tokens.shift(), state.shift() |
| 33122 | } |
| 33123 | default: return state.unshift(expr(';')) |
| 33124 | } |
| 33125 | } |
| 33126 | |
| 33127 | function parse_decl() { |
| 33128 | var stmt = state[0] |
no test coverage detected