oclang 1.2.2 → 1.2.3

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/CHANGELOG.md CHANGED
@@ -16,10 +16,13 @@ PATCH version when you make backwards-compatible bug fixes.
16
16
 
17
17
  - OCM mode added
18
18
 
19
- #### 1.2.1 - Uploading error
19
+ #### 1.2.3 - AST Structure
20
+
21
+ - AST Structure updated
22
+
23
+ #### 1.2.1 & 1.2.2 - Uploading error
20
24
 
21
25
  - Uploading error in 1.2.0
22
- - Updated the CLI ```ocm init``` command
23
26
 
24
27
  ### 1.1.0 - REPL
25
28
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oclang",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "A programming language",
5
5
  "author": "LuisRG-L, Orange Cat",
6
6
  "license": "MIT",
@@ -1,166 +1,28 @@
1
- import { createCoreContext, type CoreContext } from "../context/coreContext.js";
2
- import { ValueType } from "../../shared/models/value.js";
3
- import { StatementKind } from "./types/base/index.js";
4
1
  import type { AnyStatement, PrintStatement } from "./types/statements/index.js";
2
+ import { ioStatements } from "./statements/io.js";
3
+ import { variableStatements } from "./statements/vars.js";
4
+ import { functionStatements } from "./statements/function.js";
5
5
 
6
6
  export type BuildType = AnyStatement | null;
7
7
 
