自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (3)
  • 收藏
  • 关注

原创 静态分析之数据流分析与 SSA 入门 (二)

什么是静态单赋值 SSASSA 是 static single assignment 的缩写,也就是静态单赋值形式。顾名思义,就是每个变量只有唯一的赋值。以下图为例,左图是原始代码,里面有分支, y 变量在不同路径中有不同赋值,最后打印 y 的值。右图是等价的 SSA 形式,y 变量在两个分支中被改写为 y1, y2,在控制流交汇处插入 Ф 函数,合并了来自不同边的 y1, y2 值, 赋...

2018-11-21 01:57:14 15125 1

原创 静态分析之数据流分析与 SSA 入门 (一)

 什么是数据流分析编译器的一个重要功能是分析和优化代码。编译时分析(或称静态分析)得到若干信息后,编译器可以确定在何处应用何种变换是安全并且有利可图的。而其中一种重要的分析技术就是数据流分析。顾名思义,数据流分析就是分析数据如何在程序执行路径上流动的技术,那么数据流分析的前提条件就是基于 IR (源代码经过编译得到的中间表示形式)构造 CFG 控制流图。基于数据流分析,可以实现多种全局...

2018-11-18 23:09:32 15802

原创 编程杂感两篇

编程杂感两篇

2017-04-28 22:08:55 628 1

原创 自制脚本语言(12) 作用域与符号表

摘要:介绍了自制语言的编译器对符号表的处理。YF语言中,符号表的基本结构是hash表。每个AST,附带了3个hash表,变量表,类型表,函数表。例如就是变量表,记录变量的名称和值。类型表记录各种类型,array、class、interface、function、generic。函数表则记录了函数名和函数体、函数类型的对应关系。一个文件有若干class和interface定义,此外的部分是脚

2016-11-01 16:49:45 1638

原创 自制脚本语言(11) 类型系统

摘要:介绍了自制语言的类型系统。包含了基本类型、数组、类、接口、泛型等。

2016-11-01 16:06:53 791

原创 自制脚本语言(10) 抽象语法树AST与三地址线性IR

摘要:介绍了自制语言YFlang的AST及IR表示

2016-04-12 22:33:16 2490

原创 自制脚本语言(9) 扩充的语法

摘要:设计扩充了新的语法,除了原来的if/else/while结构和函数,增加了数组、类、接口、继承、泛型。

2016-01-21 10:29:31 701

原创 自制脚本语言(8) 从LR(1) 到 GLR parser generator

摘要:升级前文的LR(1) parser generator为GLR,为自制脚本语言加入面向对象、泛型模板和函数式编程等语法做好准备。

2016-01-11 09:22:27 3137

原创 自制脚本语言(7) 脚本语言的完善:字符串、注释

摘要:前面提到的编译器解释器的进一步完善,即加入字符串和注释的处理。

2015-12-29 10:27:16 773

原创 自制脚本语言(6) 解释器

摘要:在前文提到的编译器的基础上,设计解释器来解释运行脚本语言。

2015-12-22 14:58:59 5803

原创 自制脚本语言(5) 自制的编译器——LR(1) parser

摘要:针对自定义的脚本语言,设计LR(1) parser。LR(1) parser利用之前的parser generator生成的action table和grammar表格,生成抽象语法树(AST)作为中间语言(IR)。

2015-12-22 10:41:28 2710

原创 call/cc应该是什么类型

