function parser(tokens) {
var AST = {
type: 'Drawing',
body: []
};
// 循环依次取出第一个元素,然后删除第一个元素
while (tokens.length > 0) {
var currentItem = tokens.shift();
// 判断类型,如果是单词的话,我们就分析它的语法
if (currentItem.type === 'word') {
switch(currentItem.value) {
case 'Paper' :
var expression = {
type: 'CallExpression',
name: 'Paper',
arguments: []
};
// 继续数组中字段的类型
var nextItem = tokens.shift();
if (nextItem.type === 'number') {
// 在expression对象内部加入参数信息 expression.arguments.push({
type: 'NumberLiteral',
value: nextItem.value
})
// 将expression对象放入我们的AST的body内 AST.body.push(expression);
} else {
throw 'Paper command must be followed by a number.'
}
break;
case 'Pen' :
/* 更多代码 */
break;
case 'Line':
/* 更多代码 */
break;
return AST;
}var data = [
{ type: 'word', value: 'Paper'},
{ type: 'number', value: 100}
];var output = parser(data);
console.log(output); // 打印信息如下
/*
var output = {
'type': 'Drawing',
'body': [{
"type": "CallExpression",
"name": "Paper",
"arguments": [{
"type": "NumberLiteral",
"value": "100"