got type system working
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user