UNPKG

@fink/larix

Version:

A parser for generating fink's AST.

109 lines (98 loc) 2.47 kB
import { _in_ } from "@fink/js-interop/runtime.js"; import { advance, has_errors } from "@fink/prattler/parser.js"; import { add_operator } from "@fink/prattler/expressions.js"; import { add_error } from "@fink/prattler/errors.js"; import { keywords } from "../../lexer/tokens.js"; import { infix } from "../expressions.js"; import { single_expression } from "../block/expr.js"; import { identifier } from "../identifier/init.js"; import { maybe_call_expr } from "../call/expr.js"; export 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); } }; export 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); } } } } }); export const add_prop_access = ctx => { let ˆpipe_result_9 = ctx; return ˆpipe_result_9 = add_operator(prop_access(`.`, `member`))(ˆpipe_result_9); };