()
| 79762 | } |
| 79763 | |
| 79764 | function parse_stmt() { |
| 79765 | if(state[0].brace) { |
| 79766 | if(token.data !== '}') { |
| 79767 | return unexpected('expected `}`, got '+token.data) |
| 79768 | } |
| 79769 | state[0].brace = false |
| 79770 | return tokens.shift(), state.shift() |
| 79771 | } |
| 79772 | switch(token.type) { |
| 79773 | case 'eof': return state.shift() |
| 79774 | case 'keyword': |
| 79775 | switch(token.data) { |
| 79776 | case 'for': return state.unshift(forstmt()); |
| 79777 | case 'if': return state.unshift(ifstmt()); |
| 79778 | case 'while': return state.unshift(whilestmt()); |
| 79779 | case 'do': return state.unshift(dowhilestmt()); |
| 79780 | case 'break': return state.fake(mknode(BREAK, token)), tokens.shift() |
| 79781 | case 'continue': return state.fake(mknode(CONTINUE, token)), tokens.shift() |
| 79782 | case 'discard': return state.fake(mknode(DISCARD, token)), tokens.shift() |
| 79783 | case 'return': return state.unshift(returnstmt()); |
| 79784 | case 'precision': return state.unshift(precision()); |
| 79785 | } |
| 79786 | return state.unshift(decl(DECL_STATEMENT)) |
| 79787 | case 'ident': |
| 79788 | var lookup |
| 79789 | if(lookup = state.scope.find(token.data)) { |
| 79790 | if(lookup.parent.type === 'struct') { |
| 79791 | // this is strictly untrue, you could have an |
| 79792 | // expr that starts with a struct constructor. |
| 79793 | // ... sigh |
| 79794 | return state.unshift(decl(DECL_STATEMENT)) |
| 79795 | } |
| 79796 | return state.unshift(expr(';')) |
| 79797 | } |
| 79798 | case 'operator': |
| 79799 | if(token.data === '{') { |
| 79800 | state[0].brace = true |
| 79801 | var n = stmtlist() |
| 79802 | n.expecting = '}' |
| 79803 | return tokens.shift(), state.unshift(n) |
| 79804 | } |
| 79805 | if(token.data === ';') { |
| 79806 | return tokens.shift(), state.shift() |
| 79807 | } |
| 79808 | default: return state.unshift(expr(';')) |
| 79809 | } |
| 79810 | } |
| 79811 | |
| 79812 | function parse_decl() { |
| 79813 | var stmt = state[0] |
no test coverage detected