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