这篇来自我在某问答网站上的一个回答。但我觉得这个问题很有价值,我思考和写作的时间花费了很久。所以我觉得有价值保存起来。  问题是,call/cc的类型是什么。我们知道,(call/cc (lambda (k) p))有两种用法,一种是(call/cc (lambda (k) (k a))),例如(+ 1(call/cc (lambda (k) (k 2))));一种是(call/cc

2015-10-09 14:24:37 1313

原创 自制脚本语言(4) 自动生成的词法分析器

摘要:设计词法分析器。读取文件中的正则表达式及其相匹配的符号,生成由NFA到DFA转移表,最终得到表格驱动的词法分析器。

2015-09-28 14:34:48 2394

原创 Haskell心得(1) 模式匹配、高阶函数、组合函数

摘要:介绍了haskell的几种定义函数方式:模式匹配、高阶函数、函数组合

2015-07-09 09:47:20 4798

原创 自制脚本语言(3) LR(1) parser generator的实现

摘要:实现了LR(1)的parser generator,读取记录grammar的txt文件,输出记录action table与goto table的txt文件。源代码在http://download.csdn.net/detail/nklofy/8878579

2015-06-18 22:43:34 1465

原创 自制脚本语言(2) LR(1) parser generator的设计

摘要:设计一个Parser generator自动生成器,对增广文法G自动生成其LALR(1) parser语法解析器。

2015-06-16 10:23:22 1854

原创 自制脚本语言(1) 词法、语法、虚拟机的设计思路

rt

2015-06-12 11:00:28 2791

原创 scheme心得(3) 尾调用/尾递归与CPS

摘要:介绍了尾调用/尾递归调用(tail call/tail recursive call)的一般概念、形式、用法,以及CPS(continuation-passing style)的编程模式。

2015-05-26 14:36:18 2889

原创 scheme心得(2) 从列表到流,高阶函数,惰性计算

摘要:介绍了scheme的高阶函数用法,利用高阶函数处理列表,以及利用流实现惰性计算。

2015-04-30 13:21:55 2200

原创 scheme心得(1) continuation与阴阳谜题

摘要:简要介绍了scheme语言中continuation的用法。解释了阴阳谜题程序的运行过程与结果。

2015-04-23 14:34:41 2118 1

原创 《算法导论》笔记(18) 最大流 含部分习题

流网络,容量值,源结点,汇点,容量限制,流量守恒。反平行,超级源结点,超级汇点。Ford-Fulkerson方法。残存网络,增广路径,最小切割定理。f是最大流,残存网络不包含增广路径,|f|等于最小切割容量三者等价。基本的Ford-Fulkerson算法。Edmonds-Karp算法。为了算法的收敛性。残存网络中用广度优先寻找增广路径。证明运行时间为O(V*E^2):对特定一条边,其成为关

2015-03-19 12:37:17 5295 4

原创 《算法导论》笔记(17) 所有结点对最短路径 部分习题

习题25.1-6 O(n^3)时间内从已经计算出的最短路径权重矩阵L计算出前驱矩阵Π。任意的L[i, j]最短路径,若j结点前驱为k,则必然有L[i, j]= L[i, k]+ w[k, j]。如此可遍历L矩阵的第i行所有元素L[i, k],若L[i, j]= L[i, k]+ w[k, j],表明k是i-> j最短路径的j的前驱结点。习题25.1-7 在Extend_Shortest_Pat

2015-03-11 08:46:05 1999

原创 《算法导论》笔记(16) 单源最短路径 部分习题

习题21.1-3 Bellman-Ford算法改进为m+1次松弛后终止。图中结点若在s->v的路径中则作标记。松弛过程中,若有标记的结点全部不更新v值,则停止。此时松弛次数为m+1趟。习题21.1-5 松弛方法改为结点已有d值,对其所有入边选择w+ d习题21.1-6 寻找权重为负值的环。用2维矩阵保存所有结点之间的最短路径,也包括自己到自己的路径。然后按照Bellman-Ford算法运行

2015-03-03 08:38:35 5609

原创 《算法导论》笔记(15) 最小生成树 部分习题

习题23.1-11 给定图G和一棵最小生成树T,假设减少了位于T之外的某条边的权重。因为T内的边,是连接所有结点的权重最小的,那么首先将T外的减少权重的边(u, v)加入T,然后在u, v中寻找所有的路径,去掉路径中权重最大的边。习题23.2-3 使用斐波那契堆实现的Prim算法与使用二叉堆比较。因为斐波那契堆实现优先队列,使Prim算法的运行时间为O(E+VlgV),而二叉堆实现优先队列的P

2015-02-19 01:48:01 5712 2

原创 《算法导论》笔记(14) 基本的图算法 部分习题

习题22.1-5 有向图G(V, E)的平方图。链表表示时,对每结点u的Adj[u]中所有v加入队列,后边出队边将Adj[v]加入Adj[u]中。矩阵表示时,若w[i, j]、w[j, k]同时为1则将w[i, k]置1.习题22.1-6 O(V)的时间寻找通用汇点。汇点的特征是邻接矩阵的第j列除[j, j]外所有元素为1. 可将每行调整[j ,j]后作为一个整数,所有整数与运算,为1的位是汇

2015-02-17 21:14:18 602

原创 《算法导论》笔记(13) 单源最短路径,所有结点对的最短路径

单源最短路径,单目的地最短路径,单结点对最短路径,所有结点对最短路径。最短路径的子路径也是最短路径。最短路径不包含环路。松弛操作,三角不等式。前驱子图,最短路径树。  Bellman-Ford算法。边总数-1次循环,每次循环将所有边进行松弛操作,最终得到最短路径,或者报错存在w为负数的环路。relax(u, v){ if(u.d+w(u, v)<v.d) {v.d=u.d+w(u,v)

2015-02-16 09:17:50 623

原创 《算法导论》笔记(12) 基本的图算法,最小生成树

首先是图的表示。G=(V, E),两种标准表示方法。一是邻接链表,一是邻接矩阵。邻接链表有|V|条链表,链表Adj[u]包含所有与结点u有边关联的结点v。邻接矩阵是|V|*|V|的二维矩阵,aij可用来表示结点i与j之间有无边或边的权重。  广度优先搜素。从源结点出发向外扩展,访问当前结点的全部相连结点并一一入队列,然后将队列中最前结点出列以相同方法访问其子结点,直到所有结点都被访问。访问过程

2015-02-15 22:18:04 571

原创 《算法导论》笔记(11) 摊还分析 部分习题

习题11.1-3 i为2的幂时代价为i,其余代价为1,聚合分析(1+2+1+4+1+1+1+8.....)/n,若n趋近无穷大,极限为3。每次操作摊还代价为3.习题11.2-2 核算法解上题。在i/2+1到第i-1次操作之间,每次操作实际代价1,信用2,经过i/2次之后,累积信用为i,第i个操作一次性付出代价i,消耗信用为i-1,若n足够大,可知每个操作的摊还代价为3。习题11.3-2 势

2015-02-09 10:39:08 1998

原创 《算法导论》笔记(10)贪心算法 部分习题

习题16.1-4 区间图着色问题。边最多的顶点G,其边数n即需要的颜色数,也即教室数。有n种颜色,顶点标为第i种颜色,则此活动可放在第i个教室举行。从一顶点开始广度优先遍历,将相连接的点标为不同颜色,标颜色同时检查与此相连的所有点颜色不同。然后检查全部顶点,有未标色的顶点,按照上法重新开始标色。习题16.1-5 如果每个活动有值vk,要求vk总和的最大值,那么这个题就需要用动态规划求解了。时间

2015-02-09 10:38:24 3419

原创 《算法导论》笔记(9) 动态规划 部分习题

一些本章的习题的解法简答及伪码。15.1-5 斐波那契数的子问题图。每个斐波那契数与前两个斐波那契数有关。所以有N个顶点,2*(N-2)条边。15.2-4 矩阵链乘法的子问题图。N个矩阵的子问题是N-1对,所以共有(N-1)*N/2与N*(N-1)*(N-2)/2条边。15.3-6 外币兑换问题。必须是不重复的兑换。可以做一个集合S={D1, D2, D3…}代表兑换序列,sn

2015-02-09 10:37:47 570

原创 《算法导论》笔记(8) 动态规划、贪心法、摊还分析 简述

动态规划的步骤:构造最优解的结构,子问题求解后保存,计算最优解的值。最优解的结构是张表。有两种方法计算最优解,一是自顶向下递归求解,保存已知的子问题的解到数组或散列表,需要时在表中查询此解;二是自底向上求解,每个子问题只求解一次,向上合并问题直至最终得到最优解。其实这两个方法没有本质区别,因为方法1是递归定义和保存已知子问题解,本质上也是先分解到最底层然后每个子问题求解保存再向上合并。动态规划算法的运行时间与顶点和边的数量呈线性关系。动态规划算法要求可以划分彼此无关的子问题,且具有小的重叠子问题。子问题无关

2015-02-07 17:43:14 983

原创 《算法导论》笔记(7) 区间树、B树

动态顺序统计。一种是红黑树结点储存附加子树的元素数size。一种是储存中序遍历的秩r。插入、删除时对附加属性的维护。相类似的扩展的红黑树附加属性f若仅依赖于x、x.left、x.right,还可能包括x.left.f与x.right.f,则插入删除时维护所有结点的属性f,不影响O(lg(n))渐近性能。

2015-02-05 15:29:12 546

原创 《算法导论》笔记(6)链表到红黑树 部分习题

习题10.2-8, 记第i个元素的np为np1,np2… 则np0xor np1 xor np2 xor np3 ….npi得到npixor np0,np0是表头的地址。若定义np0为0x00000000,(np1xor np2 xor np3…. xor npi)即为第i+1个元素的相对地址。若要逆转链表,则查找时从最末位向前连续xor即可。习题10.4-5 二叉树那章有道题相同,不用栈不用

2015-02-05 15:28:13 491

原创 《算法导论》笔记(5)链表到红黑树

基本数据结构:链表,队列,散列表,二叉树,红黑树。栈和队列都是抽象的结构,不一定是物理连续的内存空间。但必须实现push()和pop()的抽象接口。链表有单、双向链表和循环链表。可按照iterator++或者iterator--的方式访问。另外要注意的是插入或删除时对指针的操作。某些语言不支持指针和对象,那么实现链表有2种方式。多维数组或1维数组。多维数组的实现方式是A[i][j][k]中的j

2015-02-05 11:28:11 847

原创 《算法导论》笔记(4)堆排序与快速排序 含部分习题

堆排序。堆是一个不需要指针的二叉树,不需要指针是因为对下标运算得到父、左、右三元素。不用指针的好处是省空间,交换上下元素时运算更简单,另外便于迅速定位父、子结点,构建时快速遍历同层结点以及上一层结点。但因为不用指针,需要队列(deque或vector)来储存数据,以满足动态进出的要求。而对于实际的应用场景,随着堆的增长,申请越来越大的连续内存空间,一定是要跨区域的,其实还是牵涉了指针的运算,只是封

2015-02-04 14:53:40 497

原创 《算法导论》笔记(3) 有关概率论

短篇,关于第5章。都是概率论,内容忽略,直接到习题吧。带星号的5.1-2,Random(0,1)只返回0和1,这里有个坑是二项式分布的问题,直接求和不可取。为得到random(a,b),应该将random(0,1)重复N次后,按顺序放入一个N位2进制数字中,对(b-a+1)取模,即得random(a,b)。复杂性为theta(n)。function random(a,b){ for i

2015-02-03 15:09:02 662

原创 《算法导论》读书笔记(2)复杂度、分治策略 部分习题

继续。第3章,函数的增长。这章比较简单。渐进符号,O, Θ, Ω。函数的上下界。练习3.2-8,k*ln(k)>=C1*n; k*ln(k)思考题3-6,a: n; b: lg*(n); c: log2(n); d: log2(n)-1; e:  -lg(lg(n)); f: 无穷大; g: -log3(log2(n)); h: log(lgn)(n/2) //非最优;第4章,分治

2015-02-02 15:07:27 770

原创 《算法导论》笔记(1)排序 含部分习题

为什么是《算法导论》读书笔记?因为这本书是经典中的经典,读这本书对算法学习帮助非常大,读书笔记值得写。而且从这本书的读书笔记开始写博客,也是一个比较容易上手的办法。一为复习算法,一为练笔。开篇讲算法的基本概念。从插入和归并排序举例说明伪代码的写法,算法的代价,分治的思想。2.1节有个细节,其实非常值得重视,即循环不变式。这是算法正确性的核心概念。记得曾看过一本Knuth的书《编程的修炼》,

2015-02-02 14:21:02 481

原创 开通博客

写博客的目的:1,总结经验。年纪大了,容易忘。去年看过的书,如果不经常在脑海里过一遍,发现今年已经忘得差不多了。写下来就不怕忘掉。2,温故而知新。过去的事情,做过或是看过,当时总有漏掉的角落。通过写文章复习一遍,检讨得失,查漏补缺。3,分享给其他人。寻找思想共鸣。

2015-02-02 09:08:01 309

自制脚本语言的LR(1)编译器与解释器

升级到GLR前的LR(1)的完整版。可定义函数,支持递归调用,可处理字符串和注释。

2015-12-29

自制脚本语言的LR(1)编译器与解释器

自制脚本语言的编译器与解释器。另包含词法分析器、正则表达式解析器、编译器的自动生成器。支持if、else、while、函数、递归函数等特性。例如阶乘函数: int fact(int a){if(a<=1) return 1; return a*fact(a-1);} int b=fact(5); println(b);

2015-12-22

LR(1) parser generator V0.1

个人设计的LR(1) parser generator,读取记录grammar的txt,输出action-table与goto-table的txt文件。

2015-07-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除