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 +5 -2
- package/package.json +1 -1
- package/src/core/ast/astBuilder.ts +15 -153
- package/src/core/ast/statements/base.ts +3 -0
- package/src/core/ast/statements/function.ts +58 -0
- package/src/core/ast/statements/io.ts +51 -0
- package/src/core/ast/statements/vars.ts +47 -0
- package/src/core/lexer/tokens/keywords.ts +3 -1
- package/src/core/parser/parser.ts +11 -0
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.
|
|
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,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
|
|
18
|
+
for (const statement of possibleStatements) {
|
|
13
19
|
let __tmp: BuildType = null;
|
|
14
20
|
const __$tmp = () => { if (__tmp) ast.push(__tmp); }
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
117
|
-
|
|
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,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
|
|
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);
|