编译原理LL1文法分析器实验java.doc

编译原理LL(1)文法分析器实验 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。 若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,若产生式的右部为ε,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。若不为ε,将产生式的右部逆序的入栈,取出栈顶符号进入下一步分析。 程序流程图: 本程序中使用以下文法作对用户输入的字符串进行分析: E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→i|(E) 该文法的预测分析表为: 1、显示预测分析表,提示用户输入字符串 2、输入的字符串为正确的句子: 3、输入的字符串中包含了不属于终结符集的字符 4、输入的字符串不是该文法能推导出来的句子 程序代码: package ; import java.io.*; public class LL { String Vn[] = { E, E, T, T, F }; // 非终结符集 String Vt[] = { i, +, *, (, ), # }; // 终结符集 String P[][] = new String[5][6]; // 预测分析表 String fenxi[] ; // 分析栈 int count = 1; // 步骤 int count1 = 1;//’分析栈指针 int count2 = 0, count3 = 0;//预测分析表指针 String inputString = ; // 输入的字符串 boolean flag; public void setCount(int count, int count1, int count2, int count3){ this.count = count; this.count1 = count1; this.count2 = count2; this.count3 = count3; flag = false; } public void setFenxi() { // 初始化分析栈 fenxi = new String[20]; fenxi[0] = #; fenxi[1] = E; } public void setP() { // 初始化预测分析表 for (int i = 0; i 5; i++) { for (int j = 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 (int i=0; i6; i++) { System.out.print( +Vt[i]); } System.out.println(); System.out.println(----------------------------------------------------------------------); for (int i=0; i5; i++) { System.out.print( +Vn[i]+ ); for (int j=0; j6; j++) { int l = 0; if

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档