UNPKG

@fink/larix

Version:

A parser for generating fink's AST.

145 lines (120 loc) 2.64 kB
const { _in_ } = require("@fink/js-interop/runtime.js"); const { advance, has_errors } = require("@fink/prattler/parser.js"); const { add_operator } = require("@fink/prattler/expressions.js"); const { add_error } = require("@fink/prattler/errors.js"); const { keywords } = require("../../lexer/tokens.js"); const { infix } = require("../expressions.js"); const { single_expression } = require("../block/expr.js"); const { identifier } = require("../identifier/init.js"); const { maybe_call_expr } = require("../call/expr.js"); const member_expr = (ctx, lbp) => { const ˆvalue_1 = ctx.next_token; /* istanbul ignore else */ if (ˆvalue_1 != null) { const { type: ˆp_3 } = ˆvalue_1; /* istanbul ignore else */ if (ˆp_3 === `str-start`) { return single_expression(ctx, lbp); } } /* istanbul ignore else */ if (ˆvalue_1 != null) { const { type: ˆp_4 } = ˆvalue_1; /* istanbul ignore else */ if (ˆp_4 === `(`) { return single_expression({ ...ctx, group_call: false }, lbp); } } /* istanbul ignore else */ if (ˆvalue_1 != null) { const { type: ˆp_5 } = ˆvalue_1; /* istanbul ignore else */ if (ˆp_5 === `ident`) { return identifier(advance(ctx)); } } /* istanbul ignore else */ if (ˆvalue_1 != null) { const { type: ˆp_6 } = ˆvalue_1; /* istanbul ignore else */ if (_in_(ˆp_6, keywords)) { return identifier(advance(ctx)); } } { return add_error(ctx, `Expected member key to be an ident, string or group expr.`, ctx.next_token); } }; exports.member_expr = member_expr; const prop_access = (op, type) => ({ ...infix(op), led: lbp => (ctx, left) => { const { loc: { start } } = left; const [right, next_ctx] = member_expr(ctx, lbp); { const ˆvalue_7 = next_ctx; /* istanbul ignore else */ if (has_errors(ˆvalue_7)) { return [left, next_ctx]; } { { const { loc: { end } } = right; const expr = { type, op, left, right, loc: { start, end } }; return maybe_call_expr(expr, next_ctx); } } } } }); exports.prop_access = prop_access; const add_prop_access = ctx => { let ˆpipe_result_9 = ctx; return ˆpipe_result_9 = add_operator(prop_access(`.`, `member`))(ˆpipe_result_9); }; exports.add_prop_access = add_prop_access;