// Unary operators: !, -, +
const unaryOp = token(or(string("!"), string("-"), string("+")));
const unaryExpression: Parser<Expression> = or(
parser(function* () {
const op = yield* unaryOp;
const arg = yield* unaryExpression;
return { type: "unary" as const, op, arg };
}),
postfixExpression
);
// Binary operators
const binaryOp = token(
or(
string("==="), string("!=="), string("=="), string("!="),
string("<="), string(">="), string("<"), string(">"),
string("&&"), string("||"),
string("+"), string("-"), string("*"), string("/"), string("%")
)
);
const binaryExpression: Parser<Expression> = parser(function* () {
const left = yield* unaryExpression;
const rest = yield* optional(
parser(function* () {
const op = yield* binaryOp;
const right = yield* binaryExpression;
return { op, right };
})
);
if (rest) {
return { type: "binary" as const, left, op: rest.op, right: rest.right };
}
return left;
});
expression = binaryExpression;