yukigo-haskell-parser 0.1.0 → 0.1.1

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 (64) hide show
  1. package/.mocharc.json +3 -3
  2. package/README.md +10 -10
  3. package/dist/index.d.ts +13 -2
  4. package/dist/index.js +112 -32
  5. package/dist/index.js.map +1 -1
  6. package/dist/parser/grammar.js +220 -231
  7. package/dist/parser/grammar.js.map +1 -1
  8. package/dist/parser/lexer.d.ts +70 -15
  9. package/dist/parser/lexer.js +259 -50
  10. package/dist/parser/lexer.js.map +1 -1
  11. package/dist/prelude.d.ts +1 -1
  12. package/dist/prelude.js +280 -204
  13. package/dist/prelude.js.map +1 -1
  14. package/dist/typechecker/DeclarationCollector.d.ts +6 -1
  15. package/dist/typechecker/DeclarationCollector.js +39 -0
  16. package/dist/typechecker/DeclarationCollector.js.map +1 -1
  17. package/dist/typechecker/TypeBuilder.d.ts +1 -1
  18. package/dist/typechecker/TypeBuilder.js +6 -2
  19. package/dist/typechecker/TypeBuilder.js.map +1 -1
  20. package/dist/typechecker/checker.d.ts +15 -4
  21. package/dist/typechecker/checker.js +108 -25
  22. package/dist/typechecker/checker.js.map +1 -1
  23. package/dist/typechecker/core.d.ts +4 -0
  24. package/dist/typechecker/core.js +45 -19
  25. package/dist/typechecker/core.js.map +1 -1
  26. package/dist/typechecker/inference.d.ts +5 -1
  27. package/dist/typechecker/inference.js +95 -21
  28. package/dist/typechecker/inference.js.map +1 -1
  29. package/dist/utils/helpers.d.ts +1 -1
  30. package/dist/utils/helpers.js +1 -1
  31. package/dist/utils/helpers.js.map +1 -1
  32. package/dist/utils/types.d.ts +1 -1
  33. package/dist/utils/types.js +7 -0
  34. package/dist/utils/types.js.map +1 -1
  35. package/package.json +3 -3
  36. package/src/index.ts +192 -55
  37. package/src/parser/grammar.ne +519 -463
  38. package/src/parser/grammar.ts +230 -239
  39. package/src/parser/lexer.ts +353 -77
  40. package/src/prelude.ts +282 -206
  41. package/src/typechecker/DeclarationCollector.ts +157 -104
  42. package/src/typechecker/TypeBuilder.ts +150 -148
  43. package/src/typechecker/checker.ts +501 -395
  44. package/src/typechecker/core.ts +192 -162
  45. package/src/typechecker/inference.ts +1421 -1327
  46. package/src/utils/helpers.ts +29 -29
  47. package/src/utils/types.ts +63 -56
  48. package/tests/hspec.spec.ts +92 -0
  49. package/tests/lexer.spec.ts +175 -0
  50. package/tests/parser.spec.ts +829 -823
  51. package/tests/prelude.spec.ts +17 -22
  52. package/tests/typechecker.spec.ts +327 -310
  53. package/tsconfig.json +26 -17
  54. package/tsconfig.tsbuildinfo +1 -0
  55. package/dist/parser/layoutPreprocessor.d.ts +0 -1
  56. package/dist/parser/layoutPreprocessor.js +0 -22
  57. package/dist/parser/layoutPreprocessor.js.map +0 -1
  58. package/dist/parser/preprocessor.d.ts +0 -28
  59. package/dist/parser/preprocessor.js +0 -453
  60. package/dist/parser/preprocessor.js.map +0 -1
  61. package/src/parser/layoutPreprocessor.ts +0 -21
  62. package/src/parser/preprocessor.ne +0 -375
  63. package/src/parser/preprocessor.ts +0 -502
  64. package/tests/preprocessor.spec.ts +0 -69
