Skip to content

Commit b305224

Browse files
authored
Merge pull request #438 from sugarlabs/gsoc-dmp-2025/week-1/safwan
GSoC/DMP 2025 Week 1: feat(program): Add Abstract classes
2 parents 476b055 + 7a82d50 commit b305224

35 files changed

+1126
-1
lines changed

modules/program/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"test": "vitest --passWithNoTests",
99
"coverage": "vitest run --coverage --passWithNoTests",
1010
"check": "tsc",
11+
"dev": "ts-node src/sample/program-test.ts",
1112
"lint": "eslint src"
1213
}
1314
}

modules/program/src/@types/index.d.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
export type TNodeType =
2+
| 'Program'
3+
| 'ThreadFunctionDeclaration'
4+
| 'CustomFunctionDeclaration'
5+
| 'Block'
6+
| 'VariableDeclarationStatement'
7+
| 'VariableAssignmentStatement'
8+
| 'FunctionCallStatement'
9+
| 'JumpStatement'
10+
| 'ModifyingContextStatement'
11+
| 'DeclarativeContextStatement'
12+
| 'BranchStatement'
13+
| 'MatchStatement'
14+
| 'IterationLoopStatement'
15+
| 'ConditionLoopStatement'
16+
| 'SequenceAlterStatement'
17+
| 'NumericLiteralExpression'
18+
| 'StringLiteralExpression'
19+
| 'BooleanLiteralExpression'
20+
| 'UnaryOperatorExpression'
21+
| 'BinaryOperatorExpression'
22+
| 'FunctionCallExpression'
23+
| 'MemberExpression'
24+
| 'ArrayExpression'
25+
| 'DictExpression'
26+
| 'IdentifierExpression';
27+
28+
export type TUnaryOperator = 'sqrt' | 'abs' | 'not';
29+
export type TBinaryOperator =
30+
| 'add'
31+
| 'subtract'
32+
| 'multiply'
33+
| 'divide'
34+
| 'lessThan'
35+
| 'greaterThan'
36+
| 'equal'
37+
| 'and'
38+
| 'or';

