预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共13页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

《编译原理》课程 实验报告 题目语法分析器的设计与实现 专业软件工程 班级 学号 姓名 指导教师 哈尔滨工程大学软件学院 2015年5月 实验2:语法分析 一、实验目的巩固对语法分析的基本功能和原理的认识。 通过对语法分析表的自动生成加深语法分析表的认识。 理解并处理语法分析中的异常和错误。二、实验内容本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。 若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,若产生式的右部为ε,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。若不为ε,将产生式的右部逆序的入栈,取出栈顶符号进入下一步分析。 程序流程图: 本程序中使用以下文法作对用户输入的字符串进行分析: E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→i|(E) 该文法的预测分析表为: 代码: packagezhuangms.com; importjava.io.*; publicclassLL{ StringVn[]={"E","E'","T","T'","F"};//非终结符集 StringVt[]={"i","+","*","(",")","#"};//终结符集 StringP[][]=newString[5][6];//预测分析表 Stringfenxi[];//分析栈 intcount=1;//步骤 intcount1=1;//’分析栈指针 intcount2=0,count3=0;//预测分析表指针 StringinputString="";//输入的字符串 booleanflag; publicvoidsetCount(intcount,intcount1,intcount2,intcount3){ this.count=count; this.count1=count1; this.count2=count2; this.count3=count3; flag=false; } publicvoidsetFenxi(){//初始化分析栈 fenxi=newString[20]; fenxi[0]="#"; fenxi[1]="E"; } publicvoidsetP(){//初始化预测分析表 for(inti=0;i<5;i++){ for(intj=0;j<6;j++){ P[i][j]="error"; } } P[0][0]="->TE'"; P[0][3]="->TE'"; P[1][1]="->+TE'"; P[1][4]="->ε"; P[1][5]="->ε"; P[2][0]="->FT'"; P[2][3]="->FT'"; P[3][1]="->ε"; P[3][2]="->*FT'"; P[3][4]="->ε"; P[3][5]="->ε"; P[4][0]="->i"; P[4][3]="->(E)"; //打印出预测分析表 System.out.println("已构建好的预测分析表"); System.out.println("----------------------------------------------------------------------"); for(inti=0;i<6;i++){ System.out.print(""+Vt[i]); } System.out.println(); System.out.println("----------------------------------------------------------------------"); for(inti=0;i<5;i++){ System.out.print(""+Vn[i]+""); for(intj=0;j<6;j++){ intl=0; if(j>0){ l=10-P[i][