kopscript 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.
package/dist/tokens.js ADDED
@@ -0,0 +1,81 @@
1
+ export var TokenKind;
2
+ (function (TokenKind) {
3
+ // Literals
4
+ TokenKind["Number"] = "Number";
5
+ TokenKind["String"] = "String";
6
+ TokenKind["InterpolatedString"] = "InterpolatedString";
7
+ TokenKind["RegexLiteral"] = "RegexLiteral";
8
+ TokenKind["Identifier"] = "Identifier";
9
+ TokenKind["True"] = "True";
10
+ TokenKind["False"] = "False";
11
+ // Keywords
12
+ TokenKind["Using"] = "Using";
13
+ TokenKind["Extern"] = "Extern";
14
+ TokenKind["From"] = "From";
15
+ TokenKind["As"] = "As";
16
+ TokenKind["Const"] = "Const";
17
+ TokenKind["Class"] = "Class";
18
+ TokenKind["Interface"] = "Interface";
19
+ TokenKind["Enum"] = "Enum";
20
+ TokenKind["Constructor"] = "Constructor";
21
+ TokenKind["Public"] = "Public";
22
+ TokenKind["Private"] = "Private";
23
+ TokenKind["Protected"] = "Protected";
24
+ TokenKind["Static"] = "Static";
25
+ TokenKind["Virtual"] = "Virtual";
26
+ TokenKind["Override"] = "Override";
27
+ TokenKind["Get"] = "Get";
28
+ TokenKind["Set"] = "Set";
29
+ TokenKind["Return"] = "Return";
30
+ TokenKind["If"] = "If";
31
+ TokenKind["Else"] = "Else";
32
+ TokenKind["While"] = "While";
33
+ TokenKind["For"] = "For";
34
+ TokenKind["Foreach"] = "Foreach";
35
+ TokenKind["In"] = "In";
36
+ TokenKind["Break"] = "Break";
37
+ TokenKind["Continue"] = "Continue";
38
+ TokenKind["Match"] = "Match";
39
+ TokenKind["This"] = "This";
40
+ TokenKind["Base"] = "Base";
41
+ TokenKind["New"] = "New";
42
+ TokenKind["Task"] = "Task";
43
+ TokenKind["State"] = "State";
44
+ TokenKind["Async"] = "Async";
45
+ TokenKind["Await"] = "Await";
46
+ TokenKind["Try"] = "Try";
47
+ TokenKind["Catch"] = "Catch";
48
+ TokenKind["Finally"] = "Finally";
49
+ TokenKind["Throw"] = "Throw";
50
+ TokenKind["Void"] = "Void";
51
+ // Punctuation
52
+ TokenKind["LParen"] = "LParen";
53
+ TokenKind["RParen"] = "RParen";
54
+ TokenKind["LBrace"] = "LBrace";
55
+ TokenKind["RBrace"] = "RBrace";
56
+ TokenKind["LBracket"] = "LBracket";
57
+ TokenKind["RBracket"] = "RBracket";
58
+ TokenKind["Comma"] = "Comma";
59
+ TokenKind["Colon"] = "Colon";
60
+ TokenKind["Semicolon"] = "Semicolon";
61
+ TokenKind["Dot"] = "Dot";
62
+ TokenKind["Arrow"] = "Arrow";
63
+ TokenKind["Underscore"] = "Underscore";
64
+ // Operators
65
+ TokenKind["Plus"] = "Plus";
66
+ TokenKind["Minus"] = "Minus";
67
+ TokenKind["Star"] = "Star";
68
+ TokenKind["Slash"] = "Slash";
69
+ TokenKind["Percent"] = "Percent";
70
+ TokenKind["Assign"] = "Assign";
71
+ TokenKind["Eq"] = "Eq";
72
+ TokenKind["NotEq"] = "NotEq";
73
+ TokenKind["Lt"] = "Lt";
74
+ TokenKind["Gt"] = "Gt";
75
+ TokenKind["LtEq"] = "LtEq";
76
+ TokenKind["GtEq"] = "GtEq";
77
+ TokenKind["AndAnd"] = "AndAnd";
78
+ TokenKind["OrOr"] = "OrOr";
79
+ TokenKind["Not"] = "Not";
80
+ TokenKind["EOF"] = "EOF";
81
+ })(TokenKind || (TokenKind = {}));
package/dist/types.js ADDED
@@ -0,0 +1,108 @@
1
+ export const NUMBER = { kind: "number" };
2
+ export const STRING = { kind: "string" };
3
+ export const BOOL = { kind: "bool" };
4
+ export const VOID = { kind: "void" };
5
+ export const UNKNOWN = { kind: "unknown" };
6
+ export function arrayOf(element) {
7
+ return { kind: "array", element };
8
+ }
9
+ export function classType(name) {
10
+ return { kind: "class", name };
11
+ }
12
+ export function interfaceType(name) {
13
+ return { kind: "interface", name };
14
+ }
15
+ export function enumType(name) {
16
+ return { kind: "enum", name };
17
+ }
18
+ export function functionType(params, returnType) {
19
+ return { kind: "function", params, returnType };
20
+ }
21
+ export function taskType(resultType) {
22
+ return { kind: "task", resultType };
23
+ }
24
+ export function stateType(valueType) {
25
+ return { kind: "state", valueType };
26
+ }
27
+ export function typeToString(t) {
28
+ switch (t.kind) {
29
+ case "number":
30
+ case "string":
31
+ case "bool":
32
+ case "void":
33
+ case "unknown":
34
+ return t.kind;
35
+ case "array":
36
+ return `${typeToString(t.element)}[]`;
37
+ case "class":
38
+ case "interface":
39
+ case "enum":
40
+ return t.name;
41
+ case "function":
42
+ return `(${t.params.map(typeToString).join(", ")}) => ${typeToString(t.returnType)}`;
43
+ case "task":
44
+ return t.resultType.kind === "void" ? "task" : `task<${typeToString(t.resultType)}>`;
45
+ case "state":
46
+ return `state<${typeToString(t.valueType)}>`;
47
+ }
48
+ }
49
+ const PRIMITIVE_NAMES = new Set(["number", "string", "bool", "void"]);
50
+ // Resolves a syntactic type annotation to a Type, given the kind of every known
51
+ // user-declared name (class, interface, or enum).
52
+ export function resolveTypeNode(node, namedTypes) {
53
+ if (node.kind === "ArrayType") {
54
+ const element = resolveTypeNode(node.element, namedTypes);
55
+ return element ? arrayOf(element) : null;
56
+ }
57
+ if (node.kind === "FunctionType") {
58
+ const params = [];
59
+ for (const p of node.params) {
60
+ const resolved = resolveTypeNode(p, namedTypes);
61
+ if (!resolved)
62
+ return null;
63
+ params.push(resolved);
64
+ }
65
+ const returnType = resolveTypeNode(node.returnType, namedTypes);
66
+ return returnType ? functionType(params, returnType) : null;
67
+ }
68
+ if (node.kind === "TaskType") {
69
+ const resultType = resolveTypeNode(node.resultType, namedTypes);
70
+ return resultType ? taskType(resultType) : null;
71
+ }
72
+ if (node.kind === "StateType") {
73
+ const valueType = resolveTypeNode(node.valueType, namedTypes);
74
+ return valueType ? stateType(valueType) : null;
75
+ }
76
+ if (PRIMITIVE_NAMES.has(node.name)) {
77
+ return { kind: node.name };
78
+ }
79
+ const kind = namedTypes.get(node.name);
80
+ if (kind === "class")
81
+ return classType(node.name);
82
+ if (kind === "interface")
83
+ return interfaceType(node.name);
84
+ if (kind === "enum")
85
+ return enumType(node.name);
86
+ return null;
87
+ }
88
+ export function typesEqual(a, b) {
89
+ if (a.kind === "unknown" || b.kind === "unknown")
90
+ return true;
91
+ if (a.kind !== b.kind)
92
+ return false;
93
+ if (a.kind === "array" && b.kind === "array")
94
+ return typesEqual(a.element, b.element);
95
+ if (a.kind === "function" && b.kind === "function") {
96
+ return a.params.length === b.params.length && a.params.every((p, i) => typesEqual(p, b.params[i])) && typesEqual(a.returnType, b.returnType);
97
+ }
98
+ if (a.kind === "task" && b.kind === "task") {
99
+ return typesEqual(a.resultType, b.resultType);
100
+ }
101
+ if (a.kind === "state" && b.kind === "state") {
102
+ return typesEqual(a.valueType, b.valueType);
103
+ }
104
+ if ((a.kind === "class" || a.kind === "interface" || a.kind === "enum") && "name" in b) {
105
+ return a.name === b.name;
106
+ }
107
+ return true;
108
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "kopscript",
3
+ "version": "0.1.0",
4
+ "description": "KopScript: a small OOP, strongly-typed language that transpiles to JavaScript",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Joe Koppin <koppinjo@gmail.com>",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://dev.azure.com/koppinator/Koppindependence/_git/Kop"
11
+ },
12
+ "keywords": [
13
+ "language",
14
+ "compiler",
15
+ "transpiler",
16
+ "typescript",
17
+ "javascript"
18
+ ],
19
+ "main": "./dist/modules.js",
20
+ "files": [
21
+ "dist",
22
+ "bin"
23
+ ],
24
+ "bin": {
25
+ "ks": "bin/ks.js"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "prepublishOnly": "npm run build",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "ks": "tsx src/cli.ts"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^20.14.0",
36
+ "tsx": "^4.16.0",
37
+ "typescript": "^5.5.0",
38
+ "vitest": "^2.0.0"
39
+ },
40
+ "engines": {
41
+ "node": ">=18"
42
+ }
43
+ }