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