经过一天的实践, 勉强写完了语法分析部分和词法分析的抽象语法树的生成部分... 但是也发现也昨天规定的词法和文法中出现的一些问题, 同时我根据情况进行了一些改动... 改动1 : 逻辑操作符 ||, && > |, & (主要是方便实现)... 改动2 : expr归入了judge类(关于这一点, ...
分类:
其他好文 时间:
2016-05-29 21:25:33
阅读次数:
269
完成了语法分析, 那么这一阶段最后要讨论的就是如何生成抽象语法树了...这一阶段称之为语法翻译 : 那么我们来看看翻译的基本思想 : 其实现如下 : 下面是具体实例 : ...
分类:
其他好文 时间:
2016-05-27 21:51:47
阅读次数:
148
到这里词法分析模块就接近尾声了, 下面对词法分析模块进行总结 : 递归下降本质上也算是自顶向下的分析算法, 适合手工编码, 它相对来说更加灵活, 能够对于特定的DSL进行更加灵活的处理优化, 但是相对来说比较慢.而自动生成器则恰好相反, 接下来是一个LR(1)语法生成器的实例 -- YACC. 首先 ...
分类:
其他好文 时间:
2016-05-27 18:19:03
阅读次数:
181
一个简单的词法分析器 词法分析(Lexical Analysis) 是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。 有关原理的介绍参考http://www.cnblo ...
分类:
编程语言 时间:
2016-05-24 20:59:20
阅读次数:
269
设计要求:对于任意输入的一个LL(1)文法,构造其预测分析表,并对指定输入串分析其是否为该文法的句子。
思路:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再根据FIRST和FOLLOW集合构造出预测分析表,并对指定的句子打印出分析栈的分析过程,判断是否为该文法的句子。
指定文法:
//文法
E->TK
K->+TK
K->$
T->FM
M->*FM
M...
分类:
其他好文 时间:
2016-05-23 15:17:17
阅读次数:
309
github 项目地址
草木瓜
准备工作
文法分析用Flex(Lex):将数据分隔成一个个的标记token (标示符identifiers,关键字keywords,数字numbers, 中括号brackets, 大括号braces, 等等etc.)
语法分析用Bison(Yacc): 在分析标记的时候生成抽象语法树. Bison 将会做掉几乎所有的这些工作, 我们定义好我们的...
分类:
其他好文 时间:
2016-05-23 15:09:32
阅读次数:
387
那么最后我就来看看这个所谓的lr(0)分析表生成算法 : 这个算法乍一看好像又和前面脱节了, 但是如果仔细看之前的讲解, 比如下图, 仔细比较, 感受一下 ... 你会发现 : 每次产生的D其实就相当于是一个新的状态, 那么再看一下closure 和 goto的具体实现 : 不难发现closure其 ...
分类:
其他好文 时间:
2016-05-23 00:35:22
阅读次数:
154
下面来具体看一下这个算法(这边可能会有点跳跃, 但是仔细看的话还是能看出来之间的联系的) : 上面已经说了, 这个算法的核心思想就是移进和归约, 移进可以看出是图中自动机的状态转化过程, 但这里的转化并不需要弹出任何字符, 只需要讲状态与字符可以得到的新状态压入即可, 每一个状态都是一个推导式, 之 ...
分类:
其他好文 时间:
2016-05-22 23:22:07
阅读次数:
462
从这一节开始研究自底向上的分析算法, 该类分析算法分析能力更加强大, 其中目前广泛运用在实际当中的一类就是LR了.. 具体来讲LR是这样的... 注意这边LR, L指的是读入程序仍然是自左向右, 但是R指的是最右推倒, 如果右边的推导从下往上看的话, 你会发现其实就是最右推导... 接着来看一个更加 ...
分类:
其他好文 时间:
2016-05-22 23:07:50
阅读次数:
228
之前一节讲完了ll(1)分析算法的主要框架, 现在我们来看看冲突的处理...冲突处理的方式有很多种, 这里讲的这种叫做消除左递归... 右上文法是左递归文法, 你会发现任何一个左递归文法都不是ll(1)的, 为什么呢 ? 比如你看文法的第0条和第1条, 分别可以写成 : E = T + T + T ...
分类:
其他好文 时间:
2016-05-22 15:08:35
阅读次数:
220