yukigo-haskell-parser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.mocharc.json +4 -0
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +10 -0
  4. package/dist/index.d.ts +7 -0
  5. package/dist/index.js +54 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/parser/grammar.d.ts +28 -0
  8. package/dist/parser/grammar.js +404 -0
  9. package/dist/parser/grammar.js.map +1 -0
  10. package/dist/parser/layoutPreprocessor.d.ts +1 -0
  11. package/dist/parser/layoutPreprocessor.js +22 -0
  12. package/dist/parser/layoutPreprocessor.js.map +1 -0
  13. package/dist/parser/lexer.d.ts +42 -0
  14. package/dist/parser/lexer.js +75 -0
  15. package/dist/parser/lexer.js.map +1 -0
  16. package/dist/parser/preprocessor.d.ts +28 -0
  17. package/dist/parser/preprocessor.js +453 -0
  18. package/dist/parser/preprocessor.js.map +1 -0
  19. package/dist/prelude.d.ts +1 -0
  20. package/dist/prelude.js +205 -0
  21. package/dist/prelude.js.map +1 -0
  22. package/dist/typechecker/DeclarationCollector.d.ts +15 -0
  23. package/dist/typechecker/DeclarationCollector.js +80 -0
  24. package/dist/typechecker/DeclarationCollector.js.map +1 -0
  25. package/dist/typechecker/TypeBuilder.d.ts +12 -0
  26. package/dist/typechecker/TypeBuilder.js +113 -0
  27. package/dist/typechecker/TypeBuilder.js.map +1 -0
  28. package/dist/typechecker/checker.d.ts +80 -0
  29. package/dist/typechecker/checker.js +269 -0
  30. package/dist/typechecker/checker.js.map +1 -0
  31. package/dist/typechecker/core.d.ts +14 -0
  32. package/dist/typechecker/core.js +142 -0
  33. package/dist/typechecker/core.js.map +1 -0
  34. package/dist/typechecker/inference.d.ts +69 -0
  35. package/dist/typechecker/inference.js +984 -0
  36. package/dist/typechecker/inference.js.map +1 -0
  37. package/dist/utils/helpers.d.ts +2 -0
  38. package/dist/utils/helpers.js +25 -0
  39. package/dist/utils/helpers.js.map +1 -0
  40. package/dist/utils/types.d.ts +6 -0
  41. package/dist/utils/types.js +53 -0
  42. package/dist/utils/types.js.map +1 -0
  43. package/package.json +36 -0
  44. package/src/index.ts +55 -0
  45. package/src/parser/grammar.ne +463 -0
  46. package/src/parser/grammar.ts +512 -0
  47. package/src/parser/layoutPreprocessor.ts +21 -0
  48. package/src/parser/lexer.ts +77 -0
  49. package/src/parser/preprocessor.ne +375 -0
  50. package/src/parser/preprocessor.ts +502 -0
  51. package/src/prelude.ts +206 -0
  52. package/src/typechecker/DeclarationCollector.ts +104 -0
  53. package/src/typechecker/TypeBuilder.ts +148 -0
  54. package/src/typechecker/checker.ts +395 -0
  55. package/src/typechecker/core.ts +162 -0
  56. package/src/typechecker/inference.ts +1327 -0
  57. package/src/utils/helpers.ts +29 -0
  58. package/src/utils/types.ts +56 -0
  59. package/tests/parser.spec.ts +823 -0
  60. package/tests/prelude.spec.ts +22 -0
  61. package/tests/preprocessor.spec.ts +69 -0
  62. package/tests/typechecker.spec.ts +310 -0
  63. package/tsconfig.json +17 -0