modules/program/src/abstracts.ts

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import { TNodeType, TUnaryOperator, TBinaryOperator } from './@types/index';
2+
3+
// Base AST node
4+
export abstract class ASTNodeBase {
5+
constructor(protected readonly _type: TNodeType) {}
6+
public get type(): TNodeType {
7+
return this._type;
8+
}
9+
}
10+
11+
// Program
12+
export abstract class Program extends ASTNodeBase {
13+
constructor(public body: ASTNodeBase[]) {
14+
super('Program');
15+
}
16+
}
17+
18+
// Function Declarations
19+
export abstract class FunctionDeclaration extends ASTNodeBase {
20+
constructor(
21+
nodeType: TNodeType,
22+
public body: ASTNodeBase,
23+
) {
24+
super(nodeType);
25+
}
26+
}
27+
28+
// Thread Function Declaration
29+
export abstract class ThreadFunctionDeclaration extends FunctionDeclaration {
30+
constructor(public body: ASTNodeBase) {
31+
super('ThreadFunctionDeclaration', body);
32+
}
33+
}
34+
35+
// Custom Function Declaration
36+
export abstract class CustomFunctionDeclaration extends FunctionDeclaration {
37+
constructor(
38+
public id: IdentifierExpression,
39+
public params: IdentifierExpression[],
40+
body: ASTNodeBase,
41+
) {
42+
super('CustomFunctionDeclaration', body);
43+
}
44+
}
45+
46+
// Block
47+
export abstract class Block extends ASTNodeBase {
48+
constructor(public statements: ASTNodeBase[]) {
49+
super('Block');
50+
}
51+
}
52+
53+
// Statements
54+
export abstract class Statement extends ASTNodeBase {}
55+
56+
export abstract class SimpleStatement extends Statement {}
57+
58+
export abstract class CompoundStatement extends Statement {
59+
constructor(
60+
nodeType: TNodeType,
61+
public body: ASTNodeBase,
62+
) {
63+
super(nodeType);
64+
}
65+
}
66+
67+
// Expressions
68+
export abstract class Expression extends ASTNodeBase {}
69+
70+
export abstract class LiteralExpression extends Expression {
71+
constructor(
72+
nodeType: TNodeType,
73+
public value: number | string | boolean,
74+
) {
75+
super(nodeType);
76+
}
77+
}
78+
79+
export class NumericLiteralExpression extends LiteralExpression {
80+
constructor(public value: number) {
81+
super('NumericLiteralExpression', value);
82+
}
83+
}
84+
85+
export class StringLiteralExpression extends LiteralExpression {
86+
constructor(public value: string) {
87+
super('StringLiteralExpression', value);
88+
}
89+
}
90+
91+
export class BooleanLiteralExpression extends LiteralExpression {
92+
constructor(public value: boolean) {
93+
super('BooleanLiteralExpression', value);
94+
}
95+
}
96+
97+
export abstract class OperatorExpression extends Expression {
98+
constructor(nodeType: TNodeType) {
99+
super(nodeType);
100+
}
101+
}
102+
103+
export abstract class UnaryOperatorExpression extends OperatorExpression {
104+
constructor(
105+
nodeType: TNodeType,
106+
public operator: TUnaryOperator,
107+
public operand: Expression,
108+
) {
109+
super(nodeType);
110+
}
111+
}
112+
113+
export abstract class BinaryOperatorExpression extends OperatorExpression {
114+
constructor(
115+
nodeType: TNodeType,
116+
public operator: TBinaryOperator,
117+
public left: Expression,
118+
public right: Expression,
119+
) {
120+
super(nodeType);
121+
}
122+
}
123+
124+
// Function Call
125+
export abstract class FunctionCallExpression extends Expression {
126+
constructor(
127+
public callee: Expression,
128+
public args: { param: Expression; value: Expression }[],
129+
) {
130+
super('FunctionCallExpression');
131+
}
132+
}
133+
134+
// Member Expression
135+
export abstract class MemberExpression extends Expression {
136+
constructor(
137+
public object: Expression,
138+
public property: Expression,
139+
) {
140+
super('MemberExpression');
141+
}
142+
}
143+
144+
// Array Expression
145+
export abstract class ArrayExpression extends Expression {
146+
constructor(public elements: Expression[]) {
147+
super('ArrayExpression');
148+
}
149+
}
150+
151+
// Dict Expression
152+
export abstract class DictExpression extends Expression {
153+
constructor(public entries: { key: Expression; value: Expression }[]) {
154+
super('DictExpression');
155+
}
156+
}
157+
158+
// Identifier Expression
159+
export abstract class IdentifierExpression extends Expression {
160+
constructor(public name: string) {
161+
super('IdentifierExpression');
162+
}
163+
}

modules/program/src/ast/Block.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { ASTNodeBase, Block as BlockAbstract } from '../abstracts';
2+
3+
export class Block extends BlockAbstract {
4+
constructor(statements: ASTNodeBase[] = []) {
5+
super(statements);
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { ASTNodeBase, Program } from '../abstracts';
2+
3+
export class ProgramDeclaration extends Program {
4+
constructor(body: ASTNodeBase[]) {
5+
super(body);
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { ArrayExpression as ArrayExpressionAbstract, Expression } from '../../abstracts';
2+
3+
export class ArrayExpression extends ArrayExpressionAbstract {
4+
constructor(elements: Expression[]) {
5+
super(elements);
6+
}
7+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {
2+
BinaryOperatorExpression as BinaryOperatorExpressionAbstract,
3+
Expression,
4+
} from '../../abstracts';
5+
import { TBinaryOperator } from '../../@types/index';
6+
7+
export class BinaryOperatorExpression extends BinaryOperatorExpressionAbstract {
8+
constructor(operator: TBinaryOperator, left: Expression, right: Expression) {
9+
super('BinaryOperatorExpression', operator, left, right);
10+
}
11+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { LiteralExpression } from '../../abstracts';
2+
3+
export class BooleanLiteralExpression extends LiteralExpression {
4+
constructor(value: boolean) {
5+
super('BooleanLiteralExpression', value);
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { DictExpression as DictExpressionAbstract, Expression } from '../../abstracts';
2+
3+
export class DictExpression extends DictExpressionAbstract {
4+
constructor(entries: { key: Expression; value: Expression }[]) {
5+
super(entries);
6+
}
7+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {
2+
FunctionCallExpression as FunctionCallExpressionAbstract,
3+
Expression,
4+
} from '../../abstracts';
5+
6+
export class FunctionCallExpression extends FunctionCallExpressionAbstract {
7+
constructor(callee: Expression, args: { param: Expression; value: Expression }[]) {
8+
super(callee, args);
9+
}
10+
}

0 commit comments

Comments
 (0)