package/.mocharc.json CHANGED
@@ -1,4 +1,4 @@
1
- {
2
- "extension": ["ts"],
3
- "spec": "tests/**/*.spec.ts"
1
+ {
2
+ "extension": ["ts"],
3
+ "spec": "tests/**/*.spec.ts"
4
4
  }
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # Yukigo Haskell Parser
2
-
3
- Parser for a subset of Haskell written in Typescript using [nearley.js](https://nearley.js.org/) and [moo](https://github.com/no-context/moo).
4
-
5
- Parses a valid [yukigo](https://github.com/noiseArch/yukigo) AST.
6
-
7
- ## List of missing features
8
- - [Standard library](http://www.zvon.org/other/haskell/Outputprelude/functionIndex.html)
9
- - [Type classes](http://www.zvon.org/other/haskell/Outputprelude/classIndex.html)
10
- - ...
1
+ # Yukigo Haskell Parser
2
+
3
+ Parser for a subset of Haskell written in Typescript using [nearley.js](https://nearley.js.org/) and [moo](https://github.com/no-context/moo).
4
+
5
+ Parses a valid [yukigo](https://github.com/noiseArch/yukigo) AST.
6
+
7
+ ## List of missing features
8
+ - [Standard library](http://www.zvon.org/other/haskell/Outputprelude/functionIndex.html)
9
+ - [Type classes](http://www.zvon.org/other/haskell/Outputprelude/classIndex.html)
10
+ - ...
package/dist/index.d.ts CHANGED
@@ -1,7 +1,18 @@
1
- import { AST, YukigoParser } from "@yukigo/ast";
1
+ import { AST, Expression, YukigoParser } from "yukigo-ast";
2
+ export type HaskellConfig = {
3
+ typecheck: boolean;
4
+ includePrims: boolean;
5
+ };
2
6
  export declare class YukigoHaskellParser implements YukigoParser {
3
7
  errors: string[];
4
8
  private prelude;
5
- constructor(prelude?: string);
9
+ private config;
10
+ private checker?;
11
+ constructor(prelude?: string, config?: HaskellConfig);
12
+ private preprocessor;
6
13
  parse(code: string): AST;
14
+ parseExpression(code: string): Expression;
15
+ private feedParser;
16
+ typeOfExpression(code: string): string;
17
+ getKnownSymbols(): string[];
7
18
  }
package/dist/index.js CHANGED
@@ -2,53 +2,133 @@ import grammar from "./parser/grammar.js";
2
2
  import nearley from "nearley";
3
3
  import { groupFunctionDeclarations } from "./utils/helpers.js";
4
4
  import { TypeChecker } from "./typechecker/checker.js";
5
- import { preprocessor } from "./parser/layoutPreprocessor.js";
5
+ import { ArithmeticUnaryOperation, Equation, Function, Instance, ListType, Return, Sequence, SimpleType, StringOperation, StringPrimitive, SymbolPrimitive, TypePattern, UnguardedBody, VariablePattern, } from "yukigo-ast";
6
6
  import { preludeCode } from "./prelude.js";
7
+ import { typeMappings } from "./utils/types.js";
8
+ class UnexpectedToken extends Error {
9
+ constructor(token) {
10
+ super(`Parser: Unexpected '${token.type}' token '${token.value}' at line ${token.line} col ${token.col}.`);
11
+ }
12
+ }
13
+ class AmbiguityError extends Error {
14
+ constructor(amountAST) {
15
+ super(`Parser: Too much ambiguity. ${amountAST} ASTs parsed. Output not generated.`);
16
+ }
17
+ }
18
+ class TypeError extends Error {
19
+ constructor(errors) {
20
+ super(`Found type errors.\n\t-${errors.join("\n\t-")}`);
21
+ }
22
+ }
23
+ const HaskellDefaultConfig = {
24
+ typecheck: true,
25
+ includePrims: true,
26
+ };
7
27
  export class YukigoHaskellParser {
8
28
  errors = [];
9
29
  prelude;
10
- constructor(prelude) {
30
+ config;
31
+ checker;
32
+ constructor(prelude = preludeCode, config = HaskellDefaultConfig) {
11
33
  this.errors = [];
12
- this.prelude = prelude ?? preludeCode;
34
+ this.prelude = this.feedParser(prelude);
35
+ this.config = config;
36
+ }
37
+ preprocessor(code) {
38
+ return code.replace(/Exception\.evaluate/g, "evaluate");
13
39
  }
14
40
  parse(code) {
15
- const processedCode = preprocessor(code);
16
- const parser = new nearley.Parser(nearley.Grammar.fromCompiled(grammar));
17
- try {
18
- parser.feed(this.prelude + "\n\n" + processedCode);
19
- parser.finish();
20
- }
21
- catch (error) {
22
- console.log(error);
23
- if ("token" in error) {
24
- const token = error.token;
25
- const message = `Parser: Unexpected '${token.type}' token '${token.value}' at line ${token.line} col ${token.col}.`;
26
- this.errors.push(message);
27
- throw Error(message);
41
+ const processedCode = this.preprocessor(code);
42
+ const result = this.feedParser(processedCode);
43
+ const fullAst = this.prelude.concat(result);
44
+ const makePrim = (name) => new Function(new SymbolPrimitive(name), [
45
+ new Equation([new VariablePattern(new SymbolPrimitive("x"))], new UnguardedBody(new Sequence([new Return(new ArithmeticUnaryOperation("ToString", new SymbolPrimitive("x")))])))
46
+ ]);
47
+ const prims = [
48
+ makePrim("primShow"),
49
+ makePrim("primShowChar"),
50
+ makePrim("primShowString"),
51
+ makePrim("primShowList")
52
+ ];
53
+ const resolveYukigoType = (t) => {
54
+ if (t instanceof SimpleType) {
55
+ const mapped = typeMappings[t.value];
56
+ if (mapped)
57
+ return new SimpleType(mapped, t.constraints, t.loc);
58
+ return t;
59
+ }
60
+ if (t instanceof ListType)
61
+ return t;
62
+ return t;
63
+ };
64
+ const primShowString = new Function(new SymbolPrimitive("primShowString"), [
65
+ new Equation([new VariablePattern(new SymbolPrimitive("s"))], new UnguardedBody(new Sequence([
66
+ new Return(new StringOperation("Concat", new StringPrimitive("\""), new StringOperation("Concat", new SymbolPrimitive("s"), new StringPrimitive("\""))))
67
+ ])))
68
+ ]);
69
+ // Transform Instance nodes into Function nodes with TypePatterns
70
+ const transformedAst = this.config.includePrims ? [...prims, primShowString] : [];
71
+ for (const node of fullAst) {
72
+ if (node instanceof Instance) {
73
+ const instanceNode = node;
74
+ const yukigoType = resolveYukigoType(instanceNode.type);
75
+ for (const func of instanceNode.functions) {
76
+ const overloadedEquations = func.equations.map((eq) => {
77
+ const firstPattern = eq.patterns[0];
78
+ const typePattern = new TypePattern(yukigoType, firstPattern);
79
+ return new Equation([typePattern, ...eq.patterns.slice(1)], eq.body, eq.returnExpr, eq.loc);
80
+ });
81
+ transformedAst.unshift(new Function(func.identifier, overloadedEquations, func.loc));
82
+ }
83
+ }
84
+ else {
85
+ transformedAst.push(node);
28
86
  }
29
- throw error;
30
- }
31
- if (parser.results.length > 1) {
32
- const msg = `Parser: Too much ambiguity. ${parser.results.length} ASTs parsed. Output not generated.`;
33
- this.errors.push(msg);
34
- throw Error(msg);
35
- }
36
- if (parser.results.length == 0) {
37
- this.errors.push("Parser did not generate an AST.");
38
- throw Error("Parser did not generate an AST.");
39
87
  }
40
- const ast = groupFunctionDeclarations(parser.results[0]);
41
- try {
42
- const typeChecker = new TypeChecker();
43
- const errors = typeChecker.check(ast);
88
+ const ast = groupFunctionDeclarations(transformedAst);
89
+ if (this.config.typecheck) {
90
+ this.checker = new TypeChecker();
91
+ const errors = this.checker.check(ast);
44
92
  if (errors.length > 0) {
45
93
  this.errors.push(...errors);
94
+ throw new TypeError(errors);
46
95
  }
47
96
  }
97
+ return ast;
98
+ }
99
+ parseExpression(code) {
100
+ const processedCode = this.preprocessor(code);
101
+ const expr = this.feedParser(processedCode)[0];
102
+ return expr;
103
+ }
104
+ feedParser(code) {
105
+ const parser = new nearley.Parser(nearley.Grammar.fromCompiled(grammar));
106
+ try {
107
+ parser.feed(code);
108
+ parser.finish();
109
+ }
48
110
  catch (error) {
49
- console.log(error);
111
+ if ("token" in error && error.token)
112
+ throw new UnexpectedToken(error.token);
113
+ throw error;
50
114
  }
51
- return ast;
115
+ const { results } = parser;
116
+ if (results.length > 1)
117
+ throw new AmbiguityError(results.length);
118
+ if (results.length == 0)
119
+ return [];
120
+ return results[0];
121
+ }
122
+ typeOfExpression(code) {
123
+ if (!this.config.typecheck || !this.checker)
124
+ throw new Error("Type checking not initialized. Did you load a file?");
125
+ const expr = this.parseExpression(code);
126
+ return this.checker.inferExpression(expr);
127
+ }
128
+ getKnownSymbols() {
129
+ if (!this.config.typecheck || !this.checker)
130
+ return [];
131
+ return this.checker.getKnownSymbols();
52
132
  }
53
133
  }
54
134
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,qBAAqB,CAAC;AAC1C,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,OAAO,mBAAmB;IACvB,MAAM,GAAa,EAAE,CAAC;IACrB,OAAO,CAAS;IACxB,YAAY,OAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,WAAW,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAClB,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC1B,MAAM,OAAO,GAAG,uBAAuB,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,GAAG,GAAG,CAAC;gBACpH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC1B,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,+BAA+B,MAAM,CAAC,OAAO,CAAC,MAAM,qCAAqC,CAAC;YACtG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,GAAG,GAAG,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}