oclang 1.2.3 → 1.3.2
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/.gitattributes +7 -0
- package/BUG_REGISTRY.md +6 -1
- package/CHANGELOG.md +15 -1
- package/README.md +2 -0
- package/dist/cli/ocat/index.js +0 -0
- package/dist/cli/ocm/commands/run.js +0 -5
- package/dist/cli/ocm/index.js +0 -0
- package/dist/core/ast/astBuilder.js +20 -144
- package/dist/core/ast/statements/_base.js +1 -0
- package/dist/core/ast/statements/function.js +53 -0
- package/dist/core/ast/statements/import.js +16 -0
- package/dist/core/ast/statements/io.js +45 -0
- package/dist/core/ast/statements/vars.js +37 -0
- package/dist/core/ast/types/base/statement.js +1 -0
- package/dist/core/ast/types/statements/importStatement.js +1 -0
- package/dist/core/ast/types/statements/index.js +5 -4
- package/dist/core/index.js +7 -5
- package/dist/core/lexer/tokens/keywords.js +2 -1
- package/dist/core/parser/parser.js +42 -15
- package/dist/core/runner/funcs/_base.js +1 -0
- package/dist/core/runner/funcs/functions.js +28 -0
- package/dist/core/runner/funcs/io.js +29 -0
- package/dist/core/runner/funcs/modules.js +11 -0
- package/dist/core/runner/funcs/variables.js +42 -0
- package/dist/core/runner/runner.js +16 -101
- package/dist/core/services/log.service.js +7 -7
- package/dist/shared/context/globalContext.js +7 -1
- package/dist/shared/manager/baseManager.js +5 -3
- package/dist/shared/manager/warn/coreWarnings.js +2 -2
- package/package.json +30 -30
- package/src/cli/ocm/commands/run.ts +0 -5
- package/src/core/ast/astBuilder.ts +16 -9
- package/src/core/ast/statements/_base.ts +3 -0
- package/src/core/ast/statements/function.ts +8 -6
- package/src/core/ast/statements/import.ts +22 -0
- package/src/core/ast/statements/io.ts +7 -8
- package/src/core/ast/statements/vars.ts +37 -38
- package/src/core/ast/types/base/statement.ts +2 -1
- package/src/core/ast/types/statements/callStatement.ts +1 -2
- package/src/core/ast/types/statements/functionStatement.ts +2 -2
- package/src/core/ast/types/statements/importStatement.ts +6 -0
- package/src/core/ast/types/statements/index.ts +12 -9
- package/src/core/ast/types/statements/printStatement.ts +2 -2
- package/src/core/ast/types/statements/variableStatement.ts +2 -2
- package/src/core/context/coreContext.ts +3 -3
- package/src/core/index.ts +8 -5
- package/src/core/parser/parser.ts +40 -17
- package/src/core/runner/funcs/_base.ts +3 -0
- package/src/core/runner/funcs/functions.ts +46 -0
- package/src/core/runner/funcs/io.ts +38 -0
- package/src/core/runner/funcs/modules.ts +17 -0
- package/src/core/runner/funcs/variables.ts +57 -0
- package/src/core/runner/runner.ts +27 -121
- package/src/core/services/log.service.ts +24 -16
- package/src/shared/context/globalContext.ts +12 -1
- package/src/shared/manager/baseManager.ts +5 -3
- package/src/shared/manager/warn/coreWarnings.ts +2 -2
- package/src/shared/models/func.ts +1 -1
- package/tsconfig.json +3 -3
- package/src/core/ast/statements/base.ts +0 -3
package/.gitattributes
ADDED
package/BUG_REGISTRY.md
CHANGED
|
@@ -7,9 +7,14 @@ BUG-\<BUG-NUMBER>\<BUG-PART>-\<VERSION>-\<VERSION-FORMAT>
|
|
|
7
7
|
## 1.X.X bugs
|
|
8
8
|
|
|
9
9
|
- BUG-002A-100-MmP: CLI always uses force mode
|
|
10
|
-
- BUG-002B-
|
|
10
|
+
- BUG-002B-100-MmP: The errors in the CLI shows 'undefined'
|
|
11
11
|
- BUG-002C-100-MmP: Dist folder is not created
|
|
12
12
|
|
|
13
|
+
### 1.3.0 bugs
|
|
14
|
+
|
|
15
|
+
- BUG-003A-130-MmP: Variables don't work and prints don't work
|
|
16
|
+
- BUG-003B-130-MmP: GitAttributes file is not loaded
|
|
17
|
+
|
|
13
18
|
## 0.3.0 bugs
|
|
14
19
|
|
|
15
20
|
- BUG-001A-030-MmP: Functions don't work
|
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,20 @@ PATCH version when you make backwards-compatible bug fixes.
|
|
|
12
12
|
|
|
13
13
|
## 1.X.X - Beta and CLI
|
|
14
14
|
|
|
15
|
+
### 1.3.0 - Imports and migration
|
|
16
|
+
|
|
17
|
+
- Migration to Nodenext in TSconfig
|
|
18
|
+
- Runner structure updated
|
|
19
|
+
- Log system added
|
|
20
|
+
|
|
21
|
+
#### 1.3.2 - BUG-003B-130-MmP
|
|
22
|
+
|
|
23
|
+
- BUG-003B-130-MmP: GitAttributes file is not loaded
|
|
24
|
+
|
|
25
|
+
#### 1.3.1 - BUG-003A-130-MmP
|
|
26
|
+
|
|
27
|
+
- BUG-003A-130-MmP: Variables and prints don't work
|
|
28
|
+
|
|
15
29
|
### 1.2.0 - OCM
|
|
16
30
|
|
|
17
31
|
- OCM mode added
|
|
@@ -32,7 +46,7 @@ PATCH version when you make backwards-compatible bug fixes.
|
|
|
32
46
|
|
|
33
47
|
- BUG-002C-100-MmP: Dist folder is not created
|
|
34
48
|
|
|
35
|
-
#### 1.1.1 - BUG-002B-
|
|
49
|
+
#### 1.1.1 - BUG-002B-100-MmP
|
|
36
50
|
|
|
37
51
|
- BUG-002B-100-MmP: The errors in the CLI shows 'undefined'
|
|
38
52
|
- FileDoesntExistError and ExtensionError added
|
package/README.md
CHANGED
package/dist/cli/ocat/index.js
CHANGED
|
File without changes
|
|
@@ -8,10 +8,5 @@ export function run() {
|
|
|
8
8
|
context.set("isProject", true);
|
|
9
9
|
context.set("projectConfig", projectConfig);
|
|
10
10
|
context.set("services", {});
|
|
11
|
-
context.useObject("services", services => {
|
|
12
|
-
return {
|
|
13
|
-
log: new LoggerService(defaultLoggerConfig),
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
11
|
runfile(projectConfig.main, { force: false });
|
|
17
12
|
}
|
package/dist/cli/ocm/index.js
CHANGED
|
File without changes
|
|
@@ -1,150 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { ioStatements } from "./statements/io.js";
|
|
2
|
+
import { variableStatements } from "./statements/vars.js";
|
|
3
|
+
import { functionStatements } from "./statements/function.js";
|
|
4
|
+
import { importStatements } from "./statements/import.js";
|
|
5
|
+
const possibleStatements = [
|
|
6
|
+
...ioStatements,
|
|
7
|
+
...variableStatements,
|
|
8
|
+
...functionStatements,
|
|
9
|
+
...importStatements,
|
|
10
|
+
];
|
|
4
11
|
export function buildAst(cst) {
|
|
5
12
|
const statements = cst.children.statement ?? [];
|
|
6
13
|
const ast = [];
|
|
7
|
-
for (const
|
|
8
|
-
let
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
__tmp = variableStatement(statement);
|
|
14
|
-
__$tmp();
|
|
15
|
-
__tmp = functionStatement(statement);
|
|
16
|
-
__$tmp();
|
|
17
|
-
__tmp = callStatement(statement);
|
|
18
|
-
__$tmp();
|
|
19
|
-
}
|
|
20
|
-
return ast;
|
|
21
|
-
}
|
|
22
|
-
const printStatement = (statement) => {
|
|
23
|
-
const printStmt = statement.children.printStatement?.[0];
|
|
24
|
-
if (printStmt) {
|
|
25
|
-
const strToken = printStmt.children.StringLiteral?.[0];
|
|
26
|
-
if (strToken) {
|
|
27
|
-
return {
|
|
28
|
-
kind: StatementKind.PrintStatement,
|
|
29
|
-
sourceInfo: {
|
|
30
|
-
tokens: printStmt.children,
|
|
31
|
-
cstNode: printStmt,
|
|
32
|
-
startLine: printStmt.startLine,
|
|
33
|
-
endLine: printStmt.endLine,
|
|
34
|
-
startColumn: printStmt.startColumn,
|
|
35
|
-
endColumn: printStmt.endColumn,
|
|
36
|
-
},
|
|
37
|
-
value: {
|
|
38
|
-
value: strToken.image,
|
|
39
|
-
type: ValueType.String,
|
|
40
|
-
}
|
|
41
|
-
};
|
|
14
|
+
for (const node of statements) {
|
|
15
|
+
let built = null;
|
|
16
|
+
for (const builder of possibleStatements) {
|
|
17
|
+
built = builder(node);
|
|
18
|
+
if (built)
|
|
19
|
+
break;
|
|
42
20
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
kind: StatementKind.PrintStatement,
|
|
47
|
-
sourceInfo: {
|
|
48
|
-
tokens: printStmt.children,
|
|
49
|
-
cstNode: printStmt,
|
|
50
|
-
startLine: printStmt.startLine,
|
|
51
|
-
endLine: printStmt.endLine,
|
|
52
|
-
startColumn: printStmt.startColumn,
|
|
53
|
-
endColumn: printStmt.endColumn,
|
|
54
|
-
},
|
|
55
|
-
value: {
|
|
56
|
-
value: idToken.image,
|
|
57
|
-
type: ValueType.Identifier,
|
|
58
|
-
}
|
|
59
|
-
};
|
|
21
|
+
if (built) {
|
|
22
|
+
ast.push(built);
|
|
60
23
|
}
|
|
61
24
|
}
|
|
62
|
-
return
|
|
63
|
-
}
|
|
64
|
-
const variableStatement = (statement) => {
|
|
65
|
-
const varStmt = statement.children.variableStatement?.[0];
|
|
66
|
-
if (varStmt) {
|
|
67
|
-
const typeToken = varStmt.children.VarType?.[0];
|
|
68
|
-
const idToken = varStmt.children.Identifier?.[0];
|
|
69
|
-
const valueToken = varStmt.children.StringLiteral?.[0] ??
|
|
70
|
-
varStmt.children.NumberLiteral?.[0] ??
|
|
71
|
-
varStmt.children.BooleanLiteral?.[0];
|
|
72
|
-
if (!typeToken || !idToken || !valueToken)
|
|
73
|
-
return null;
|
|
74
|
-
const setToken = varStmt.children.Set?.[0];
|
|
75
|
-
const constToken = varStmt.children.Const?.[0];
|
|
76
|
-
const type = typeToken.image;
|
|
77
|
-
const id = idToken.image;
|
|
78
|
-
const value = valueToken.image;
|
|
79
|
-
return {
|
|
80
|
-
kind: StatementKind.VariableStatement,
|
|
81
|
-
sourceInfo: {
|
|
82
|
-
tokens: varStmt.children,
|
|
83
|
-
cstNode: varStmt,
|
|
84
|
-
startLine: varStmt.startLine,
|
|
85
|
-
endLine: varStmt.endLine,
|
|
86
|
-
startColumn: varStmt.startColumn,
|
|
87
|
-
endColumn: varStmt.endColumn,
|
|
88
|
-
},
|
|
89
|
-
id,
|
|
90
|
-
var: {
|
|
91
|
-
type,
|
|
92
|
-
value,
|
|
93
|
-
props: {
|
|
94
|
-
isConst: !!constToken,
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
set: !!setToken,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
return null;
|
|
101
|
-
};
|
|
102
|
-
const functionStatement = (statement) => {
|
|
103
|
-
const funcStmt = statement.children.functionStatement?.[0];
|
|
104
|
-
if (funcStmt) {
|
|
105
|
-
const idToken = funcStmt.children.Identifier?.[0];
|
|
106
|
-
if (!idToken)
|
|
107
|
-
return null;
|
|
108
|
-
const id = idToken.image;
|
|
109
|
-
const body = buildAst(funcStmt);
|
|
110
|
-
return {
|
|
111
|
-
kind: StatementKind.FunctionStatement,
|
|
112
|
-
sourceInfo: {
|
|
113
|
-
tokens: funcStmt.children,
|
|
114
|
-
cstNode: funcStmt,
|
|
115
|
-
startLine: funcStmt.startLine,
|
|
116
|
-
endLine: funcStmt.endLine,
|
|
117
|
-
startColumn: funcStmt.startColumn,
|
|
118
|
-
endColumn: funcStmt.endColumn,
|
|
119
|
-
},
|
|
120
|
-
id,
|
|
121
|
-
func: {
|
|
122
|
-
body,
|
|
123
|
-
scope: createCoreContext(),
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
return null;
|
|
128
|
-
};
|
|
129
|
-
const callStatement = (statement) => {
|
|
130
|
-
const callStmt = statement.children.callStatement?.[0];
|
|
131
|
-
if (callStmt) {
|
|
132
|
-
const idToken = callStmt.children.Identifier?.[0];
|
|
133
|
-
if (!idToken)
|
|
134
|
-
return null;
|
|
135
|
-
const id = idToken.image;
|
|
136
|
-
return {
|
|
137
|
-
kind: StatementKind.CallStatement,
|
|
138
|
-
sourceInfo: {
|
|
139
|
-
tokens: callStmt.children,
|
|
140
|
-
cstNode: callStmt,
|
|
141
|
-
startLine: callStmt.startLine,
|
|
142
|
-
endLine: callStmt.endLine,
|
|
143
|
-
startColumn: callStmt.startColumn,
|
|
144
|
-
endColumn: callStmt.endColumn,
|
|
145
|
-
},
|
|
146
|
-
id,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
return null;
|
|
150
|
-
};
|
|
25
|
+
return ast;
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createCoreContext } from "../../context/coreContext.js";
|
|
2
|
+
import { buildAst } from "../astBuilder.js";
|
|
3
|
+
import { StatementKind } from "../types/base/index.js";
|
|
4
|
+
const functionStatement = (statement) => {
|
|
5
|
+
const funcStmt = statement.children.functionStatement?.[0];
|
|
6
|
+
if (funcStmt) {
|
|
7
|
+
const idToken = funcStmt.children.Identifier?.[0];
|
|
8
|
+
if (!idToken)
|
|
9
|
+
return null;
|
|
10
|
+
const id = idToken.image;
|
|
11
|
+
const body = buildAst(funcStmt);
|
|
12
|
+
return {
|
|
13
|
+
kind: StatementKind.FunctionStatement,
|
|
14
|
+
sourceInfo: {
|
|
15
|
+
tokens: funcStmt.children,
|
|
16
|
+
cstNode: funcStmt,
|
|
17
|
+
startLine: funcStmt.startLine,
|
|
18
|
+
endLine: funcStmt.endLine,
|
|
19
|
+
startColumn: funcStmt.startColumn,
|
|
20
|
+
endColumn: funcStmt.endColumn,
|
|
21
|
+
},
|
|
22
|
+
id,
|
|
23
|
+
func: {
|
|
24
|
+
body,
|
|
25
|
+
scope: createCoreContext(),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
const callStatement = (statement) => {
|
|
32
|
+
const callStmt = statement.children.callStatement?.[0];
|
|
33
|
+
if (callStmt) {
|
|
34
|
+
const idToken = callStmt.children.Identifier?.[0];
|
|
35
|
+
if (!idToken)
|
|
36
|
+
return null;
|
|
37
|
+
const id = idToken.image;
|
|
38
|
+
return {
|
|
39
|
+
kind: StatementKind.CallStatement,
|
|
40
|
+
sourceInfo: {
|
|
41
|
+
tokens: callStmt.children,
|
|
42
|
+
cstNode: callStmt,
|
|
43
|
+
startLine: callStmt.startLine,
|
|
44
|
+
endLine: callStmt.endLine,
|
|
45
|
+
startColumn: callStmt.startColumn,
|
|
46
|
+
endColumn: callStmt.endColumn,
|
|
47
|
+
},
|
|
48
|
+
id,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
53
|
+
export const functionStatements = [functionStatement, callStatement];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { StatementKind } from "../types/base/index.js";
|
|
2
|
+
const importStatement = (statement) => {
|
|
3
|
+
const node = statement.children.importStatement?.[0];
|
|
4
|
+
if (!node)
|
|
5
|
+
return null;
|
|
6
|
+
const stringToken = node.children.StringLiteral?.[0];
|
|
7
|
+
if (!stringToken)
|
|
8
|
+
return null;
|
|
9
|
+
const rawValue = stringToken.image;
|
|
10
|
+
const path = rawValue.slice(1, -1);
|
|
11
|
+
return {
|
|
12
|
+
kind: StatementKind.ImportStatement,
|
|
13
|
+
path,
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export const importStatements = [importStatement];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ValueType } from "../../../shared/models/value.js";
|
|
2
|
+
import { StatementKind } from "../types/base/index.js";
|
|
3
|
+
const printStatement = (statement) => {
|
|
4
|
+
const printStmt = statement.children.printStatement?.[0];
|
|
5
|
+
if (printStmt) {
|
|
6
|
+
const strToken = printStmt.children.StringLiteral?.[0];
|
|
7
|
+
if (strToken) {
|
|
8
|
+
return {
|
|
9
|
+
kind: StatementKind.PrintStatement,
|
|
10
|
+
sourceInfo: {
|
|
11
|
+
tokens: printStmt.children,
|
|
12
|
+
cstNode: printStmt,
|
|
13
|
+
startLine: printStmt.startLine,
|
|
14
|
+
endLine: printStmt.endLine,
|
|
15
|
+
startColumn: printStmt.startColumn,
|
|
16
|
+
endColumn: printStmt.endColumn,
|
|
17
|
+
},
|
|
18
|
+
value: {
|
|
19
|
+
value: strToken.image,
|
|
20
|
+
type: ValueType.String,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const idToken = printStmt.children.Identifier?.[0];
|
|
25
|
+
if (idToken) {
|
|
26
|
+
return {
|
|
27
|
+
kind: StatementKind.PrintStatement,
|
|
28
|
+
sourceInfo: {
|
|
29
|
+
tokens: printStmt.children,
|
|
30
|
+
cstNode: printStmt,
|
|
31
|
+
startLine: printStmt.startLine,
|
|
32
|
+
endLine: printStmt.endLine,
|
|
33
|
+
startColumn: printStmt.startColumn,
|
|
34
|
+
endColumn: printStmt.endColumn,
|
|
35
|
+
},
|
|
36
|
+
value: {
|
|
37
|
+
value: idToken.image,
|
|
38
|
+
type: ValueType.Identifier,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
};
|
|
45
|
+
export const ioStatements = [printStatement];
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { StatementKind } from "../types/base/index.js";
|
|
2
|
+
const variableStatement = (statement) => {
|
|
3
|
+
const varStmt = statement.children.variableStatement?.[0];
|
|
4
|
+
if (!varStmt)
|
|
5
|
+
return null;
|
|
6
|
+
const typeToken = varStmt.children.VarType?.[0];
|
|
7
|
+
const idToken = varStmt.children.Identifier?.[0];
|
|
8
|
+
const valueToken = varStmt.children.StringLiteral?.[0] ??
|
|
9
|
+
varStmt.children.NumberLiteral?.[0] ??
|
|
10
|
+
varStmt.children.BooleanLiteral?.[0];
|
|
11
|
+
if (!typeToken || !idToken || !valueToken)
|
|
12
|
+
return null;
|
|
13
|
+
const type = typeToken.image;
|
|
14
|
+
const id = idToken.image;
|
|
15
|
+
const value = valueToken.image;
|
|
16
|
+
return {
|
|
17
|
+
kind: StatementKind.VariableStatement,
|
|
18
|
+
sourceInfo: {
|
|
19
|
+
tokens: varStmt.children,
|
|
20
|
+
cstNode: varStmt,
|
|
21
|
+
startLine: varStmt.startLine,
|
|
22
|
+
endLine: varStmt.endLine,
|
|
23
|
+
startColumn: varStmt.startColumn,
|
|
24
|
+
endColumn: varStmt.endColumn,
|
|
25
|
+
},
|
|
26
|
+
id,
|
|
27
|
+
var: {
|
|
28
|
+
type,
|
|
29
|
+
value,
|
|
30
|
+
props: {
|
|
31
|
+
isConst: false,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
set: false,
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export const variableStatements = [variableStatement];
|
|
@@ -4,4 +4,5 @@ export var StatementKind;
|
|
|
4
4
|
StatementKind[StatementKind["VariableStatement"] = 1] = "VariableStatement";
|
|
5
5
|
StatementKind[StatementKind["FunctionStatement"] = 2] = "FunctionStatement";
|
|
6
6
|
StatementKind[StatementKind["CallStatement"] = 3] = "CallStatement";
|
|
7
|
+
StatementKind[StatementKind["ImportStatement"] = 4] = "ImportStatement";
|
|
7
8
|
})(StatementKind || (StatementKind = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export * from "./printStatement";
|
|
2
|
-
export * from "./variableStatement";
|
|
3
|
-
export * from "./functionStatement";
|
|
4
|
-
export * from "./callStatement";
|
|
1
|
+
export * from "./printStatement.js";
|
|
2
|
+
export * from "./variableStatement.js";
|
|
3
|
+
export * from "./functionStatement.js";
|
|
4
|
+
export * from "./callStatement.js";
|
|
5
|
+
export * from "./importStatement.js";
|
package/dist/core/index.js
CHANGED
|
@@ -3,8 +3,9 @@ import { OcatParser } from "./parser/parser.js";
|
|
|
3
3
|
import { run } from "./runner/runner.js";
|
|
4
4
|
import { createCoreContext } from "./context/coreContext.js";
|
|
5
5
|
import { buildAst } from "./ast/astBuilder.js";
|
|
6
|
-
import * as
|
|
6
|
+
import * as gctx from "../shared/context/globalContext.js";
|
|
7
7
|
import fs from "fs";
|
|
8
|
+
import { defaultLoggerConfig, LoggerService } from "./services/log.service.js";
|
|
8
9
|
export function execute(code) {
|
|
9
10
|
const lexingResult = ocatLexer.tokenize(code);
|
|
10
11
|
const parser = new OcatParser();
|
|
@@ -12,11 +13,12 @@ export function execute(code) {
|
|
|
12
13
|
const cst = parser.program();
|
|
13
14
|
const ast = buildAst(cst);
|
|
14
15
|
process.on("exit", () => {
|
|
15
|
-
if (
|
|
16
|
-
const logs =
|
|
16
|
+
if (gctx.get("isProject")) {
|
|
17
|
+
const logs = gctx.get("services").log.toString();
|
|
17
18
|
fs.writeFileSync(".ocat/logs.txt", logs);
|
|
18
19
|
}
|
|
19
20
|
});
|
|
20
|
-
|
|
21
|
-
run(ast,
|
|
21
|
+
gctx.pushService(new LoggerService(defaultLoggerConfig), "log");
|
|
22
|
+
const ctx = run(ast, createCoreContext());
|
|
23
|
+
return ctx;
|
|
22
24
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { createToken } from "chevrotain";
|
|
2
2
|
export const Output = createToken({ name: "Output", pattern: /print/ });
|
|
3
|
-
export const
|
|
3
|
+
export const Import = createToken({ name: "Import", pattern: /import/ });
|
|
4
|
+
export const keywords = [Output, Import];
|
|
@@ -3,9 +3,7 @@ import { ValueType } from "../../shared/models/value.js";
|
|
|
3
3
|
import * as token from "../lexer/tokens/index.js";
|
|
4
4
|
export class OcatParser extends CstParser {
|
|
5
5
|
constructor() {
|
|
6
|
-
super(token.allTokens, {
|
|
7
|
-
recoveryEnabled: true,
|
|
8
|
-
});
|
|
6
|
+
super(token.allTokens, { recoveryEnabled: true });
|
|
9
7
|
this.performSelfAnalysis();
|
|
10
8
|
}
|
|
11
9
|
program = this.RULE("program", () => {
|
|
@@ -13,6 +11,11 @@ export class OcatParser extends CstParser {
|
|
|
13
11
|
});
|
|
14
12
|
statement = this.RULE("statement", () => {
|
|
15
13
|
this.OR([
|
|
14
|
+
{
|
|
15
|
+
ALT: () => this.SUBRULE(this.importStatement, {
|
|
16
|
+
LABEL: "importStatement",
|
|
17
|
+
}),
|
|
18
|
+
},
|
|
16
19
|
{
|
|
17
20
|
ALT: () => this.SUBRULE(this.printStatement, {
|
|
18
21
|
LABEL: "printStatement",
|
|
@@ -35,8 +38,13 @@ export class OcatParser extends CstParser {
|
|
|
35
38
|
},
|
|
36
39
|
]);
|
|
37
40
|
});
|
|
41
|
+
importStatement = this.RULE("importStatement", () => {
|
|
42
|
+
const imp = this.CONSUME(token.Import);
|
|
43
|
+
const path = this.CONSUME(token.StringLiteral);
|
|
44
|
+
// opcional: guardar tokens para el AST
|
|
45
|
+
});
|
|
38
46
|
printStatement = this.RULE("printStatement", () => {
|
|
39
|
-
this.CONSUME(token.Output);
|
|
47
|
+
const output = this.CONSUME(token.Output);
|
|
40
48
|
this.CONSUME(token.LeftParen);
|
|
41
49
|
this.OR([
|
|
42
50
|
...token.literals.map((lit) => ({
|
|
@@ -49,16 +57,10 @@ export class OcatParser extends CstParser {
|
|
|
49
57
|
this.CONSUME(token.RightParen);
|
|
50
58
|
});
|
|
51
59
|
variableStatement = this.RULE("variableStatement", () => {
|
|
52
|
-
this.
|
|
53
|
-
|
|
54
|
-
{ ALT: () => this.CONSUME(token.Set, { LABEL: "Set" }) },
|
|
55
|
-
{ ALT: () => this.CONSUME(token.Const, { LABEL: "Const" }) },
|
|
56
|
-
]);
|
|
57
|
-
});
|
|
58
|
-
const type = this.CONSUME(token.VarType).image;
|
|
59
|
-
this.CONSUME(token.Identifier);
|
|
60
|
+
const typeToken = this.CONSUME(token.VarType);
|
|
61
|
+
const idToken = this.CONSUME(token.Identifier);
|
|
60
62
|
this.CONSUME(token.Assign);
|
|
61
|
-
switch (
|
|
63
|
+
switch (typeToken.image) {
|
|
62
64
|
case ValueType.String:
|
|
63
65
|
this.CONSUME(token.StringLiteral);
|
|
64
66
|
break;
|
|
@@ -69,10 +71,22 @@ export class OcatParser extends CstParser {
|
|
|
69
71
|
this.CONSUME(token.BooleanLiteral);
|
|
70
72
|
break;
|
|
71
73
|
}
|
|
74
|
+
return {
|
|
75
|
+
typeToken, idToken
|
|
76
|
+
};
|
|
72
77
|
});
|
|
73
78
|
functionStatement = this.RULE("functionStatement", () => {
|
|
74
|
-
this.CONSUME(token.Function);
|
|
75
|
-
this.CONSUME(token.Identifier);
|
|
79
|
+
const funcKeyword = this.CONSUME(token.Function);
|
|
80
|
+
const idToken = this.CONSUME(token.Identifier);
|
|
81
|
+
this.CONSUME(token.LeftParen);
|
|
82
|
+
this.MANY_SEP({
|
|
83
|
+
SEP: token.Comma,
|
|
84
|
+
DEF: () => {
|
|
85
|
+
this.CONSUME(token.VarType);
|
|
86
|
+
this.CONSUME2(token.Identifier);
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
this.CONSUME(token.RightParen);
|
|
76
90
|
this.CONSUME(token.LeftBrace);
|
|
77
91
|
this.MANY(() => this.SUBRULE(this.statement));
|
|
78
92
|
this.CONSUME(token.RightBrace);
|
|
@@ -80,5 +94,18 @@ export class OcatParser extends CstParser {
|
|
|
80
94
|
callStatement = this.RULE("callStatement", () => {
|
|
81
95
|
this.CONSUME(token.Call);
|
|
82
96
|
this.CONSUME(token.Identifier);
|
|
97
|
+
this.CONSUME(token.LeftParen);
|
|
98
|
+
this.MANY_SEP({
|
|
99
|
+
SEP: token.Comma,
|
|
100
|
+
DEF: () => {
|
|
101
|
+
this.OR([
|
|
102
|
+
...token.literals.map((lit) => ({
|
|
103
|
+
ALT: () => this.CONSUME(lit),
|
|
104
|
+
})),
|
|
105
|
+
{ ALT: () => this.CONSUME2(token.Identifier) },
|
|
106
|
+
]);
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
this.CONSUME(token.RightParen);
|
|
83
110
|
});
|
|
84
111
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AlreadyDeclaredFunctionError } from "../../../shared/manager/errors/semantic/undefined/declared.js";
|
|
2
|
+
import { UndeclaredFunctionError } from "../../../shared/manager/errors/semantic/undefined/undeclared.js";
|
|
3
|
+
import { run } from "../runner.js";
|
|
4
|
+
export const functionStatement = (statement, context) => {
|
|
5
|
+
const idToken = statement.id;
|
|
6
|
+
if (!idToken)
|
|
7
|
+
return;
|
|
8
|
+
const funcData = context.functions[idToken];
|
|
9
|
+
if (funcData) {
|
|
10
|
+
new AlreadyDeclaredFunctionError(idToken).throw(statement.sourceInfo.startLine);
|
|
11
|
+
}
|
|
12
|
+
const body = statement.func.body ?? [];
|
|
13
|
+
const scope = statement.func.scope;
|
|
14
|
+
context.functions[idToken] = {
|
|
15
|
+
body,
|
|
16
|
+
scope,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export const callStatement = (statement, context) => {
|
|
20
|
+
const funcId = statement.id;
|
|
21
|
+
if (!funcId)
|
|
22
|
+
return;
|
|
23
|
+
const funcData = context.functions[funcId];
|
|
24
|
+
if (!funcData) {
|
|
25
|
+
new UndeclaredFunctionError(funcId).throw(statement.sourceInfo.startLine);
|
|
26
|
+
}
|
|
27
|
+
run(funcData.body, funcData.scope);
|
|
28
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { UndeclaredVariableError } from "../../../shared/manager/errors/semantic/undefined/undeclared.js";
|
|
2
|
+
import { ValueType } from "../../../shared/models/value.js";
|
|
3
|
+
import { solveString } from "../utils/string.js";
|
|
4
|
+
import * as ctx from "../../../shared/context/globalContext.js";
|
|
5
|
+
export const printStatement = (statement, context) => {
|
|
6
|
+
let val;
|
|
7
|
+
switch (statement.value.type) {
|
|
8
|
+
case ValueType.Identifier:
|
|
9
|
+
const id = statement.value.value;
|
|
10
|
+
const varData = context.variables[id];
|
|
11
|
+
if (varData !== undefined) {
|
|
12
|
+
val = varData.value;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
new UndeclaredVariableError(id).throw(statement.sourceInfo.startLine);
|
|
16
|
+
}
|
|
17
|
+
break;
|
|
18
|
+
case ValueType.String:
|
|
19
|
+
val = solveString(statement.value.value, context, (err) => {
|
|
20
|
+
err.throw(statement.sourceInfo.startLine);
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
val = statement.value.value;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
const info = ctx.getService("log");
|
|
28
|
+
info?.info(val);
|
|
29
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { execute } from "../../index.js";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
export const importStatement = (statement, context) => {
|
|
4
|
+
const fctx = execute(fs.readFileSync(statement.path).toString());
|
|
5
|
+
for (const [key, value] of Object.entries(fctx.variables)) {
|
|
6
|
+
context.variables[key] = value;
|
|
7
|
+
}
|
|
8
|
+
for (const [key, value] of Object.entries(fctx.functions)) {
|
|
9
|
+
context.functions[key] = value;
|
|
10
|
+
}
|
|
11
|
+
};
|