UNPKG

@fink/larix

Version:

A parser for generating fink's AST.

72 lines (60 loc) 1.72 kB
const { curr_loc, curr_value } = require("@fink/prattler/parser.js"); const { add_separator, add_operator } = require("@fink/prattler/expressions.js"); const { prefix, terminator } = require("../expressions.js"); const { end_of_block_indent } = require("./indentation.js"); const { expressions, single_expression } = require("./expr.js"); const terminated_block = (ctx, end_symbol, block_expr = single_expression) => expressions({ ...ctx, jsx: false }, end_symbol, block_expr); exports.terminated_block = terminated_block; const indented_block = (ctx, block_expr = single_expression) => terminated_block(ctx, end_of_block_indent, block_expr); exports.indented_block = indented_block; 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]; } }); exports.named_block = named_block; 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); }; exports.add_named_block = add_named_block;