- while(peekToken() != RC)
- if (head == null) head = tail = parseStatement(); else tail = tail.next = parseStatement();
- skipToken();
+ OUTER: while(true) {
+ Expr smt;
+ switch(tok = peekToken()) {
+ case -1: break OUTER;
+ case LC: smt = parseBlock(true); break;
+ case THROW: case RETURN: case ASSERT:
+ smt = new Expr(tok, skipToken().parseExpr());
+ if (getToken() != SEMI) throw new Error("expected ;");
+ break;
+ case GOTO: case BREAK: case CONTINUE:
+ skipToken();
+ if (getToken() == NAME)
+ smt = new Expr(tok, new Expr(string));
+ else if (tok == GOTO)
+ throw new Error("goto must be followed by a label");
+ else
+ smt = new Expr(tok);
+ if (getToken() != SEMI) throw new Error("expected ;");
+ break;
+
+ case RC:
+ if (braced) skipToken();
+ break OUTER;
+
+ case SEMI:
+ skipToken();
+ if (!braced) break OUTER;
+ continue;
+
+ default:
+ smt = parseExpr();
+ if (smt == null) {
+ if (head == null) throw new Error("empty statement list");
+ break OUTER;
+ }
+ break;
+ }
+ if (head == null) head = tail = smt; else tail = (tail.next = smt);
+ }