Tree* parse_enclosed_expr(Parser& p, Token_kind open_tok, Token_kind close_tok) { if (const Token* k = parse::accept(p, open_tok)) { if (Tree_seq* ts = parse_elem_list(p, close_tok)) { if (parse::expect(p, close_tok)) return new T(k, ts); } else { // TODO: expected after the open_token parse::parse_error(p) << "expected 'elem-list'"; } } return nullptr; }
// Parse the schema of a table // // schema-expr ::= [x1:T1,...,xn:Tn] Tree_seq* parse_schema_expr(Parser& p) { if(parse::accept(p, lbracket_tok)) { if(Tree_seq* schema = parse_elem_list(p, rbracket_tok)) { if(parse::accept(p, rbracket_tok)) return schema; else parse::parse_error(p) << "Expected ']' after schema definition"; } } else parse::parse_error(p) << "Expected '[' after 'table'"; return nullptr; }