@@ -0,0 +1,80 @@
1
+ import { AST, Function, UnguardedBody, GuardedBody, Visitor } from "@yukigo/ast";
2
+ import { CoreHM } from "./core.js";
3
+ export interface TypeVar {
4
+ type: "TypeVar";
5
+ id: number;
6
+ name?: string;
7
+ constraints: string[];
8
+ }
9
+ export interface TypeConstructor {
10
+ type: "TypeConstructor";
11
+ name: string;
12
+ args: Type[];
13
+ }
14
+ export interface FunctionType {
15
+ type: "TypeConstructor";
16
+ name: "->";
17
+ args: [Type, Type];
18
+ }
19
+ export interface ListType {
20
+ type: "TypeConstructor";
21
+ name: "List";
22
+ args: [Type];
23
+ }
24
+ export interface TupleType {
25
+ type: "TypeConstructor";
26
+ name: "Tuple";
27
+ args: Type[];
28
+ }
29
+ export interface TypeScheme {
30
+ type: "TypeScheme";
31
+ quantifiers: number[];
32
+ body: Type;
33
+ constraints: Map<number, string[]>;
34
+ }
35
+ export type Type = TypeVar | TypeConstructor;
36
+ export type Environment = Map<string, TypeScheme>;
37
+ export type Substitution = Map<number, Type>;
38
+ export type Result<T> = {
39
+ success: true;
40
+ value: T;
41
+ } | {
42
+ success: false;
43
+ error: string;
44
+ };
45
+ export declare const booleanType: TypeConstructor;
46
+ export declare const numberType: TypeConstructor;
47
+ export declare const stringType: TypeConstructor;
48
+ export declare class FunctionRegistrarVisitor implements Visitor<void> {
49
+ private env;
50
+ private signatureMap;
51
+ private coreHM;
52
+ constructor(env: Environment, signatureMap: Map<string, TypeScheme>, coreHM: CoreHM);
53
+ visitFunction(node: Function): void;
54
+ }
55
+ export declare class FunctionCheckerVisitor implements Visitor<void> {
56
+ private environments;
57
+ private signatureMap;
58
+ private coreHM;
59
+ private errors;
60
+ constructor(environments: Environment[], signatureMap: Map<string, TypeScheme>, coreHM: CoreHM, errors: string[]);
61
+ visitFunction(node: Function): void;
62
+ }
63
+ export declare class TypeChecker {
64
+ private signatureMap;
65
+ private coreHM;
66
+ private errors;
67
+ constructor();
68
+ check(ast: AST): string[];
69
+ inferencePass(ast: AST): void;
70
+ }
71
+ export declare function showType(t: Type): string;
72
+ export declare function getReturnType(type: Type): Type;
73
+ export declare function getArgumentTypes(type: Type): Type[];
74
+ export declare function getArity(type: Type): number;
75
+ export declare function isUnguardedBody(body: UnguardedBody | GuardedBody[]): body is UnguardedBody;
76
+ export declare function isFunctionType(t: Type): t is FunctionType;
77
+ export declare function isListType(t: Type): t is ListType;
78
+ export declare function isTupleType(t: Type): t is TupleType;
79
+ export declare function functionType(params: Type, returnType: Type): FunctionType;
80
+ export declare function listType(elementsType: Type): ListType;
@@ -0,0 +1,269 @@
1
+ import { Function, Return, } from "@yukigo/ast";
2
+ import { InferenceEngine, PatternVisitor } from "./inference.js";
3
+ import { CoreHM } from "./core.js";
4
+ import { DeclarationCollectorVisitor } from "./DeclarationCollector.js";
5
+ export const booleanType = {
6
+ type: "TypeConstructor",
7
+ name: "YuBoolean",
8
+ args: [],
9
+ };
10
+ export const numberType = {
11
+ type: "TypeConstructor",
12
+ name: "YuNumber",
13
+ args: [],
14
+ };
15
+ export const stringType = {
16
+ type: "TypeConstructor",
17
+ name: "YuString",
18
+ args: [],
19
+ };
20
+ export class FunctionRegistrarVisitor {
21
+ env;
22
+ signatureMap;
23
+ coreHM;
24
+ constructor(env, signatureMap, coreHM) {
25
+ this.env = env;
26
+ this.signatureMap = signatureMap;
27
+ this.coreHM = coreHM;
28
+ }
29
+ visitFunction(node) {
30
+ const functionName = node.identifier.value;
31
+ let funcScheme = this.signatureMap.get(functionName);
32
+ if (!funcScheme) {
33
+ const funcTypeVar = this.coreHM.freshVar();
34
+ funcScheme = {
35
+ type: "TypeScheme",
36
+ quantifiers: [],
37
+ body: funcTypeVar,
38
+ constraints: new Map(),
39
+ };
40
+ this.env.set(functionName, funcScheme);
41
+ }
42
+ for (const equation of node.equations) {
43
+ if (isUnguardedBody(equation.body)) {
44
+ const { statements } = equation.body.sequence;
45
+ statements
46
+ .filter((stmt) => stmt instanceof Function)
47
+ .forEach((func) => {
48
+ this.env.set(func.identifier.value, funcScheme);
49
+ });
50
+ }
51
+ }
52
+ }
53
+ }
54
+ export class FunctionCheckerVisitor {
55
+ environments;
56
+ signatureMap;
57
+ coreHM;
58
+ errors;
59
+ constructor(environments, signatureMap, coreHM, errors) {
60
+ this.environments = environments;
61
+ this.signatureMap = signatureMap;
62
+ this.coreHM = coreHM;
63
+ this.errors = errors;
64
+ }
65
+ visitFunction(node) {
66
+ const functionName = node.identifier.value;
67
+ let funcScheme = this.signatureMap.get(functionName);
68
+ // Handle function without signature
69
+ if (!funcScheme) {
70
+ const firstEq = node.equations[0];
71
+ this.environments.unshift(new Map());
72
+ const inferenceEngine = new InferenceEngine(this.signatureMap, this.coreHM, this.environments);
73
+ const paramTypes = firstEq.patterns.map(() => this.coreHM.freshVar());
74
+ paramTypes.forEach((type, i) => {
75
+ try {
76
+ new PatternVisitor(this.coreHM, this.signatureMap, type, this.environments, inferenceEngine).visit(firstEq.patterns[i]);
77
+ }
78
+ catch (error) {
79
+ this.errors.push(`Type error in '${functionName}': ${error.message}`);
80
+ }
81
+ });
82
+ let inferredBodyType;
83
+ if (isUnguardedBody(firstEq.body)) {
84
+ const equationStatements = firstEq.body.sequence.statements;
85
+ equationStatements.forEach((stmt) => stmt.accept(new FunctionCheckerVisitor(this.environments, this.signatureMap, this.coreHM, this.errors)));
86
+ const returnResult = equationStatements
87
+ .find((stmt) => stmt instanceof Return)
88
+ .accept(inferenceEngine);
89
+ if (returnResult.success === false) {
90
+ this.errors.push(`Type error in '${functionName}': ${returnResult.error}`);
91
+ return;
92
+ }
93
+ inferredBodyType = returnResult.value;
94
+ }
95
+ else {
96
+ // Handle guarded body inference if necessary
97
+ inferredBodyType = this.coreHM.freshVar(); // Placeholder
98
+ }
99
+ const fullFuncType = paramTypes.reduceRight((acc, param) => functionType(param, acc), inferredBodyType);
100
+ // Generalize the inferred type to create a polymorphic type scheme
101
+ this.environments.shift();
102
+ funcScheme = this.coreHM.generalize(this.environments[0], fullFuncType);
103
+ this.signatureMap.set(functionName, funcScheme);
104
+ this.environments[0].set(functionName, funcScheme);
105
+ }
106
+ const expectedArity = getArity(this.coreHM.instantiate(funcScheme));
107
+ for (const [index, equation] of node.equations.entries()) {
108
+ if (equation.patterns.length !== expectedArity) {
109
+ this.errors.push(`Type error in '${functionName}': Arity mismatch in equation number ${index}`);
110
+ continue;
111
+ }
112
+ try {
113
+ const funcType = this.coreHM.instantiate(funcScheme);
114
+ const returnType = getReturnType(funcType);
115
+ const patternTypes = getArgumentTypes(funcType);
116
+ this.environments.unshift(new Map());
117
+ const inferenceEngine = new InferenceEngine(this.signatureMap, this.coreHM, this.environments);
118
+ patternTypes.forEach((argType, i) => {
119
+ try {
120
+ equation.patterns[i].accept(new PatternVisitor(this.coreHM, this.signatureMap, argType, this.environments, inferenceEngine));
121
+ }
122
+ catch (error) {
123
+ this.errors.push(`Type error in '${functionName}': ${error.message}`);
124
+ }
125
+ });
126
+ if (isUnguardedBody(equation.body)) {
127
+ const equationStatements = equation.body.sequence.statements;
128
+ equationStatements.forEach((stmt) => stmt.accept(new FunctionCheckerVisitor(this.environments, this.signatureMap, this.coreHM, this.errors)));
129
+ const returnResult = equationStatements
130
+ .find((stmt) => stmt instanceof Return)
131
+ .accept(inferenceEngine);
132
+ if (returnResult.success === false) {
133
+ this.errors.push(`Type error in '${functionName}': ${returnResult.error}`);
134
+ return;
135
+ }
136
+ const sub = this.coreHM.unify(returnResult.value, returnType);
137
+ if (sub.success === false)
138
+ throw Error(sub.error);
139
+ }
140
+ else {
141
+ // Handles GuardedBody case
142
+ for (const guard of equation.body) {
143
+ // checks if condition expression in guard is a resolves to YuBoolean
144
+ const condition = guard.condition.accept(inferenceEngine);
145
+ if (condition.success === false)
146
+ throw Error(condition.error);
147
+ const conditionSub = this.coreHM.unify(condition.value, booleanType);
148
+ if (conditionSub.success === false)
149
+ throw Error(conditionSub.error);
150
+ const bodyResult = guard.body.accept(inferenceEngine);
151
+ if (bodyResult.success === false)
152
+ throw Error(bodyResult.error);
153
+ const sub = this.coreHM.unify(bodyResult.value, returnType);
154
+ if (sub.success === false)
155
+ throw Error(sub.error);
156
+ }
157
+ }
158
+ this.environments.shift();
159
+ }
160
+ catch (error) {
161
+ this.errors.push(`Type error in '${functionName}': ${error.message}`);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ export class TypeChecker {
167
+ signatureMap;
168
+ coreHM;
169
+ errors;
170
+ constructor() {
171
+ this.signatureMap = new Map();
172
+ this.coreHM = new CoreHM();
173
+ this.errors = [];
174
+ }
175
+ check(ast) {
176
+ const typeAliasMap = new Map();
177
+ const recordMap = new Map();
178
+ // Phase 1: Collect declarations
179
+ const collector = new DeclarationCollectorVisitor(this.errors, typeAliasMap, recordMap, this.signatureMap, this.coreHM);
180
+ for (const node of ast) {
181
+ try {
182
+ node.accept(collector);
183
+ }
184
+ catch (error) {
185
+ this.errors.push(error);
186
+ }
187
+ }
188
+ if (this.errors.length > 0)
189
+ return this.errors;
190
+ // Phase 2: Infer and check functions
191
+ this.inferencePass(ast);
192
+ return this.errors;
193
+ }
194
+ inferencePass(ast) {
195
+ // Step 1: Register all functions in env
196
+ const globalEnv = new Map(this.signatureMap);
197
+ const visitor1 = new FunctionRegistrarVisitor(globalEnv, this.signatureMap, this.coreHM);
198
+ for (const node of ast) {
199
+ node.accept(visitor1);
200
+ }
201
+ // Step 2: Infer and check each function
202
+ const visitor2 = new FunctionCheckerVisitor([globalEnv], this.signatureMap, this.coreHM, this.errors);
203
+ for (const node of ast) {
204
+ node.accept(visitor2);
205
+ }
206
+ }
207
+ }
208
+ export function showType(t) {
209
+ if (t.type === "TypeVar")
210
+ return t.name ?? `t${t.id}`;
211
+ if (isFunctionType(t)) {
212
+ const a = showType(t.args[0]);
213
+ const b = showType(t.args[1]);
214
+ const aDisp = isFunctionType(t.args[0]) ? `(${a})` : a;
215
+ return `${aDisp} -> ${b}`;
216
+ }
217
+ if (isListType(t))
218
+ return `[${showType(t.args[0])}]`;
219
+ if (isTupleType(t))
220
+ return `(${t.args.map(showType.bind(this)).join(", ")})`;
221
+ return t.args.length
222
+ ? `${t.name} ${t.args.map(showType.bind(this)).join(" ")}`
223
+ : t.name;
224
+ }
225
+ export function getReturnType(type) {
226
+ let t = type;
227
+ while (isFunctionType(t))
228
+ t = t.args[1];
229
+ return t;
230
+ }
231
+ export function getArgumentTypes(type) {
232
+ const args = [];
233
+ let t = type;
234
+ while (isFunctionType(t)) {
235
+ args.push(t.args[0]);
236
+ t = t.args[1];
237
+ }
238
+ return args;
239
+ }
240
+ export function getArity(type) {
241
+ return getArgumentTypes(type).length;
242
+ }
243
+ export function isUnguardedBody(body) {
244
+ return !Array.isArray(body);
245
+ }
246
+ export function isFunctionType(t) {
247
+ return t.type === "TypeConstructor" && t.name === "->" && t.args.length === 2;
248
+ }
249
+ export function isListType(t) {
250
+ return t.name === "List";
251
+ }
252
+ export function isTupleType(t) {
253
+ return t.name === "Tuple";
254
+ }
255
+ export function functionType(params, returnType) {
256
+ return {
257
+ type: "TypeConstructor",
258
+ name: "->",
259
+ args: [params, returnType],
260
+ };
261
+ }
262
+ export function listType(elementsType) {
263
+ return {
264
+ type: "TypeConstructor",
265
+ name: "List",
266
+ args: [elementsType],
267
+ };
268
+ }
269
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/typechecker/checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Environment, Result, Substitution, Type, TypeConstructor, TypeScheme, TypeVar } from "./checker.js";
2
+ export declare class CoreHM {
3
+ private nextVarId;
4
+ freshVar(constraints?: string[]): TypeVar;
5
+ freeTypeVars(t: Type): Map<number, string[]>;
6
+ generalize(env: Environment, t: Type): TypeScheme;
7
+ instantiate(scheme: TypeScheme): Type;
8
+ applySubst(subst: Substitution, t: Type): TypeVar | TypeConstructor;
9
+ composeSubst(s1: Substitution, s2: Substitution): Substitution;
10
+ unify(t1: Type, t2: Type): Result<Substitution>;
11
+ unifyVar(v: TypeVar, t: Type): Result<Substitution>;
12
+ checkConstraint(constraintName: string, t: Type): void;
13
+ occurs(varId: number, t: Type): boolean;
14
+ }
@@ -0,0 +1,142 @@
1
+ import { typeClasses } from "../utils/types.js";
2
+ import { showType, } from "./checker.js";
3
+ export class CoreHM {
4
+ nextVarId = 0;
5
+ freshVar(constraints = []) {
6
+ return { type: "TypeVar", id: this.nextVarId++, constraints };
7
+ }
8
+ freeTypeVars(t) {
9
+ const freeVars = new Map();
10
+ const collect = (type) => {
11
+ if (type.type === "TypeVar") {
12
+ freeVars.set(type.id, type.constraints);
13
+ }
14
+ else if (type.type === "TypeConstructor") {
15
+ type.args.forEach(collect);
16
+ }
17
+ };
18
+ collect(t);
19
+ return freeVars;
20
+ }
21
+ generalize(env, t) {
22
+ const envFreeVars = new Set();
23
+ for (const scheme of env.values()) {
24
+ const schemeFreeVars = this.freeTypeVars(scheme.body);
25
+ for (const id of schemeFreeVars.keys()) {
26
+ if (!scheme.quantifiers.includes(id)) {
27
+ envFreeVars.add(id);
28
+ }
29
+ }
30
+ }
31
+ const typeFreeVars = this.freeTypeVars(t);
32
+ const quantifiers = [];
33
+ const constraints = new Map();
34
+ for (const [id, consts] of typeFreeVars.entries()) {
35
+ if (!envFreeVars.has(id)) {
36
+ quantifiers.push(id);
37
+ if (consts.length > 0) {
38
+ constraints.set(id, consts);
39
+ }
40
+ }
41
+ }
42
+ return { type: "TypeScheme", quantifiers, body: t, constraints };
43
+ }
44
+ instantiate(scheme) {
45
+ const substitutions = new Map();
46
+ scheme.quantifiers.forEach((id) => {
47
+ const constraints = scheme.constraints.get(id) || [];
48
+ substitutions.set(id, this.freshVar(constraints));
49
+ });
50
+ return this.applySubst(substitutions, scheme.body);
51
+ }
52
+ applySubst(subst, t) {
53
+ if (t.type === "TypeVar") {
54
+ const replacement = subst.get(t.id);
55
+ return replacement ? replacement : t;
56
+ }
57
+ else if (t.type === "TypeConstructor") {
58
+ return {
59
+ type: "TypeConstructor",
60
+ name: t.name,
61
+ args: t.args.map((arg) => this.applySubst(subst, arg)),
62
+ };
63
+ }
64
+ throw new Error("Unexpected TypeScheme in applySubst");
65
+ }
66
+ composeSubst(s1, s2) {
67
+ const result = new Map(s2);
68
+ for (const [id, type] of s1) {
69
+ result.set(id, this.applySubst(s2, type));
70
+ }
71
+ return result;
72
+ }
73
+ unify(t1, t2) {
74
+ if (t1.type === "TypeVar")
75
+ return this.unifyVar(t1, t2);
76
+ if (t2.type === "TypeVar")
77
+ return this.unifyVar(t2, t1);
78
+ if (t1.type === "TypeConstructor" && t2.type === "TypeConstructor") {
79
+ if (t1.name !== t2.name || t1.args.length !== t2.args.length) {
80
+ return {
81
+ success: false,
82
+ error: `Cannot unify ${showType(t1)} with ${showType(t2)}`,
83
+ };
84
+ }
85
+ let sub = new Map();
86
+ for (let i = 0; i < t1.args.length; i++) {
87
+ const arg1 = this.applySubst(sub, t1.args[i]);
88
+ const arg2 = this.applySubst(sub, t2.args[i]);
89
+ const argSubRes = this.unify(arg1, arg2);
90
+ if (!argSubRes.success)
91
+ return argSubRes;
92
+ sub = this.composeSubst(sub, argSubRes.value);
93
+ }
94
+ return { success: true, value: sub };
95
+ }
96
+ return { success: false, error: `Cannot unify non-types` };
97
+ }
98
+ unifyVar(v, t) {
99
+ if (t.type === "TypeVar" && t.id === v.id) {
100
+ return { success: true, value: new Map() };
101
+ }
102
+ if (this.occurs(v.id, t)) {
103
+ return { success: false, error: `Occurs check failed` };
104
+ }
105
+ for (const constraint of v.constraints) {
106
+ this.checkConstraint(constraint, t);
107
+ }
108
+ if (t.type === "TypeVar") {
109
+ for (const constraint of t.constraints) {
110
+ this.checkConstraint(constraint, v);
111
+ }
112
+ // Merge constraints
113
+ const mergedConstraints = [
114
+ ...new Set([...v.constraints, ...t.constraints]),
115
+ ];
116
+ v.constraints = mergedConstraints;
117
+ t.constraints = mergedConstraints;
118
+ }
119
+ return { success: true, value: new Map([[v.id, t]]) };
120
+ }
121
+ checkConstraint(constraintName, t) {
122
+ if (t.type === "TypeVar") {
123
+ if (!t.constraints.includes(constraintName)) {
124
+ t.constraints.push(constraintName);
125
+ }
126
+ }
127
+ else if (t.type === "TypeConstructor") {
128
+ const instances = typeClasses.get(constraintName);
129
+ if (!instances || !instances.includes(t.name)) {
130
+ throw new Error(`Type '${showType(t)}' is not an instance of '${constraintName}'`);
131
+ }
132
+ }
133
+ }
134
+ occurs(varId, t) {
135
+ if (t.type === "TypeVar")
136
+ return t.id === varId;
137
+ if (t.type === "TypeConstructor")
138
+ return t.args.some((a) => this.occurs(varId, a));
139
+ return false;
140
+ }
141
+ }
142
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/typechecker/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Application, ApplicationPattern, ArithmeticBinaryOperation, ArithmeticUnaryOperation, AsPattern, AssignOperation, ASTNode, BitwiseBinaryOperation, BitwiseUnaryOperation, BooleanPrimitive, CharPrimitive, ComparisonOperation, CompositionExpression, ConsExpression, ConsPattern, ConstructorPattern, DataExpression, FieldExpression, For, FunctorPattern, Generator, If, Lambda, LetInExpression, ListBinaryOperation, ListComprehension, ListPattern, ListPrimitive, ListUnaryOperation, LiteralPattern, LogicalBinaryOperation, LogicalUnaryOperation, NilPrimitive, NumberPrimitive, Otherwise, Pattern, Print, Raise, RangeExpression, Return, StringOperation, StringPrimitive, Switch, SymbolPrimitive, TupleExpression, TuplePattern, TypeCast, UnifyOperation, UnionPattern, VariablePattern, Visitor, WildcardPattern, Yield } from "@yukigo/ast";
2
+ import { Environment, Result, Type, TypeScheme } from "./checker.js";
3
+ import { CoreHM } from "./core.js";
4
+ export declare class PatternVisitor implements Visitor<void> {
5
+ private coreHM;
6
+ private signatureMap;
7
+ private expectedType;
8
+ private envs;
9
+ private inferenceEngine;
10
+ constructor(coreHM: CoreHM, signatureMap: Map<string, TypeScheme>, expectedType: Type, envs: Environment[], inferenceEngine: InferenceEngine);
11
+ visitVariablePattern(node: VariablePattern): void;
12
+ visitLiteralPattern(node: LiteralPattern): void;
13
+ visitApplicationPattern(node: ApplicationPattern): void;
14
+ visitTuplePattern(node: TuplePattern): void;
15
+ visitListPattern(node: ListPattern): void;
16
+ visitFunctorPattern(node: FunctorPattern): Result<Type>;
17
+ visitAsPattern(node: AsPattern): void;
18
+ visitWildcardPattern(node: WildcardPattern): Result<Type>;
19
+ visitUnionPattern(node: UnionPattern): Result<Type>;
20
+ visitConstructorPattern(node: ConstructorPattern): void;
21
+ visitConsPattern(node: ConsPattern): void;
22
+ visit(node: Pattern): void;
23
+ }
24
+ export declare class InferenceEngine implements Visitor<Result<Type>> {
25
+ private signatureMap;
26
+ private coreHM;
27
+ private envs;
28
+ constructor(signatureMap: Map<string, TypeScheme>, coreHM: CoreHM, envs: Environment[]);
29
+ visitNumberPrimitive(node: NumberPrimitive): Result<Type>;
30
+ visitBooleanPrimitive(node: BooleanPrimitive): Result<Type>;
31
+ visitStringPrimitive(node: StringPrimitive): Result<Type>;
32
+ visitListPrimitive(node: ListPrimitive): Result<Type>;
33
+ visitNilPrimitive(node: NilPrimitive): Result<Type>;
34
+ visitCharPrimitive(node: CharPrimitive): Result<Type>;
35
+ visitSymbolPrimitive(node: SymbolPrimitive): Result<Type>;
36
+ visitArithmeticUnaryOperation(node: ArithmeticUnaryOperation): Result<Type>;
37
+ visitArithmeticBinaryOperation(node: ArithmeticBinaryOperation): Result<Type>;
38
+ visitListUnaryOperation(node: ListUnaryOperation): Result<Type>;
39
+ visitListBinaryOperation(node: ListBinaryOperation): Result<Type>;
40
+ visitComparisonOperation(node: ComparisonOperation): Result<Type>;
41
+ visitLogicalBinaryOperation(node: LogicalBinaryOperation): Result<Type>;
42
+ visitLogicalUnaryOperation(node: LogicalUnaryOperation): Result<Type>;
43
+ visitBitwiseBinaryOperation(node: BitwiseBinaryOperation): Result<Type>;
44
+ visitBitwiseUnaryOperation(node: BitwiseUnaryOperation): Result<Type>;
45
+ visitStringOperation(node: StringOperation): Result<Type>;
46
+ visitUnifyOperation(node: UnifyOperation): Result<Type>;
47
+ visitAssignOperation(node: AssignOperation): Result<Type>;
48
+ visitTupleExpr(node: TupleExpression): Result<Type>;
49
+ visitFieldExpr(node: FieldExpression): Result<Type>;
50
+ visitDataExpr(node: DataExpression): Result<Type>;
51
+ visitConsExpr(node: ConsExpression): Result<Type>;
52
+ visitLetInExpr(node: LetInExpression): Result<Type>;
53
+ visitOtherwise(node: Otherwise): Result<Type>;
54
+ visitCompositionExpression(node: CompositionExpression): Result<Type>;
55
+ visitLambda(node: Lambda): Result<Type>;
56
+ visitApplication(node: Application): Result<Type>;
57
+ visitYield(node: Yield): Result<Type>;
58
+ visitRaise(node: Raise): Result<Type>;
59
+ visitIf(node: If): Result<Type>;
60
+ visitReturn(node: Return): Result<Type>;
61
+ visitTypeCast(node: TypeCast): Result<Type>;
62
+ visitPrint(node: Print): Result<Type>;
63
+ visitListComprehension(node: ListComprehension): Result<Type>;
64
+ visitGenerator(node: Generator): Result<Type>;
65
+ visitFor(node: For): Result<Type>;
66
+ visitSwitch(node: Switch): Result<Type>;
67
+ visitRangeExpression(node: RangeExpression): Result<Type>;
68
+ visit(node: ASTNode): Result<Type>;
69
+ }