2022-11-13 11:14:30 +11:00
|
|
|
import { abstractSyntaxTree } from "./abstractSyntaxTree";
|
|
|
|
import { lexer } from "./tokeniser";
|
|
|
|
|
|
|
|
describe("testing AST", () => {
|
|
|
|
test("test 5 + 6", () => {
|
|
|
|
const tokens = lexer("5 +6");
|
|
|
|
const result = abstractSyntaxTree(tokens);
|
|
|
|
expect(result).toEqual({
|
|
|
|
type: "Program",
|
|
|
|
start: 0,
|
|
|
|
end: 4,
|
|
|
|
body: [
|
|
|
|
{
|
|
|
|
type: "ExpressionStatement",
|
|
|
|
start: 0,
|
|
|
|
end: 4,
|
|
|
|
expression: {
|
|
|
|
type: "BinaryExpression",
|
|
|
|
start: 0,
|
|
|
|
end: 4,
|
|
|
|
left: {
|
|
|
|
type: "Literal",
|
|
|
|
start: 0,
|
|
|
|
end: 1,
|
|
|
|
value: 5,
|
|
|
|
raw: "5",
|
|
|
|
},
|
|
|
|
operator: "+",
|
|
|
|
right: {
|
|
|
|
type: "Literal",
|
|
|
|
start: 3,
|
|
|
|
end: 4,
|
|
|
|
value: 6,
|
|
|
|
raw: "6",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
});
|
|
|
|
});
|
|
|
|
test("test const myVar = 5", () => {
|
|
|
|
const tokens = lexer("const myVar = 5");
|
|
|
|
const { body } = abstractSyntaxTree(tokens);
|
|
|
|
expect(body).toEqual([
|
|
|
|
{
|
|
|
|
type: "VariableDeclaration",
|
|
|
|
start: 0,
|
|
|
|
end: 15,
|
|
|
|
kind: "const",
|
|
|
|
declarations: [
|
|
|
|
{
|
|
|
|
type: "VariableDeclarator",
|
|
|
|
start: 6,
|
|
|
|
end: 15,
|
|
|
|
id: {
|
|
|
|
type: "Identifier",
|
|
|
|
start: 6,
|
|
|
|
end: 11,
|
|
|
|
name: "myVar",
|
|
|
|
},
|
|
|
|
init: {
|
|
|
|
type: "Literal",
|
|
|
|
start: 14,
|
|
|
|
end: 15,
|
|
|
|
value: 5,
|
|
|
|
raw: "5",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
});
|
|
|
|
test("test multi-line", () => {
|
|
|
|
const code = `const myVar = 5
|
|
|
|
const newVar = myVar + 1
|
|
|
|
`;
|
|
|
|
const tokens = lexer(code);
|
|
|
|
const { body } = abstractSyntaxTree(tokens);
|
|
|
|
expect(body).toEqual([
|
|
|
|
{
|
|
|
|
type: "VariableDeclaration",
|
|
|
|
start: 0,
|
|
|
|
end: 15,
|
|
|
|
kind: "const",
|
|
|
|
declarations: [
|
|
|
|
{
|
|
|
|
type: "VariableDeclarator",
|
|
|
|
start: 6,
|
|
|
|
end: 15,
|
|
|
|
id: {
|
|
|
|
type: "Identifier",
|
|
|
|
start: 6,
|
|
|
|
end: 11,
|
|
|
|
name: "myVar",
|
|
|
|
},
|
|
|
|
init: {
|
|
|
|
type: "Literal",
|
|
|
|
start: 14,
|
|
|
|
end: 15,
|
|
|
|
value: 5,
|
|
|
|
raw: "5",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: "VariableDeclaration",
|
|
|
|
start: 16,
|
|
|
|
end: 40,
|
|
|
|
kind: "const",
|
|
|
|
declarations: [
|
|
|
|
{
|
|
|
|
type: "VariableDeclarator",
|
|
|
|
start: 22,
|
|
|
|
end: 40,
|
|
|
|
id: {
|
|
|
|
type: "Identifier",
|
|
|
|
start: 22,
|
|
|
|
end: 28,
|
|
|
|
name: "newVar",
|
|
|
|
},
|
|
|
|
init: {
|
|
|
|
type: "BinaryExpression",
|
|
|
|
start: 31,
|
|
|
|
end: 40,
|
|
|
|
left: {
|
|
|
|
type: "Identifier",
|
|
|
|
start: 31,
|
|
|
|
end: 36,
|
|
|
|
name: "myVar",
|
|
|
|
},
|
|
|
|
operator: "+",
|
|
|
|
right: {
|
|
|
|
type: "Literal",
|
|
|
|
start: 39,
|
|
|
|
end: 40,
|
|
|
|
value: 1,
|
|
|
|
raw: "1",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
});
|
2022-11-14 13:28:16 +11:00
|
|
|
test('test using std function "log"', () => {
|
|
|
|
const code = `log(5, "hello", aIdentifier)`;
|
|
|
|
const tokens = lexer(code);
|
|
|
|
const { body } = abstractSyntaxTree(tokens);
|
|
|
|
expect(body).toEqual([
|
|
|
|
{
|
|
|
|
"type": "ExpressionStatement",
|
|
|
|
"start": 0,
|
|
|
|
"end": 28,
|
|
|
|
"expression": {
|
|
|
|
"type": "CallExpression",
|
|
|
|
"start": 0,
|
|
|
|
"end": 28,
|
|
|
|
"callee": {
|
|
|
|
"type": "Identifier",
|
|
|
|
"start": 0,
|
|
|
|
"end": 3,
|
|
|
|
"name": "log"
|
|
|
|
},
|
|
|
|
"arguments": [
|
|
|
|
{
|
|
|
|
"type": "Literal",
|
|
|
|
"start": 4,
|
|
|
|
"end": 5,
|
|
|
|
"value": 5,
|
|
|
|
"raw": "5"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "Literal",
|
|
|
|
"start": 7,
|
|
|
|
"end": 14,
|
|
|
|
"value": "hello",
|
|
|
|
"raw": "\"hello\""
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "Identifier",
|
|
|
|
"start": 16,
|
|
|
|
"end": 27,
|
|
|
|
"name": "aIdentifier"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"optional": false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]);
|
|
|
|
});
|
2022-11-13 11:14:30 +11:00
|
|
|
});
|