(input)
| 220 | } |
| 221 | |
| 222 | function parse(input) { |
| 223 | return parse_toplevel(); |
| 224 | function is_punc(ch) { |
| 225 | var tok = input.peek(); |
| 226 | return tok && tok.type == "punc" && (!ch || tok.value == ch) && tok; |
| 227 | } |
| 228 | function is_sp(ch) { |
| 229 | var tok = input.peek(); |
| 230 | return tok && tok.type == "sp" && (!ch || tok.value == ch) && tok; |
| 231 | } |
| 232 | function is_kw(kw) { |
| 233 | var tok = input.peek(); |
| 234 | return tok && tok.type == "kw" && (!kw || tok.value == kw) && tok; |
| 235 | } |
| 236 | function is_op(op) { |
| 237 | var tok = input.peek(); |
| 238 | return tok && tok.type == "op" && (!op || tok.value == op) && tok; |
| 239 | } |
| 240 | function is_id() { |
| 241 | var tok = input.peek(); |
| 242 | return tok.type=='id'; |
| 243 | } |
| 244 | function is_num(){ |
| 245 | var tok = input.peek(); |
| 246 | return tok.type=='num'; |
| 247 | } |
| 248 | function is_str(){ |
| 249 | var tok = input.peek(); |
| 250 | return tok.type=='str'; |
| 251 | } |
| 252 | |
| 253 | function skip_punc(ch) { |
| 254 | if (is_punc(ch)) input.next(); |
| 255 | else input.croak("Expecting punctuation: \"" + ch + "\""); |
| 256 | } |
| 257 | function skip_split(ch) { |
| 258 | if (is_sp(ch)) input.next(); |
| 259 | else input.croak("Expecting punctuation: \"" + ch + "\""); |
| 260 | } |
| 261 | function unexpected() { |
| 262 | input.croak("Unexpected token: " + JSON.stringify(input.peek())); |
| 263 | } |
| 264 | function parse_next() { |
| 265 | var n = input.next(); |
| 266 | return n; |
| 267 | } |
| 268 | function parse_toplevel() { |
| 269 | var prog = []; |
| 270 | while (!input.eof()) { |
| 271 | prog.push(parse_statement()); |
| 272 | } |
| 273 | return { type: "top", 'body': prog }; |
| 274 | } |
| 275 | function parse_block() { |
| 276 | var poi={line:input.peek().poi.line,start:input.peek().poi.start} |
| 277 | var body = []; |
| 278 | skip_punc("{"); |
| 279 | while (!is_punc("}")) { |
no test coverage detected