JS中的...
在学习JS的过程中, ...这个语法总是在大大简化代码的同时也提升了理解难度。本文先介绍了解构赋值,并介绍了解构赋值中...作为剩余语法的作用,之后介绍了...作为展开语法的作用。 解构赋值解构赋值是对Object和Array进行简化操作的一种特殊语法,让我们可以把数组或对象拆到一系列的变量之中。 数组解构1234let arr = ["LLLeo", "Li"];let [firstName,surname] = arr;alert(firstName); // LLLeoalert(surname); // Li 解构赋值与下面的写法是等价的: 12let firstName = arr[0];let surname = arr[1]; 实际上,这里的“数组”可以拓展为任何的可迭代对象(通过Symbol.iterator实现了迭代功能),比如Set,Map等。 123456let user = new Map();user.set("name", "John");user.set("ag ...
语法分析
在我们的编译器模型中,语法分析器从词法分析器获得一个由词法单元组成的串,并验证这个串可以由源语言的文法生成。我们期望语法分析器能够以易于理解的方式报告语法错误,并且能够从常见的错误中恢复并继续处理程序的其余部分。 ——《编译原理》(龙书) 语法分析设计在本次实验中,我采用了自底向上生成和自顶向下输出的方式,利用递归子程序对文法中定义的语法成分进行了分析和输出。本次实验的难点有:语法树的设计、消除左递归、不同语法类型判断。 整体架构编码前为了方便之后对语法节点的调用,本次实验将每个语法成分作为AST中的一个类进行存储,其中Node为抽象父类。 1234public abstract class Node { public void output(){ };} 对于Ident,FormatString和IntConst,则将其作为Token的子类,方便进行判断: 1showToken() instanceof Ident 使用showToken()预读取当前的Token,使用getToken()获取当前Token,暂时使用error( ...
JS数组
本文简单介绍了一些常用的JS数组操作,内容较为零散。 基本操作at有些编程语言允许我们使用负数索引来实现获取数组的最后一个元素,但这在JS中行不通,在JS中,我们可以使用at: 1234let fruits = ["Apple", "Orange", "Plum"];// 与 fruits[fruits.length-1] 相同alert( fruits.at(-1) ); // Plum 换句话说,arr.at(i): 如果 i >= 0,则与 arr[i] 完全相同。 对于 i 为负数的情况,它则从数组的尾部向前数。 增添元素 push(...items) 在末端添加 items 项。 pop() 从末端移除并返回该元素。 shift() 从首端移除并返回该元素。 unshift(...items) 从首端添加 items 项。 splice1arr.splice(start[, deleteCount, elem1, ..., elemN]) 从索引 start 开始修改 arr:删除 deleteCou ...
词法分析
词法分析是编译的第一阶段。主要任务是读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元序列,每个词法对应于一个词素。这个词法单元序列被输出到语法分析器进行语法分析。词法分析器通常还要和符号表进行交互。 ——《编译原理》(龙书) 词法分析设计其实词法分析也就是对字符串的匹配问题。在实验中,我采用了以枚举类容纳正则表达式进行匹配的方式,涉及到的难点主要有:注释的处理、各类符号正则匹配。 整体架构本次项目没有对编码前的设计进行修改。目前项目架构如下: 123456789.├── Compiler.java├── front └── token ├── Tokenizer.java ├── TokenList.java ...
正则表达式
在写编译的时候发现在词法分析环节可以使用正则表达式来简化分析过程,故先对正则表达式进行学习。由于平时写的最多的还是JS,所以先从JS的正则入手,然后再分析Java和JS中正则的异同。 JS正则表达式模式和修饰符在JavaScript中我们有两种创建正则表达式对象的语法: 较长一点的语法: 1regexp = new RegExp("pattern", "flags"); 较短一点的语法,使用斜线 "/": 12regexp = /pattern/; // 没有修饰符regexp = /pattern/gmi; // 带有修饰符 g、m 和 i 这两种语法之间的主要区别在于,使用斜线 /.../ 的模式不允许插入表达式(如带有 ${...} 的字符串模板)。它是完全静态的。 12let tag = prompt("What tag do you want to find?", "h2");let regexp = new RegExp(`<${tag ...
Hello World
Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment