mirror of
https://git.sfja.dk/Mikkel/slige.git
synced 2025-01-18 12:46:31 +00:00
source map else
This commit is contained in:
parent
e581c245bd
commit
f90fcd431f
@ -45,7 +45,7 @@ export type ExprKind =
|
|||||||
| { type: "call"; subject: Expr; args: Expr[] }
|
| { type: "call"; subject: Expr; args: Expr[] }
|
||||||
| { type: "unary"; unaryType: UnaryType; subject: Expr }
|
| { type: "unary"; unaryType: UnaryType; subject: Expr }
|
||||||
| { type: "binary"; binaryType: BinaryType; left: Expr; right: Expr }
|
| { type: "binary"; binaryType: BinaryType; left: Expr; right: Expr }
|
||||||
| { type: "if"; cond: Expr; truthy: Expr; falsy?: Expr }
|
| { type: "if"; cond: Expr; truthy: Expr; falsy?: Expr; elsePos?: Pos }
|
||||||
| { type: "bool"; value: boolean }
|
| { type: "bool"; value: boolean }
|
||||||
| { type: "null" }
|
| { type: "null" }
|
||||||
| { type: "loop"; body: Expr }
|
| { type: "loop"; body: Expr }
|
||||||
|
@ -47,7 +47,7 @@ export class Compiler {
|
|||||||
|
|
||||||
const lowerer = new Lowerer(lexer.currentPos());
|
const lowerer = new Lowerer(lexer.currentPos());
|
||||||
lowerer.lower(ast);
|
lowerer.lower(ast);
|
||||||
lowerer.printProgram();
|
// lowerer.printProgram();
|
||||||
const { program, fnNames } = lowerer.finish();
|
const { program, fnNames } = lowerer.finish();
|
||||||
|
|
||||||
return { program, fnNames };
|
return { program, fnNames };
|
||||||
|
@ -490,7 +490,7 @@ export class Lowerer {
|
|||||||
this.program.setLabel(falseLabel);
|
this.program.setLabel(falseLabel);
|
||||||
|
|
||||||
if (expr.kind.falsy) {
|
if (expr.kind.falsy) {
|
||||||
this.addSourceMap(expr.kind.falsy.pos);
|
this.addSourceMap(expr.kind.elsePos!);
|
||||||
this.lowerExpr(expr.kind.falsy);
|
this.lowerExpr(expr.kind.falsy);
|
||||||
} else {
|
} else {
|
||||||
this.program.add(Ops.PushNull);
|
this.program.add(Ops.PushNull);
|
||||||
|
@ -456,17 +456,18 @@ export class Parser {
|
|||||||
if (!this.test("else")) {
|
if (!this.test("else")) {
|
||||||
return this.expr({ type: "if", cond, truthy }, pos);
|
return this.expr({ type: "if", cond, truthy }, pos);
|
||||||
}
|
}
|
||||||
|
const elsePos = this.pos();
|
||||||
this.step();
|
this.step();
|
||||||
if (this.test("if")) {
|
if (this.test("if")) {
|
||||||
const falsy = this.parseIf();
|
const falsy = this.parseIf();
|
||||||
return this.expr({ type: "if", cond, truthy, falsy }, pos);
|
return this.expr({ type: "if", cond, truthy, falsy, elsePos }, pos);
|
||||||
}
|
}
|
||||||
if (!this.test("{")) {
|
if (!this.test("{")) {
|
||||||
this.report("expected block");
|
this.report("expected block");
|
||||||
return this.expr({ type: "error" }, pos);
|
return this.expr({ type: "error" }, pos);
|
||||||
}
|
}
|
||||||
const falsy = this.parseBlock();
|
const falsy = this.parseBlock();
|
||||||
return this.expr({ type: "if", cond, truthy, falsy }, pos);
|
return this.expr({ type: "if", cond, truthy, falsy, elsePos }, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
private parseBinary(): Expr {
|
private parseBinary(): Expr {
|
||||||
|
Loading…
Reference in New Issue
Block a user