内容发布更新时间 : 2024/11/19 3:36:17星期一 下面是文章的全部内容请认真阅读。
曲阜师范大学实验报告
No. 2010416573
计算机 系 2010年级 网络工程二 班
组 日期2012-10-9
姓名 王琳
课程 编 译 原 理 成绩 教师签章 陈 矗
实验名称: LL(1)语法分析器实验报告
【实验目的】
1. 了解LL(1)语法分析是如何根据语法规则逐一分析词法分析所得到的单 词,检查语法错误,即掌握语法分析过程。 2. 掌握LL(1)语法分析器的设计与调试。 【实验内容】 文法:
E ->TE’ ,E’-> +TE‘ | ,T-> FT’ ,T’->* FT’ | ,F-> (E ) |i 针对上述文法,编写一个LL(1)语法分析程序: 1. 输入:诸如i i *i 的字符串,以#结束。
2. 处理:基于分析表进行LL(1)语法分析,判断其是否符合文法。 3. 输出:串是否合法。 【实验要求】
1. 在编程前,根据上述文法建立对应的、正确的预测分析表。 2. 设计恰当的数据结构存储预测分析表。
3. 在C、C++、Java 中选择一种擅长的编程语言编写程序,要求所编写的程 序结构清晰、正确。 【实验环境】
1. 此算法是一个java 程序,要求在eclipse软件中运行 2. 硬件windows 系统环境中 【实验分析】
读入文法,判断正误,如无误,判断是否是LL(1)文法,若是构造分析表 【实验程序】
package llyufa;
public class Accept2 {
public static StringBuffer stack=new StringBuffer(\); public static StringBuffer stack2=new StringBuffer(\);
public static void main(String arts[]){
//stack2.deleteCharAt(0);
System.out.print(accept(stack,stack2));
}
public static boolean accept(StringBuffer stack,StringBuffer stack2){//判断识别与否
boolean result=true; outer:while (true) {
}
if(result=false)
break outer;
System.out.format(\,stack+\);
System.out.format(\,stack2+\); char c1 = stack.charAt(stack.length() - 1); char c2 = stack2.charAt(0); if(c1=='#'&&c2=='#')
return true; switch (c1) { case 'E': } }
if(!E(c2)) {result=false;break outer;} break;
if(!P(c2)) {result=false;break outer;} break;
if(!T(c2)) {result=false;break outer;} break;
if(!Q(c2)) {result=false;break outer;} break;
if(!F(c2)) {result=false;break outer;} break; if(c2==c1){ } else{ }
return false;
stack.deleteCharAt(stack.length()-1); stack2.deleteCharAt(0); //System.out.println();
case 'P': //P代表E’
case 'T':
case 'Q': //Q代表T’
case 'F':
default: {//终结符的时候
return result; }
public static boolean E(char c) {//语法分析子程序 E boolean result=true; if(c=='i') { }
else if(c=='('){ } else{ }
return result; }
public static boolean P(char c){//语法分析子程序 P boolean result=true; if(c=='+') { }
else if(c==')') { }
else if(c=='#') { } else{ }
return result; }
public static boolean T(char c) {//语法分析子程序 T boolean result=true; if(c=='i') {
stack.deleteCharAt(stack.length()-1);
System.err.println(\推导时错误!不能匹配!\); result=false;
stack.deleteCharAt(stack.length()-1); //stack.append(\
stack.deleteCharAt(stack.length()-1); //stack.append(\
stack.deleteCharAt(stack.length()-1); stack.append(\);
System.err.println(\推导时错误!不能匹配!\); result=false;
stack.deleteCharAt(stack.length()-1); stack.append(\);
stack.deleteCharAt(stack.length()-1); stack.append(\);