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.
Files changed (60) hide show
  1. package/.gitattributes +7 -0
  2. package/BUG_REGISTRY.md +6 -1
  3. package/CHANGELOG.md +15 -1
  4. package/README.md +2 -0
  5. package/dist/cli/ocat/index.js +0 -0
  6. package/dist/cli/ocm/commands/run.js +0 -5
  7. package/dist/cli/ocm/index.js +0 -0
  8. package/dist/core/ast/astBuilder.js +20 -144
  9. package/dist/core/ast/statements/_base.js +1 -0
  10. package/dist/core/ast/statements/function.js +53 -0
  11. package/dist/core/ast/statements/import.js +16 -0
  12. package/dist/core/ast/statements/io.js +45 -0
  13. package/dist/core/ast/statements/vars.js +37 -0
  14. package/dist/core/ast/types/base/statement.js +1 -0
  15. package/dist/core/ast/types/statements/importStatement.js +1 -0
  16. package/dist/core/ast/types/statements/index.js +5 -4
  17. package/dist/core/index.js +7 -5
  18. package/dist/core/lexer/tokens/keywords.js +2 -1
  19. package/dist/core/parser/parser.js +42 -15
  20. package/dist/core/runner/funcs/_base.js +1 -0
  21. package/dist/core/runner/funcs/functions.js +28 -0
  22. package/dist/core/runner/funcs/io.js +29 -0
  23. package/dist/core/runner/funcs/modules.js +11 -0
  24. package/dist/core/runner/funcs/variables.js +42 -0
  25. package/dist/core/runner/runner.js +16 -101
  26. package/dist/core/services/log.service.js +7 -7
  27. package/dist/shared/context/globalContext.js +7 -1
  28. package/dist/shared/manager/baseManager.js +5 -3
  29. package/dist/shared/manager/warn/coreWarnings.js +2 -2
  30. package/package.json +30 -30
  31. package/src/cli/ocm/commands/run.ts +0 -5
  32. package/src/core/ast/astBuilder.ts +16 -9
  33. package/src/core/ast/statements/_base.ts +3 -0
  34. package/src/core/ast/statements/function.ts +8 -6
  35. package/src/core/ast/statements/import.ts +22 -0
  36. package/src/core/ast/statements/io.ts +7 -8
  37. package/src/core/ast/statements/vars.ts +37 -38
  38. package/src/core/ast/types/base/statement.ts +2 -1
  39. package/src/core/ast/types/statements/callStatement.ts +1 -2
  40. package/src/core/ast/types/statements/functionStatement.ts +2 -2
  41. package/src/core/ast/types/statements/importStatement.ts +6 -0
  42. package/src/core/ast/types/statements/index.ts +12 -9
  43. package/src/core/ast/types/statements/printStatement.ts +2 -2
  44. package/src/core/ast/types/statements/variableStatement.ts +2 -2
  45. package/src/core/context/coreContext.ts +3 -3
  46. package/src/core/index.ts +8 -5
  47. package/src/core/parser/parser.ts +40 -17
  48. package/src/core/runner/funcs/_base.ts +3 -0
  49. package/src/core/runner/funcs/functions.ts +46 -0
  50. package/src/core/runner/funcs/io.ts +38 -0
  51. package/src/core/runner/funcs/modules.ts +17 -0
  52. package/src/core/runner/funcs/variables.ts +57 -0
  53. package/src/core/runner/runner.ts +27 -121
  54. package/src/core/services/log.service.ts +24 -16
  55. package/src/shared/context/globalContext.ts +12 -1
  56. package/src/shared/manager/baseManager.ts +5 -3
  57. package/src/shared/manager/warn/coreWarnings.ts +2 -2
  58. package/src/shared/models/func.ts +1 -1
  59. package/tsconfig.json +3 -3
  60. package/src/core/ast/statements/base.ts +0 -3
package/.gitattributes ADDED
@@ -0,0 +1,7 @@
1
+ # Default
2
+ * text=auto eol=lf
3
+
4
+ # Windows scripts
5
+ *.ps1 text eol=crlf
6
+ *.bat text eol=crlf
7
+ *.cmd text eol=crlf
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-101-MmP: The errors in the CLI shows 'undefined'
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-101-MmP
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
@@ -13,3 +13,5 @@ bun run src/index.ts
13
13
  ```
14
14
 
15
15
  This project was created using `bun init` in bun v1.1.33. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
16
+
17
+ XX
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
  }
File without changes
@@ -1,150 +1,26 @@
1
- import { createCoreContext } from "../context/coreContext.js";
2
- import { ValueType } from "../../shared/models/value.js";
3
- import { StatementKind } from "./types/base/index.js";
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 statement of statements) {
8
- let __tmp = null;
9
- const __$tmp = () => { if (__tmp)
10
- ast.push(__tmp); };
11
- __tmp = printStatement(statement);
12
- __$tmp();
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
- const idToken = printStmt.children.Identifier?.[0];
44
- if (idToken) {
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 null;
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";
@@ -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 ctx from "../shared/context/globalContext.js";
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 (ctx.get("isProject")) {
16
- const logs = ctx.get("services").log.toString();
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
- const context = createCoreContext();
21
- run(ast, context);
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 keywords = [Output];
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.OPTION(() => {
53
- this.OR([
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 (type) {
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
+ };