LL(1)

package phrase;
/*
 * 
 * 目前还存在的问题以及改进方法
 * 1:栈中连续终结符只能默认第二为非终结符
 * 解决办法:用循环进行排除
 * 2:对非法输入扫描串不能识别
 */
import java.util.Scanner;
/*@代表空
 
 //终结符
i+*()# 
//非终结符             
EeTtF
//LL(1)表
Te   n  n   Te   n  n
n   +Te  n   n    @  @
Ft  n   n   Ft   n  n
n   @   *Ft n    @  @
i   n   n  (E)   n  n
/*
正确匹配例子
i*i+i#
i+i*i#
//错误匹配例子
  i**i#
  //栈中匹配中结束 ,但是扫描串未扫描完
  i*i+i+i#
  //扫描串匹配完成,但是栈中还有存留
  i*i#
*/
public class phrase {
   //终结符串
   static String  final_sign=null;
   //非终结符串
   static String  Nfinal=null;
public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
///////////////////////////////////////////////
/*----------------初始化表---------------------
// ///////////////////////////////////////////*/
        //接受终结符
        System.out.println("请输入终结符号集合:");
        final_sign=sc.nextLine();
        //接受非终结符
        System.out.println("请输入非终结符号集合:");
            Nfinal=sc.nextLine();

        //根据终结符与非终结符的长度创建一个表      
        int h=Nfinal.length();
        int l=final_sign.length();
        String[][] Table=new String[h][l];
        System.out.println(Table.length);
        System.out.println(Table[0].length);
        System.out.println("请输入矩阵句型:");
        for (int i = 0; i < Table.length; i++) {            //行
for (int j = 0; j < Table[0].length; j++) {     //列
Table[i][j]=sc.next();
}
}
        for (String[] strings : Table) {
for (String string : strings) {
System.out.printf("%s\t",string);
}
System.out.println();
}
        //接受输入要扫描的字符串
        System.out.println("请输入你所要扫描的字符串:");
        String input_str=sc.next();
        sc.close();
       
/*/////////////////////////////////////////////////////////
//--------------------如下进行匹配------------------------/
/////////////////////////////////////////////////////////*/
        //构建栈
        char[] sign_stack=new char[10]; 
       
        //构建指针
        int top=1;           //指向栈顶
        int lr=0;            //指向扫描字符
       
        //初始化栈
        sign_stack[0]='#';
        sign_stack[1]=Nfinal.charAt(0);
       
        //表的行坐标
        int hang=0;
        int lie=0;
       
        //取得栈顶元素
        char stack_top;
        while(sign_stack[top]!='#'||input_str.charAt(lr)!='#') {
       
        stack_top=sign_stack[top];      //取出栈顶元素
       
                /*/////////////////////////////////////////////////
                 * 
                 *            问题存在区域
                 * 
                 */////////////////////////////////////////////////
       
        //---------------判断栈顶元素是否为终结符--------------
        if(!isNfinal(stack_top)) {                                     //是终结符   
        //与扫描串当前字符匹配 
        if(stack_top==input_str.charAt(lr)){                       //可以匹配
        lr++;     //进行下一个字符匹配
        sign_stack[top]='0';
        top--;    //弹出栈顶元素终结符
        stack_top=sign_stack[top];
        }else {                                                    //句型不匹配推出
        System.out.println("GGGG!!!");
        break;
        }
        }
        //---------------进行非终结符推导----------------------
       
        hang=Nfinal.indexOf(stack_top);                          //查找在表中的行位置
        lie=final_sign.indexOf(input_str.charAt(lr));            //查找在表中的列位置
        //将当前表中符号串与字符进行比较
        if(Table[hang][lie].equals("n")) {                       //1.如果没有匹配的
        System.out.println("GG!!");
        break;
        }else {
         if(Table[hang][lie].length()==1&&Table[hang][lie].charAt(0)==input_str.charAt(lr)) {  //如果终结符匹配成功将栈顶元素弹出,并且进行下一个字符匹配
            sign_stack[top]='0';                        //出栈
            top--;                                      //栈顶指针变化
                         lr++;                                       //扫描指针发生变化
                }else if(Table[hang][lie].equals("@")){              //如果存在是空@则弹出栈顶元素
                
                sign_stack[top]='0';
            top--;
               }else {                                              //否则将栈顶元素出栈并将推导式入栈
           for(int i=Table[hang][lie].length()-1;i>=0;i--) {
            //判断将要插入的字符是否为非终结符
           
               sign_stack[top]=Table[hang][lie].charAt(i);       
               top++;
           }
           top--;
           }
         }
         }
/*//////////////////////////////////////////////////////////////
 *                  判断匹配成功
 *//////////////////////////////////////////////////////////////
        if(sign_stack[top]=='#'&&input_str.charAt(lr)=='#')
         System.out.println("匹配成功!!!");
        else {
        System.out.println("出错位置:"+lr+1);
        }
       
       
       }
/*//////////////////////////////////////////////////////////////
 *                 判断字符是否为非终结符
 *//////////////////////////////////////////////////////////////
private static boolean isNfinal(char temp) {
for (int i = 0; i < Nfinal.length(); i++) {
if(temp==Nfinal.charAt(i)) return true;
}
return false;
}

}

LL(1)