void parse_table::for_each(buffer<transition> & ts, std::function<void(unsigned, transition const *, list<accepting> const &)> const & fn) const { if (!is_nil(m_ptr->m_accept)) fn(ts.size(), ts.data(), m_ptr->m_accept); m_ptr->m_children.for_each([&](name const & k, list<pair<action, parse_table>> const & lst) { for (auto const & p : lst) { ts.push_back(transition(k, p.first)); p.second.for_each(ts, fn); ts.pop_back(); } }); }
static action parse_action(parser & p, name const & prev_token, unsigned default_prec, buffer<expr> & locals, buffer<token_entry> & new_tokens, notation_entry_group grp) { if (p.curr_is_token(get_colon_tk())) { p.next(); if (p.curr_is_numeral() || p.curr_is_token_or_id(get_max_tk())) { unsigned prec = parse_precedence(p); return mk_expr_action(prec); } else if (p.curr_is_token_or_id(get_prev_tk())) { p.next(); return mk_expr_action(get_precedence(p.env(), new_tokens, prev_token)); } else if (p.curr_is_token_or_id(get_scoped_tk())) { p.next(); return mk_scoped_expr_action(mk_var(0)); } else { p.check_token_next(get_lparen_tk(), "invalid notation declaration, '(', numeral or 'scoped' expected"); if (p.curr_is_token_or_id(get_foldl_tk()) || p.curr_is_token_or_id(get_foldr_tk())) { bool is_fold_right = p.curr_is_token_or_id(get_foldr_tk()); p.next(); auto prec = parse_optional_precedence(p); name sep = parse_quoted_symbol_or_token(p, new_tokens, grp); expr rec; { parser::local_scope scope(p); p.check_token_next(get_lparen_tk(), "invalid fold notation argument, '(' expected"); parse_notation_local(p, locals); parse_notation_local(p, locals); p.check_token_next(get_comma_tk(), "invalid fold notation argument, ',' expected"); rec = parse_notation_expr(p, locals); p.check_token_next(get_rparen_tk(), "invalid fold notation argument, ')' expected"); locals.pop_back(); locals.pop_back(); } optional<expr> ini; if (!p.curr_is_token(get_rparen_tk()) && !p.curr_is_quoted_symbol()) ini = parse_notation_expr(p, locals); optional<name> terminator; if (!p.curr_is_token(get_rparen_tk())) terminator = parse_quoted_symbol_or_token(p, new_tokens, grp); p.check_token_next(get_rparen_tk(), "invalid fold notation argument, ')' expected"); return mk_exprs_action(sep, rec, ini, terminator, is_fold_right, prec ? *prec : 0); } else if (p.curr_is_token_or_id(get_scoped_tk())) { p.next(); auto prec = parse_optional_precedence(p); expr rec; { parser::local_scope scope(p); parse_notation_local(p, locals); p.check_token_next(get_comma_tk(), "invalid scoped notation argument, ',' expected"); rec = parse_notation_expr(p, locals); locals.pop_back(); } p.check_token_next(get_rparen_tk(), "invalid scoped notation argument, ')' expected"); return mk_scoped_expr_action(rec, prec ? *prec : 0); } else { throw parser_error("invalid notation declaration, 'foldl', 'foldr' or 'scoped' expected", p.pos()); } } } else { return mk_expr_action(default_prec); } }