@fink/larix
Version:
A parser for generating fink's AST.
72 lines (60 loc) • 1.72 kB
JavaScript
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;