写点什么

与前端训练营的日子 --Week03

用户头像
SamGe
关注
发布于: 2020 年 11 月 15 日

又完成一周的学习,这鸭梨山大,各种琐事聚合,而且这周讲JavaScript的编译原理相关的知识,晕晕的,但是我还是尽力按照课程要求完成了学习任务。

这周以四则运算为例,通过LL算法构建AST。

  1. 通过正则表达式,进行分词,完成词法分析功能

var regexp = /([0-9\.]+)|([ \t]+)|([\r\n]+)|(\*)|(\/)|(\+)|(\-)/g;
var dictionary = ["Number", "Whitespace", "LineTerminator", "*", "/", "+", "-"];
  1. 通过LL算法,完成语法分析功能

function MultiplicativeExpression(source) {
if(source[0].type === "Number") {
let node = {
type:"MultiplicativeExpression",
children:[source[0]]
}
source[0] = node;
return MultiplicativeExpression(source);
}
if (source[0].type === "MultiplicativeExpression" && source[1] && source[1].type === "*") {
let node = {
type:"MultiplicativeExpression",
operator:"*",
children:[]
}
node.children.push(source.shift());
node.children.push(source.shift());
node.children.push(source.shift());
source.unshift(node);
return MultiplicativeExpression(source);
}
if (source[0].type === "MultiplicativeExpression" && source[1] && source[1].type === "/") {
let node = {
type:"MultiplicativeExpression",
operator:"/",
children:[]
}
node.children.push(source.shift());
node.children.push(source.shift());
node.children.push(source.shift());
source.unshift(node);
return MultiplicativeExpression(source);
}
if(source[0].type === "MultiplicativeExpression"){
return source[0];
}
return MultiplicativeExpression(source);
}



以我的能力,只能理解一部分,需要补充更多编译原理的知识。

参考资料

JavaScript词法:为什么12.toString会报错?

(小实验)理解编译原理:一个四则运算的解释器

词法分析 - 维基百科,自由的百科全书



用户头像

SamGe

关注

还未添加个人签名 2018.12.16 加入

iOS渣渣,Flutter练习生,极客大学在学🤣🤣

评论

发布
暂无评论
与前端训练营的日子 --Week03