@fink/larix
Version:
A parser for generating fink's AST.
42 lines • 1.52 kB
JavaScript
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);
};