
编译原理
文章平均质量分 61
Bash_linux
这个作者很懒,什么都没留下…
展开
-
我做的YACC --1
前言如果在WiKi中查找YACC。就可以找到这样的一段话:yacc(Yet Another Compiler Compiler),是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。yacc本来只在Unix系统上才有,但现时已普遍移植往原创 2009-05-11 10:42:00 · 1530 阅读 · 0 评论 -
Epsilon闭包计算
1.1.1 Epsilon闭包计算同样使用文法S’ - > SS – > ( S ) SS - > 4.2.1节给出了8个项目状态,构成的NFA也有8个状态。如下图:图表 46通过NFA的eposilon转换,我们可以得到该文法的DFA。如下图:图表 47我们可以看到,在NFA向DFA进行eposilon转换的过程原创 2014-03-09 13:26:21 · 3383 阅读 · 0 评论 -
语法文件解释器及编译器代码生成
1 文法文件的定义语法文件使用的是LL分析方法。LL分析最简便的就是使用递归程序,或构造自动机。 WACC中,采取的硬编码的方式构造自动机。所谓硬编码,是与上章讲的按表格驱动实现自动机相对的。表格驱动往往采用一种二维数组(有可能是一种压缩的)构成状态转换表。程序读取当前符号和当前状态,查询表格来决定下个状态。代码相对比较短,对于不同的问题,仅仅需要修改表格的内容,而不需要修改代码就能解决。硬编原创 2014-03-14 23:43:44 · 1255 阅读 · 0 评论 -
LR语法分析器
YACC的实现原理。原创 2014-03-09 13:12:00 · 7991 阅读 · 0 评论 -
R(1)项目集族
1.1 R(1)项目集族1.1.1 LR(1)的定义该定义来自《编译原理及实践》(Kenneth C Louden)定义1:(LR(1)第一部分定义)假设有LR(1)项目[A - > α•Xγ, a],其中X是任意符号(终结符和非终结符),那么X有一个到项目[A - > αX•γ, a]的转换。这个定义实际与WACC对应的的部分是4.2.1节21行CSymbol* CItem:原创 2014-03-09 21:26:22 · 2513 阅读 · 0 评论 -
第三章 LALR(1)的构造
未完待续。原创 2014-03-08 21:46:59 · 4289 阅读 · 0 评论 -
复杂例子的测试
复杂例子的测试该例子生成的语言较为简单,仅仅支持整数的加减乘,不支持除法,不支持字符串。下面以两个例子展示该语言的语法。测试用例一:计算1+2+….. …+I{计算 1 + 2 +3 + 。。。}A = 0;input I;sum = 0;while A beginsum = sum + A;A = A +1end;print sum用例中,原创 2014-03-08 21:31:33 · 845 阅读 · 0 评论 -
如何机算?
3 如何机算?机算和手算的算法是一样的,不过要使用机算的话,要将抽象的概念转换为具象代码,还是有一定的难度,但大家不用灰心,我们一步一步地来。3.1 Language定义Language与上面的文法是对应的,知道上面文法的定义为一个四元组(VN, VT, P, S),如何将文法定义具象至代码呢?C/C++没有元组的概念,但是不用着急,我们可以先将元组的特性都抛开,定义一个数据结构,然后原创 2014-03-08 21:44:05 · 1040 阅读 · 0 评论 -
WACC使用的技术
WACC使用的技术WACC使用的是LALR(1)文法,先行符号集的计算采用的反向传播算法,而不是LR(1)合并同心集的算法。反向传播算法的好处是计算同心集节省空间,而且可以直接通过LR(0)文法DFA(确定性有限自动机)直接生成。本人认为,在编译原理中较难的部分在自底向上的分析,而目前的书籍均在此处退避三舍。即使有,也是手工构造SLR(1)或LR(0)的分析表。作者在在这里给读者揭示编译原原创 2014-03-08 21:36:47 · 1189 阅读 · 0 评论 -
一个复杂一点的例子
一个复杂一点的例子下面是一个复杂一点的支持Pascal子集的例子。语法文件如下:command->program;program->stmtSeq{ DPRINT("In Reduce:program->stmtSeq\n"); D(1)->Interpreter();};stmtSeq->stmtSeq NEWLINE stmt { DPRINT("原创 2014-03-08 21:30:14 · 914 阅读 · 0 评论 -
我做的YACC --2
效果生成的符号属性和DFA报告$: eposilon is 0 nt is 0 value is 0command: eposilon is 0 nt is 1 value is 1exp: eposilon is 0 nt is 1 value is 2ADD: eposilon is 0 nt is 0 value is 3term: eposilon i原创 2009-05-11 11:04:00 · 986 阅读 · 0 评论 -
第一章 first集的计算
第一章 first集的计算现在我们开始自己做的YACC部分,首先我们要计算first集。在计算first集之前,我们要了解关于文法的一些基础知识,理解这部分内容,可能会涉及到离散数学中的关系一章。显然,对关系运算的理解有助于对编译原理的理解。1 基础知识1.1 文法定义参见编译原理教材,可知一个文法定义为一个四元组(VN, VT, P, S)其中VN为非终结符号(或语法实体,或变量原创 2014-03-08 21:39:32 · 1796 阅读 · 0 评论