- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
递归下降分析算法
(二)编译原理部分
一、课程设计目的
在进行了专业基础课和《编译原理》课程的基础上,设计一个实际的程序语言的编译系统旨在加深对程序语言结构和机器处理方式的理解,初步掌握高级语言到机器指令的转换的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。
二、课程实习任务
构造文法的递归下降分析
三、设计思路和算法描述
1. 基本原理
递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。
2. 文法要求
递归下降法要满足的条件:假设A的全部产生式为A(α1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式
predict(A(αi)∩predict(A(αj)=Φ,当i≠j.
3. 实现原理
假设文法中有如下的产生式A((1 | (2 | … | (n,则应按如下方法编写语法分析子程序
procedure A()
begin if token(Predict(A((1) then θ((1) else
if token(Predict(A((2) then θ((2) else
……
if token(Predict(A((n) then θ((n) else
error()
end
四、实验步骤
1.求SNL文法中每个产生式Predict集合
Predict(A(β) = First(β) ,?????????? 当((First(β)
= (First(β)-{ (})∪ Follow(A),当((First(β)
根据Predict集合的定义求SNL的文法中每个产生式的Predict集合,判断是否满足递归下降法分析条件,若不满足用消除左递归和消除公共前缀等文法等价变化算法对文法进行变换,使其满足递归下降法的要求。
五、程序设计
public class Main {
static String str;//整个字符串
static int ptr,//游标
len,//字符串长度
step;//步骤
static boolean right;
static boolean Advance() {//前进一个字符
if (ptr len - 1) {
ptr++;
pri();
return true;
} else {
return false;
}
}
static void pri(String s) {//输出推导过程
step++;
System.out.println(step + \t + str.charAt(ptr) + \t + s + \t
+ str.substring(ptr));
}
static void E() {
pri(E-TG);
T();
G();
}
static void G() {
if (str.charAt(ptr) == +) {
pri(G-+TG);
if (!Advance()) {
return;
}
T();
G();
} else if (str.charAt(ptr) == -) {
pri(G--TG);
if (!Advance()) {
return;
}
T(); G();
} else {
pri(G-ε);
}
}
static void T() {
pri(T-FS);
F();S();
}
static void S() {
if (str.charAt(ptr) == *) {
pri(S-*FS);
if (!Advance()) {
return;
}
F();
S();
} else if (str.charAt(ptr) == /) {
pri(S-/FS);
if (!Advance()) {
return;
}
F(); S();
} else {
pri(S-ε);
}
}
static void F() {
if (str.charAt(ptr) == () {
pri(F-(E));
i
文档评论(0)