实行二LL1语法分析器 下载本文

曲阜师范大学实验报告

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(\);