mirror of
https://github.com/Noratrieb/riverdelta.git
synced 2026-01-15 00:45:04 +01:00
Add assignments
This commit is contained in:
parent
6d2a2fe474
commit
0bf9aed35e
6 changed files with 113 additions and 32 deletions
|
|
@ -174,13 +174,15 @@ function parseFunctionSig(t: Token[]): [Token[], FunctionSig] {
|
|||
|
||||
function parseExpr(t: Token[]): [Token[], Expr] {
|
||||
/*
|
||||
EXPR = COMPARISON
|
||||
EXPR = ASSIGNMENT
|
||||
|
||||
LET = "let" NAME { ":" TYPE } "=" EXPR "in" EXPR
|
||||
IF = "if" EXPR "then" EXPR { "else" EXPR }
|
||||
LOOP = "loop" EXPR
|
||||
BREAK = "break"
|
||||
|
||||
ASSIGNMENT = COMPARISON { "=" ASSIGNMENT }
|
||||
|
||||
// The precende here is pretty arbitrary since we forbid mixing of operators
|
||||
// with different precedence classes anyways.
|
||||
COMPARISON = LOGICAL { ( ">" | "<" | "==" | "<=" | ">=" | "!=" ) COMPARISON }
|
||||
|
|
@ -199,12 +201,17 @@ function parseExpr(t: Token[]): [Token[], Expr] {
|
|||
STRUCT_INIT = "{" { NAME ":" EXPR } { "," NAME ":" EXPR } { "," } "}"
|
||||
EXPR_LIST = { EXPR { "," EXPR } { "," } }
|
||||
*/
|
||||
return parseExprComparison(t);
|
||||
return parseExprAssignment(t);
|
||||
}
|
||||
|
||||
function mkBinaryExpr(lhs: Expr, rhs: Expr, span: Span, kind: string): Expr {
|
||||
return { kind: "binary", binaryKind: kind as BinaryKind, lhs, rhs, span };
|
||||
}
|
||||
|
||||
function mkParserExprBinary(
|
||||
lower: Parser<Expr>,
|
||||
kinds: string[]
|
||||
kinds: string[],
|
||||
mkExpr = mkBinaryExpr
|
||||
): Parser<Expr> {
|
||||
function parser(t: Token[]): [Token[], Expr] {
|
||||
let lhs;
|
||||
|
|
@ -216,10 +223,7 @@ function mkParserExprBinary(
|
|||
let rhs;
|
||||
[t, rhs] = parser(t);
|
||||
const span = spanMerge(lhs.span, rhs.span);
|
||||
return [
|
||||
t,
|
||||
{ kind: "binary", binaryKind: peek.kind as BinaryKind, lhs, rhs, span },
|
||||
];
|
||||
return [t, mkExpr(lhs, rhs, span, peek.kind)];
|
||||
}
|
||||
|
||||
return [t, lhs];
|
||||
|
|
@ -245,6 +249,12 @@ const parseExprComparison = mkParserExprBinary(
|
|||
COMPARISON_KINDS
|
||||
);
|
||||
|
||||
const parseExprAssignment = mkParserExprBinary(
|
||||
parseExprComparison,
|
||||
["="],
|
||||
(lhs, rhs, span) => ({ kind: "assign", lhs, rhs, span })
|
||||
);
|
||||
|
||||
function parseExprUnary(t: Token[]): [Token[], Expr] {
|
||||
const [, peak] = next(t);
|
||||
if (peak.kind in UNARY_KINDS) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue