import java.util.*;
import java.math.*;
public class match {
static String str1()
{
Scanner input=new Scanner(System.in);
System.out.println("请输入要测试的字符串,回车结束。");
String s=input.next();
System.out.println("测试字符串为:"+s);
return s;
}
static void str1_Print(String s,int s1)
{
System.out.print(s.substring(s1));
System.out.print("\t\t");
}
static void match(GraTest v,stackX w)
{
// Character s=v.num[1][0].charAt(0);//将起始附赋给s
String strstr;
strstr=str1();//分析串
// int sl=strstr.length()-1;//s1字符串长度
int s1=0;
//比较栈顶符号与字符串值
int x1,a1;
x1=0;
w.StackX();//申请分配空间
w.push('#');
w.push('E');//'#''s'进栈
Character a=strstr.charAt(0);//当前终结符送a
Character x=w.peek();//取栈顶符号给x
int p=0;//p 为1 x为终结符,0 x为非终结符
int finish=0;
while(finish==0){
x=w.peek();
a=strstr.charAt(s1);
for(int t=0;t<v.num[0].length;t++)
{
Character b=v.num[0][t].charAt(0);
if(x.equals(b)||x.equals('#')) p=1;
}
if(p==1)//x为终结符
{
if(x==a){//x等于a
if(!x.equals('#'))
{
w.stack_Print();
str1_Print(strstr,s1);
System.out.println(a+"匹配");
w.pop();//弹出栈顶符号}
s1++;//读入下一个符号
if(w.isEmpty()==1)
{
System.out.println("stack is null!");
break;
}
if(s1>strstr.length()-1)
{
w.stack_Print();
str1_Print(strstr,s1);
System.out.println("string is null!");
break;
}
}
else
{
w.stack_Print();
str1_Print(strstr,s1);
System.out.println("OK");
finish=1;
}
p=0;
}
else
{
w.stack_Print();
str1_Print(strstr,s1);
System.out.println("match error!");//结束程序
break;
}
}
else//x为非终结符
{
a1=v.getA(a);//列号
x1=v.getX(x);//行号
if(x1!=0 && a1!=0)
{
w.stack_Print();
str1_Print(strstr,s1);
System.out.println(v.num[x1][a1]);
if(v.num[x1][a1].charAt(0)=='N')//是否是空串
{
w.pop();
}
else
{
w.pop();
for(int l=v.num[x1][a1].length()-1;l>=0;l--)
{
w.push(v.num[x1][a1].charAt(l));
}
}
}
else
{
w.stack_Print();
str1_Print(strstr,s1);
System.out.println("无可用的推导式");
break;
}
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GraTest v=new GraTest();
v.arr_Init();//输入表格
v.array_P();//打印表格
stackX s=new stackX();
System.out.println();
System.out.print("分析栈\t\t");
System.out.print("剩余串\t\t");
System.out.println("产生式或提示");
match(v,s);
}
}