add some checker
This commit is contained in:
parent
a431185747
commit
0e46ac7bf5
@ -22,6 +22,8 @@ export type CheckedExpr =
|
||||
} | {
|
||||
exprType: "block";
|
||||
body: CheckedExpr[];
|
||||
value: CheckedExpr | null;
|
||||
valueType: CheckedType;
|
||||
} | {
|
||||
exprType: "call";
|
||||
subject: CheckedExpr;
|
||||
|
22
checker.ts
22
checker.ts
@ -1,7 +1,15 @@
|
||||
import { CheckedExpr, CheckedType } from "./checked.ts";
|
||||
import { ParsedExpr } from "./parsed.ts";
|
||||
import { ParsedExpr as AnyParsedExpr } from "./parsed.ts";
|
||||
import { CompileError, Position } from "./token.ts";
|
||||
|
||||
type ParsedExpr<
|
||||
Type extends AnyParsedExpr["exprType"] = AnyParsedExpr["exprType"],
|
||||
> =
|
||||
& AnyParsedExpr
|
||||
& {
|
||||
exprType: Type;
|
||||
};
|
||||
|
||||
export type SymbolValue = {
|
||||
id: number;
|
||||
subject: string;
|
||||
@ -49,7 +57,7 @@ export class Checker {
|
||||
}
|
||||
}
|
||||
|
||||
private searchTopLevelFn(statement: ParsedExpr & { exprType: "fn" }) {
|
||||
private searchTopLevelFn(statement: ParsedExpr<"fn">) {
|
||||
}
|
||||
|
||||
private checkExpr(expr: ParsedExpr): CheckedExpr {
|
||||
@ -61,6 +69,7 @@ export class Checker {
|
||||
case "id":
|
||||
throw new Error("not implemented");
|
||||
case "int":
|
||||
return this.checkInt(expr);
|
||||
case "if":
|
||||
case "block":
|
||||
case "call":
|
||||
@ -78,6 +87,15 @@ export class Checker {
|
||||
}
|
||||
}
|
||||
|
||||
private checkInt(expr: ParsedExpr<"int">): CheckedExpr {
|
||||
return {
|
||||
pos: expr.pos,
|
||||
exprType: "int",
|
||||
value: expr.value,
|
||||
valueType: { pos: expr.pos, typeType: "i16" },
|
||||
};
|
||||
}
|
||||
|
||||
private errorExpr(message: string, pos: Position): CheckedExpr {
|
||||
this.errors.push({ message, pos });
|
||||
return {
|
||||
|
@ -50,6 +50,7 @@ export type ParsedExpr =
|
||||
} | {
|
||||
exprType: "block";
|
||||
body: ParsedExpr[];
|
||||
value: ParsedExpr | null;
|
||||
} | {
|
||||
exprType: "call";
|
||||
subject: ParsedExpr;
|
||||
|
10
parser.ts
10
parser.ts
@ -629,9 +629,16 @@ export class Parser {
|
||||
this.step();
|
||||
while (this.currentIs("semicolon")) this.step();
|
||||
const body: ParsedExpr[] = [];
|
||||
let value: ParsedExpr | null = null;
|
||||
while (!this.done() && this.current.tokenType != "rbrace") {
|
||||
body.push(this.parseStatement());
|
||||
const exprOrStatement = this.parseStatement();
|
||||
if (this.currentIs("semicolon")) {
|
||||
body.push(exprOrStatement);
|
||||
while (this.currentIs("semicolon")) this.step();
|
||||
} else {
|
||||
value = exprOrStatement;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!this.currentIs("rbrace")) {
|
||||
return this.errorExpr(
|
||||
@ -643,6 +650,7 @@ export class Parser {
|
||||
pos,
|
||||
exprType: "block",
|
||||
body,
|
||||
value,
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user