UNPKG

@fink/larix

Version:

A parser for generating fink's AST.

42 lines 1.52 kB
import { curr_loc, curr_value } from "@fink/prattler/parser.js"; import { add_separator, add_operator } from "@fink/prattler/expressions.js"; import { prefix, terminator } from "../expressions.js"; import { end_of_block_indent } from "./indentation.js"; import { expressions, single_expression } from "./expr.js"; export const terminated_block = (ctx, end_symbol, block_expr = single_expression) => expressions({ ...ctx, jsx: false }, end_symbol, block_expr); export const indented_block = (ctx, block_expr = single_expression) => terminated_block(ctx, end_of_block_indent, block_expr); export const named_block = (token_type, expr_type, block_expr) => ({ ...prefix(token_type), nud: () => ctx => { const { start } = curr_loc(ctx); const op = curr_value(ctx); const [{ exprs: args }, body_ctx] = terminated_block(ctx, `:`); const [{ exprs, comments, loc }, next_ctx] = indented_block(body_ctx, block_expr); return [{ type: expr_type, op, args, exprs, comments, loc: { start, end: loc.end } }, next_ctx]; } }); export const add_named_block = (token_type, expr_type = `block`, block_expr = single_expression) => ctx => { let ˆpipe_result_1 = ctx; ˆpipe_result_1 = add_operator(named_block(token_type, expr_type, block_expr))(ˆpipe_result_1); ˆpipe_result_1 = add_separator(terminator(`,`))(ˆpipe_result_1); return ˆpipe_result_1 = add_separator(terminator(`:`))(ˆpipe_result_1); };