跳到主要内容

toAST.js

const ASTNode = require("./astNode");
const nodeTypes = require("./nodeTypes");
const tokenTypes = require("./tokenTypes");

function additive(tokenReader) {
let child1 = multiply(tokenReader);
let node = child1;
if (child1 != null) {
while (true) {
let token = tokenReader.peek();
if (
token != null &&
(token.type === tokenTypes.Plus || token.type === tokenTypes.Minus)
) {
token = tokenReader.read();
let child2 = multiply(tokenReader);
node = new ASTNode(
token.type === tokenTypes.Plus ? nodeTypes.Additive : nodeTypes.Minus
);
node.appendChild(child1);
node.appendChild(child2);
child1 = node;
} else {
break;
}
}
}
return node;
}
function multiply(tokenReader) {
let child1 = primary(tokenReader);
let node = child1;
if (child1 != null) {
while (true) {
let token = tokenReader.peek();
if (
token != null &&
(token.type === tokenTypes.Multiply || token.type === tokenTypes.Divide)
) {
token = tokenReader.read();
let child2 = primary(tokenReader);
node = new ASTNode(
token.type === tokenTypes.Multiply
? nodeTypes.Multiplicative
: nodeTypes.Divide
);
node.appendChild(child1);
node.appendChild(child2);
child1 = node;
} else {
break;
}
}
}
return node;
}
function primary(tokenReader) {
let node = number(tokenReader);
if (!node) {
let token = tokenReader.peek();
if (token != null && token.type === tokenTypes.LeftPara) {
tokenReader.read();
node = additive(tokenReader);
tokenReader.read();
}
}
return node;
}
function number(tokenReader) {
let node = null;
let token = tokenReader.peek();
if (token != null && token.type === tokenTypes.Number) {
token = tokenReader.read();
node = new ASTNode(nodeTypes.Numeric, token.value);
}
return node;
}

function toAST(tokenReader) {
let rootNode = new ASTNode(nodeTypes.Program);
let child = additive(tokenReader);
if (child) {
rootNode.appendChild(child);
}
return rootNode;
}

module.exports = toAST;