This commit is contained in:
parent
5af5bfed7f
commit
c8aa3e7c1c
@ -2,17 +2,17 @@ import * as ast from "../ast.ts";
|
|||||||
import { FileReporter, Loc } from "../diagnostics.ts";
|
import { FileReporter, Loc } from "../diagnostics.ts";
|
||||||
import { Ty } from "../ty.ts";
|
import { Ty } from "../ty.ts";
|
||||||
import { builtins } from "./builtins.ts";
|
import { builtins } from "./builtins.ts";
|
||||||
import { ResolveMap } from "./resolve.ts";
|
import { Syms } from "./resolve.ts";
|
||||||
|
|
||||||
export class Tys {
|
export class Tys {
|
||||||
private nodeTys = new Map<number, Ty>();
|
private nodeTys = new Map<number, Ty>();
|
||||||
private checker: Checker;
|
private checker: Checker;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private resols: ResolveMap,
|
private syms: Syms,
|
||||||
private reporter: FileReporter,
|
private reporter: FileReporter,
|
||||||
) {
|
) {
|
||||||
this.checker = new Checker(this, this.resols, this.reporter);
|
this.checker = new Checker(this, this.syms, this.reporter);
|
||||||
}
|
}
|
||||||
|
|
||||||
expr(node: ast.Node): Ty {
|
expr(node: ast.Node): Ty {
|
||||||
@ -28,7 +28,7 @@ export class Tys {
|
|||||||
class Checker {
|
class Checker {
|
||||||
constructor(
|
constructor(
|
||||||
private tys: Tys,
|
private tys: Tys,
|
||||||
private resols: ResolveMap,
|
private syms: Syms,
|
||||||
private reporter: FileReporter,
|
private reporter: FileReporter,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ class Checker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node.is("Param")) {
|
if (node.is("Param")) {
|
||||||
const sym = this.resols.get(node);
|
const sym = this.syms.get(node);
|
||||||
|
|
||||||
if (sym.tag === "Let") {
|
if (sym.tag === "Let") {
|
||||||
const exprTy = this.tys.expr(sym.stmt.kind.expr);
|
const exprTy = this.tys.expr(sym.stmt.kind.expr);
|
||||||
@ -66,7 +66,7 @@ class Checker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node.is("IdentExpr")) {
|
if (node.is("IdentExpr")) {
|
||||||
const sym = this.resols.get(node);
|
const sym = this.syms.get(node);
|
||||||
if (sym.tag === "Fn") {
|
if (sym.tag === "Fn") {
|
||||||
return this.tys.expr(sym.stmt);
|
return this.tys.expr(sym.stmt);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import * as ast from "../ast.ts";
|
|||||||
import { FileReporter } from "../diagnostics.ts";
|
import { FileReporter } from "../diagnostics.ts";
|
||||||
import { builtins } from "./builtins.ts";
|
import { builtins } from "./builtins.ts";
|
||||||
|
|
||||||
export class ResolveMap {
|
export class Syms {
|
||||||
constructor(
|
constructor(
|
||||||
private resols: Map<number, Sym>,
|
private resols: Map<number, Sym>,
|
||||||
) {}
|
) {}
|
||||||
@ -35,7 +35,7 @@ export type Sym =
|
|||||||
export function resolve(
|
export function resolve(
|
||||||
file: ast.Node,
|
file: ast.Node,
|
||||||
reporter: FileReporter,
|
reporter: FileReporter,
|
||||||
): ResolveMap {
|
): Syms {
|
||||||
let syms = ResolverSyms.root();
|
let syms = ResolverSyms.root();
|
||||||
const resols = new Map<number, Sym>();
|
const resols = new Map<number, Sym>();
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ export function resolve(
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return new ResolveMap(resols);
|
return new Syms(resols);
|
||||||
}
|
}
|
||||||
|
|
||||||
class ResolverSyms {
|
class ResolverSyms {
|
||||||
|
|||||||
@ -12,8 +12,8 @@ const text = await Deno.readTextFile(filename);
|
|||||||
const fileRep = reporter.ofFile({ filename, text });
|
const fileRep = reporter.ofFile({ filename, text });
|
||||||
|
|
||||||
const fileAst = front.parse(text, fileRep);
|
const fileAst = front.parse(text, fileRep);
|
||||||
const resols = front.resolve(fileAst, fileRep);
|
const syms = front.resolve(fileAst, fileRep);
|
||||||
const tys = new front.Tys(resols, fileRep);
|
const tys = new front.Tys(syms, fileRep);
|
||||||
|
|
||||||
let mainFn: ast.NodeWithKind<"FnStmt"> | null = null;
|
let mainFn: ast.NodeWithKind<"FnStmt"> | null = null;
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ if (!mainFn) {
|
|||||||
Deno.exit(1);
|
Deno.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const m = new middle.MiddleLowerer(resols, tys);
|
const m = new middle.MiddleLowerer(syms, tys);
|
||||||
const mainMiddleFn = m.lowerFn(mainFn);
|
const mainMiddleFn = m.lowerFn(mainFn);
|
||||||
|
|
||||||
if (!Deno.args.includes("--test")) {
|
if (!Deno.args.includes("--test")) {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import * as ast from "./ast.ts";
|
import * as ast from "./ast.ts";
|
||||||
import { ResolveMap, Tys } from "./front/mod.ts";
|
import { Syms, Tys } from "./front/mod.ts";
|
||||||
import { Ty } from "./ty.ts";
|
import { Ty } from "./ty.ts";
|
||||||
import { BasicBlock, BinaryOp, Fn, Inst, InstKind } from "./mir.ts";
|
import { BasicBlock, BinaryOp, Fn, Inst, InstKind } from "./mir.ts";
|
||||||
|
|
||||||
@ -7,7 +7,7 @@ export class MiddleLowerer {
|
|||||||
private fns = new Map<number, Fn>();
|
private fns = new Map<number, Fn>();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private resols: ResolveMap,
|
private resols: Syms,
|
||||||
private tys: Tys,
|
private tys: Tys,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ class FnLowerer {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private lowerer: MiddleLowerer,
|
private lowerer: MiddleLowerer,
|
||||||
private resols: ResolveMap,
|
private resols: Syms,
|
||||||
private tys: Tys,
|
private tys: Tys,
|
||||||
private stmt: ast.FnStmt,
|
private stmt: ast.FnStmt,
|
||||||
) {}
|
) {}
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
|
|
||||||
fn main()
|
fn main()
|
||||||
{
|
{
|
||||||
let array: [int; 3] = [1, 2, false];
|
let array: [int; 3] = [1, 2, 3];
|
||||||
|
|
||||||
// let a = 4;
|
let a = 4;
|
||||||
// let b = a;
|
let b = a;
|
||||||
// array[0] = a;
|
array[0] = a;
|
||||||
// print_int(array[0]);
|
print_int(array[0]);
|
||||||
|
|
||||||
// let elem: int = array[0];
|
// let elem: int = array[0];
|
||||||
// // e xpect: 1
|
// // e xpect: 1
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user