已知分析过程如下:
运行结果:
实验代码
RR.H
import java.util.*;
public class LL1 {
public static void main(String[] args) {
final int Z=0;
final int A=1;
final int a=0;
final int b=1;
final int c=2;
final int d=3;
final int E=4;//此处E代表#号
Scanner scanner = new Scanner(System.in);
String s = new String();
s=scanner.nextLine();
String[] []LLt = {{"","bAc","","dAZ",""},{"aA","","","",""}};//LL(1)分析表
Stack<Character> stack = new Stack<Character>();
stack.push(‘E‘);
stack.push(‘Z‘);
System.out.println();
int j=0;
String t;
System.out.println("栈"+"\t"+"当前符号"+"\t"+"剩余序列"+"\t"+"栈操作");
while (true){
if (j==s.length())break;
if (stack.peek() ==‘Z‘){//若栈顶为终结符,出栈并进行归约
for (char l://查看栈中当前元素
stack) {
System.out.print(l);
}
System.out.print("\t"+s.charAt(j)+"\t\t");
for (int i=j+1;i<s.length();i++){
System.out.print(s.charAt(i));
}
if (s.charAt(j)==‘a‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][a]);
t=stringReverse(LLt[Z][a]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue;
} else if (s.charAt(j) == ‘b‘) {
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][b]);
t=stringReverse(LLt[Z][b]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue;
}else if (s.charAt(j)==‘c‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][c]);
t=stringReverse(LLt[Z][c]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue;
}else if(s.charAt(j)==‘d‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][d]);
t=stringReverse(LLt[Z][d]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue;
}else if (s.charAt(j)==‘E‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][E]);
t=stringReverse(LLt[Z][E]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue; }
}else if(stack.peek()==‘A‘){//若栈顶为终结符,出栈并进行归约
for (char l://查看栈中当前元素
stack) {
System.out.print(l);
}
System.out.print("\t"+s.charAt(j)+"\t\t");
for (int i=j+1;i<s.length();i++){
System.out.print(s.charAt(i));
}
if (s.charAt(j)==‘a‘){//查表
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[A][a]);
t=stringReverse(LLt[A][a]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue;
} else if (s.charAt(j) == ‘b‘) {
System.out.println("\t\t"+"选择"+stack.peek()+"->"+"ε");
stack.pop();
for (char l://查看栈中当前元素
stack) {
System.out.print(l);
}
continue;
}else if (s.charAt(j)==‘c‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+"ε");
stack.pop();
continue;
}else if(s.charAt(j)==‘d‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+"ε");
stack.pop();
continue;
}else if (s.charAt(j)==‘E‘){
System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[A][E]);
t=stringReverse(LLt[A][E]);//将数组逆序
stack.pop();
for (int i=0;i<t.length();i++){
stack.push(t.charAt(i));//入栈
}
continue;
}
}else if(stack.peek().equals(s.charAt(j))&&stack.peek()!=‘E‘){//匹配成功栈顶元素出栈并读取下一个子符
for (char l://查看栈中当前元素
stack) {
System.out.print(l);
}
if (stack.peek()==‘c‘){
System.out.print("\t"+s.charAt(j)+"\t\t");
}
else System.out.print(""+s.charAt(j)+"\t\t");
for (int i=j+1;i<s.length();i++){
System.out.print(s.charAt(i));
}
System.out.println("\t\t"+"匹配"+ stack.peek());
stack.pop();
j++;
continue;
}else if (stack.peek()==‘E‘){
for (char l://查看栈中当前元素
stack) {
System.out.print(l);
}
System.out.print("\t"+s.charAt(j)+"\t\t");
for (int i=j+1;i<s.length();i++){
System.out.print(s.charAt(i));
}
System.out.println("\t\t"+"正确结束");
stack.pop();
j++;
continue;
}
else {
System.out.println("错误!");
System.exit(0);
}
}
}
public static String stringReverse(String s) {// 字符串逆序输出方法
String s1 = "";//接收新的逆序字符串
for (int i = s.length() - 1; i >= 0; i--) {//从后往前
String c = s.charAt(i) + "";//获取每个字符并转化为字符串
s1 += c;
}
return s1;
}
}
原文:https://www.cnblogs.com/Hukai/p/14855080.html