8
+
9
+ const possibleStatements = [
10
+ ...ioStatements,
11
+ ...variableStatements,
12
+ ...functionStatements,
13
+ ]
8
14
  export function buildAst(cst: any): AnyStatement[] {
9
15
  const statements = cst.children.statement ?? [];
10
16
  const ast: AnyStatement[] = [];
11
17
 
12
- for (const statement of statements) {
18
+ for (const statement of possibleStatements) {
13
19
  let __tmp: BuildType = null;
14
20
  const __$tmp = () => { if (__tmp) ast.push(__tmp); }
15
- __tmp = printStatement(statement);
16
- __$tmp();
17
- __tmp = variableStatement(statement);
18
- __$tmp();
19
- __tmp = functionStatement(statement);
20
- __$tmp();
21
- __tmp = callStatement(statement);
22
- __$tmp();
23
- }
24
-
25
- return ast;
26
- }
27
-
28
- export type FBuilder = (statement: any) => AnyStatement | null;
29
-
30
- const printStatement: FBuilder = (statement: any) => {
31
- const printStmt = statement.children.printStatement?.[0];
32
- if (printStmt) {
33
- const strToken = printStmt.children.StringLiteral?.[0];
34
- if (strToken) {
35
- return {
36
- kind: StatementKind.PrintStatement,
37
- sourceInfo: {
38
- tokens: printStmt.children,
39
- cstNode: printStmt,
40
- startLine: printStmt.startLine,
41
- endLine: printStmt.endLine,
42
- startColumn: printStmt.startColumn,
43
- endColumn: printStmt.endColumn,
44
- },
45
- value: {
46
- value: strToken.image,
47
- type: ValueType.String,
48
- }
49
- } as PrintStatement;
50
- }
51
-
52
- const idToken = printStmt.children.Identifier?.[0];
53
- if (idToken) {
54
- return {
55
- kind: StatementKind.PrintStatement,
56
- sourceInfo: {
57
- tokens: printStmt.children,
58
- cstNode: printStmt,
59
- startLine: printStmt.startLine,
60
- endLine: printStmt.endLine,
61
- startColumn: printStmt.startColumn,
62
- endColumn: printStmt.endColumn,
63
- },
64
- value: {
65
- value: idToken.image,
66
- type: ValueType.Identifier,
67
- }
68
- }
69
- }
70
- }
71
- return null;
72
- }
73
-
74
- const variableStatement: FBuilder = (statement: any) => {
75
- const varStmt = statement.children.variableStatement?.[0];
76
- if (varStmt) {
77
- const typeToken = varStmt.children.VarType?.[0];
78
- const idToken = varStmt.children.Identifier?.[0];
79
- const valueToken =
80
- varStmt.children.StringLiteral?.[0] ??
81
- varStmt.children.NumberLiteral?.[0] ??
82
- varStmt.children.BooleanLiteral?.[0];
83
-
84
- if (!typeToken || !idToken || !valueToken) return null;
85
-
86
- const setToken = varStmt.children.Set?.[0];
87
- const constToken = varStmt.children.Const?.[0];
88
-
89
- const type = typeToken.image as ValueType;
90
- const id = idToken.image;
91
- const value: string = valueToken.image;
92
- return {
93
- kind: StatementKind.VariableStatement,
94
- sourceInfo: {
95
- tokens: varStmt.children,
96
- cstNode: varStmt,
97
- startLine: varStmt.startLine,
98
- endLine: varStmt.endLine,
99
- startColumn: varStmt.startColumn,
100
- endColumn: varStmt.endColumn,
101
- },
102
- id,
103
- var: {
104
- type,
105
- value,
106
- props: {
107
- isConst: !!constToken,
108
- }
109
- },
110
- set: !!setToken,
21
+ for (const builder of statements) {
22
+ __tmp = builder(statement);
23
+ __$tmp();
111
24
  }
112
25
  }
113
- return null;
114
- }
115
26
 
116
- const functionStatement: FBuilder = (statement: any) => {
117
- const funcStmt = statement.children.functionStatement?.[0];
118
- if (funcStmt) {
119
- const idToken = funcStmt.children.Identifier?.[0];
120
- if (!idToken) return null;
121
- const id = idToken.image;
122
-
123
- const body = buildAst(funcStmt) ;
124
-
125
- return {
126
- kind: StatementKind.FunctionStatement,
127
- sourceInfo: {
128
- tokens: funcStmt.children,
129
- cstNode: funcStmt,
130
- startLine: funcStmt.startLine,
131
- endLine: funcStmt.endLine,
132
- startColumn: funcStmt.startColumn,
133
- endColumn: funcStmt.endColumn,
134
- },
135
- id,
136
- func: {
137
- body,
138
- scope: createCoreContext(),
139
- }
140
- }
141
- }
142
- return null
143
- }
144
-
145
- const callStatement: FBuilder = (statement: any) => {
146
- const callStmt = statement.children.callStatement?.[0];
147
- if (callStmt) {
148
- const idToken = callStmt.children.Identifier?.[0];
149
- if (!idToken) return null;
150
- const id = idToken.image;
151
-
152
- return {
153
- kind: StatementKind.CallStatement,
154
- sourceInfo: {
155
- tokens: callStmt.children,
156
- cstNode: callStmt,
157
- startLine: callStmt.startLine,
158
- endLine: callStmt.endLine,
159
- startColumn: callStmt.startColumn,
160
- endColumn: callStmt.endColumn,
161
- },
162
- id,
163
- };
164
- }
165
- return null;
166
- };
27
+ return ast;
28
+ }
@@ -0,0 +1,3 @@
1
+ import type { AnyStatement } from "../types/statements";
2
+
3
+ export type FBuilder = (statement: any) => AnyStatement | null;
@@ -0,0 +1,58 @@
1
+ import { createCoreContext } from "../../context/coreContext";
2
+ import { buildAst } from "../astBuilder";
3
+ import { StatementKind } from "../types/base";
4
+ import type { FBuilder } from "./base";
5
+
6
+ const functionStatement: FBuilder = (statement: any) => {
7
+ const funcStmt = statement.children.functionStatement?.[0];
8
+ if (funcStmt) {
9
+ const idToken = funcStmt.children.Identifier?.[0];
10
+ if (!idToken) return null;
11
+ const id = idToken.image;
12
+
13
+ const body = buildAst(funcStmt);
14
+
15
+ return {
16
+ kind: StatementKind.FunctionStatement,
17
+ sourceInfo: {
18
+ tokens: funcStmt.children,
19
+ cstNode: funcStmt,
20
+ startLine: funcStmt.startLine,
21
+ endLine: funcStmt.endLine,
22
+ startColumn: funcStmt.startColumn,
23
+ endColumn: funcStmt.endColumn,
24
+ },
25
+ id,
26
+ func: {
27
+ body,
28
+ scope: createCoreContext(),
29
+ },
30
+ };
31
+ }
32
+ return null;
33
+ };
34
+
35
+ const callStatement: FBuilder = (statement: any) => {
36
+ const callStmt = statement.children.callStatement?.[0];
37
+ if (callStmt) {
38
+ const idToken = callStmt.children.Identifier?.[0];
39
+ if (!idToken) return null;
40
+ const id = idToken.image;
41
+
42
+ return {
43
+ kind: StatementKind.CallStatement,
44
+ sourceInfo: {
45
+ tokens: callStmt.children,
46
+ cstNode: callStmt,
47
+ startLine: callStmt.startLine,
48
+ endLine: callStmt.endLine,
49
+ startColumn: callStmt.startColumn,
50
+ endColumn: callStmt.endColumn,
51
+ },
52
+ id,
53
+ };
54
+ }
55
+ return null;
56
+ };
57
+
58
+ export const functionStatements = [functionStatement, callStatement];
@@ -0,0 +1,51 @@
1
+ import { ValueType } from "../../../shared/models/value";
2
+ import { StatementKind } from "../types/base";
3
+ import type { PrintStatement } from "../types/statements";
4
+ import type { FBuilder } from "./base";
5
+
6
+ const printStatement: FBuilder = (statement: any) => {
7
+ const printStmt = statement.children.printStatement?.[0];
8
+ if (printStmt) {
9
+ const strToken = printStmt.children.StringLiteral?.[0];
10
+ if (strToken) {
11
+ return {
12
+ kind: StatementKind.PrintStatement,
13
+ sourceInfo: {
14
+ tokens: printStmt.children,
15
+ cstNode: printStmt,
16
+ startLine: printStmt.startLine,
17
+ endLine: printStmt.endLine,
18
+ startColumn: printStmt.startColumn,
19
+ endColumn: printStmt.endColumn,
20
+ },
21
+ value: {
22
+ value: strToken.image,
23
+ type: ValueType.String,
24
+ },
25
+ } as PrintStatement;
26
+ }
27
+
28
+ const idToken = printStmt.children.Identifier?.[0];
29
+ if (idToken) {
30
+ return {
31
+ kind: StatementKind.PrintStatement,
32
+ sourceInfo: {
33
+ tokens: printStmt.children,
34
+ cstNode: printStmt,
35
+ startLine: printStmt.startLine,
36
+ endLine: printStmt.endLine,
37
+ startColumn: printStmt.startColumn,
38
+ endColumn: printStmt.endColumn,
39
+ },
40
+ value: {
41
+ value: idToken.image,
42
+ type: ValueType.Identifier,
43
+ },
44
+ };
45
+ }
46
+ }
47
+ return null;
48
+ };
49
+
50
+
51
+ export const ioStatements = [printStatement];
@@ -0,0 +1,47 @@
1
+ import type { ValueType } from "../../../shared/models/value";
2
+ import { StatementKind } from "../types/base";
3
+ import type { FBuilder } from "./base";
4
+
5
+ const variableStatement: FBuilder = (statement: any) => {
6
+ const varStmt = statement.children.variableStatement?.[0];
7
+ if (varStmt) {
8
+ const typeToken = varStmt.children.VarType?.[0];
9
+ const idToken = varStmt.children.Identifier?.[0];
10
+ const valueToken =
11
+ varStmt.children.StringLiteral?.[0] ??
12
+ varStmt.children.NumberLiteral?.[0] ??
13
+ varStmt.children.BooleanLiteral?.[0];
14
+
15
+ if (!typeToken || !idToken || !valueToken) return null;
16
+
17
+ const setToken = varStmt.children.Set?.[0];
18
+ const constToken = varStmt.children.Const?.[0];
19
+
20
+ const type = typeToken.image as ValueType;
21
+ const id = idToken.image;
22
+ const value: string = valueToken.image;
23
+ return {
24
+ kind: StatementKind.VariableStatement,
25
+ sourceInfo: {
26
+ tokens: varStmt.children,
27
+ cstNode: varStmt,
28
+ startLine: varStmt.startLine,
29
+ endLine: varStmt.endLine,
30
+ startColumn: varStmt.startColumn,
31
+ endColumn: varStmt.endColumn,
32
+ },
33
+ id,
34
+ var: {
35
+ type,
36
+ value,
37
+ props: {
38
+ isConst: !!constToken,
39
+ },
40
+ },
41
+ set: !!setToken,
42
+ };
43
+ }
44
+ return null;
45
+ };
46
+
47
+ export const variableStatements = [variableStatement];
@@ -2,4 +2,6 @@ import { createToken } from "chevrotain";
2
2
 
3
3
  export const Output = createToken({ name: "Output", pattern: /print/ });
4
4
 
5
- export const keywords = [Output];
5
+ export const Import = createToken({ name: "Import", pattern: /import/ });
6
+
7
+ export const keywords = [Output, Import];
@@ -16,6 +16,12 @@ export class OcatParser extends CstParser {
16
16
 
17
17
  public statement = this.RULE("statement", () => {
18
18
  this.OR([
19
+ {
20
+ ALT: () =>
21
+ this.SUBRULE(this.importStatement, {
22
+ LABEL: "importStatement",
23
+ }),
24
+ },
19
25
  {
20
26
  ALT: () =>
21
27
  this.SUBRULE(this.printStatement, {
@@ -43,6 +49,11 @@ export class OcatParser extends CstParser {
43
49
  ]);
44
50
  });
45
51
 
52
+ public importStatement = this.RULE("importStatement", () => {
53
+ this.CONSUME(token.Import);
54
+ this.CONSUME(token.StringLiteral);
55
+ });
56
+
46
57
  public printStatement = this.RULE("printStatement", () => {
47
58
  this.CONSUME(token.Output);
48
59
  this.CONSUME(token.LeftParen);