got type system working

This commit is contained in:
2025-08-25 21:51:50 -06:00
parent 0a315c5615
commit b2709ffc82
10 changed files with 858 additions and 91 deletions

View File

@@ -1,6 +1,7 @@
import {
AssignmentStatement,
Block,
containsReturn,
Expression,
Function,
FunctionArgument,
@@ -19,6 +20,7 @@ import {
Module,
ModuleItem,
NamedTypeUsage,
newNever,
Operation,
ReturnStatement,
Statement,
@@ -43,8 +45,6 @@ function nextUnknown() {
export const semantics = boringGrammar.createSemantics();
semantics.addOperation<any>("toAST", {
LiteralInt(a): LiteralInt {
console.log(this);
console.log(a.source.startIdx);
return {
expressionType: "LiteralInt",
value: this.sourceString,
@@ -106,11 +106,15 @@ semantics.addOperation<any>("toAST", {
};
},
FunctionCall(expression, _2, args, _4): FunctionCall {
const resolvedArgs = args.asIteration().children.map((c) => c.toAST());
return {
expressionType: "FunctionCall",
source: expression.toAST(),
arguments: args.asIteration().children.map((c) => c.toAST()),
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
arguments: resolvedArgs,
type: {
typeUsage: "UnknownTypeUsage",
name: nextUnknown(),
},
};
},
StructGetter(expression, _2, identifier): StructGetter {
@@ -148,7 +152,11 @@ semantics.addOperation<any>("toAST", {
return factor.toAST();
},
Expression(expression): Expression {
return expression.toAST();
return {
statementType: "Expression",
subExpression: expression.toAST(),
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
};
},
Expression_plus(expression, _2, factor): Operation {
return {
@@ -156,6 +164,7 @@ semantics.addOperation<any>("toAST", {
left: expression.toAST(),
op: "+",
right: factor.toAST(),
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
};
},
Expression_minus(expression, _2, factor): Operation {
@@ -164,6 +173,7 @@ semantics.addOperation<any>("toAST", {
left: expression.toAST(),
op: "-",
right: factor.toAST(),
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
};
},
Factor_mult(factor, _2, term): Operation {
@@ -172,6 +182,7 @@ semantics.addOperation<any>("toAST", {
left: factor.toAST(),
op: "*",
right: term.toAST(),
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
};
},
Factor_div(factor, _2, term): Operation {
@@ -180,6 +191,7 @@ semantics.addOperation<any>("toAST", {
left: factor.toAST(),
op: "/",
right: term.toAST(),
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
};
},
Statement(statement): Statement {
@@ -217,11 +229,18 @@ semantics.addOperation<any>("toAST", {
Block(_1, statements, expression, _4): Block {
const lines = statements.asIteration().children.map((c) => c.toAST());
const finalExpression = expression.toAST();
lines.push(finalExpression.length > 0 ? finalExpression[0] : null);
return {
if (finalExpression.length > 0) {
lines.push(finalExpression[0]);
}
const block: Block = {
expressionType: "Block",
statements: lines,
type: { typeUsage: "UnknownTypeUsage", name: nextUnknown() },
type: newNever(),
};
if (!containsReturn(block)) {
block.type = { typeUsage: "UnknownTypeUsage", name: nextUnknown() };
}
return block;
},
NamedTypeUsage(name): NamedTypeUsage {
return {