⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ll.java

📁 编译器中的语法分析部分
💻 JAVA
字号:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Stack;

public class LL
{

 /*
  * LL(1)语法分析程序
  */
 public static void main(String[] args) throws IOException
 {
  String[] cols={"i","+","*","(",")","#"};//终结符表共6个元素
  String[] lines={"E","A","T","B","F"};//非终结符表共5个元素
  String[][] table={//分析表
        {"TA","","","TA","",""},
        {"","+TA","","","ε","ε"},
        {"FB","","","FB","",""},
        {"","ε","*FB","","ε","ε"},
        {"i","","","(E)","",""}
        };
   Stack st=new Stack();//建立堆栈
   StringBuffer leftString = new StringBuffer("");//建立剩余串

   st.push("#");//初始化堆栈
         System.out.print("初始化堆栈为:"+st.peek());
   st.push("E");
   System.out.println(st.peek());

   RandomAccessFile infile = null;
   infile = new RandomAccessFile("input.txt", "rw");
   System.out.print("源文件为:");
   infile.seek(0);
   for (int i = 0; i < infile.length(); i++)
   {
   		System.out.print((char) infile.readByte());
   }
   infile.seek(0);
   for (int i = 0; i < infile.length(); i++)
   leftString.append((char) infile.readByte());//剩余串在开始为源文件输入串
   System.out.println("\n剩余串为:"+leftString);
   infile.seek(0);
   int test=0;//记录步骤数
   while(!(st.peek().equals("#")&&leftString.equals("#")))
   {   System.out.print("步骤"+(++test));
       if(!st.peek().toString().equals("#"))
       System.out.print("    栈顶元素"+st.peek());
    int line=0;//获取行号
    for(int i=0;i<lines.length;i++)
    {   String s=st.peek().toString();
       if(s.equals(lines[i])){line=i;break;}
       else if(i==lines.length-1&&!s.equals(lines[i]))
     {
        System.out.print("功能完成、程序已经安全退出!");
      System.exit(0);
     }
    }
    //System.out.print(line);
    int col=0;//获取列号
    for(int i=0;i<cols.length;i++)
    {String s=leftString.charAt(0)+"";
     if(s.equals(cols[i])){col=i;break;}
     else if(i==cols.length-1&&!s.equals(cols[i]))
     {
      System.out.println("错误2:输入的串必须是终结符!");
      System.exit(0);
     }

    }
    String value=table[line][col];
    System.out.print("   产生式"+value);
    if(value.equals(""))
    {
    System.out.print("错误3:不接受该串!   ");
    System.exit(0);
    }else if(value.equals("ε"))
    {
     st.pop();
    }
    else
    {   int len=value.length();
     StringBuffer s=new StringBuffer();
        for(int i=len-1;i>=0;i--)
     s.append(value.charAt(i));//反串
        System.out.print("=>反串"+s);
     st.pop();
     for(int i=0;i<value.length();i++)
     {
      st.push(s.charAt(i));
     }


    }

    //System.out.print("    堆栈首元素"+st.peek());
    System.out.print("    剩余输入串"+leftString+"\n");
    //System.exit(0);//

    String m=leftString.charAt(0)+"";
    String n=st.peek().toString();
    if(m.equals(n))//查看是否有匹配的终结符
    {
    System.out.print("步骤"+(++test));
    System.out.print("    "+m+"匹配 (^_^)  ");

    leftString.deleteCharAt(0);
    if(!st.peek().toString().equals("#"))
    st.pop();
    System.out.print("新栈顶元素为"+st.peek());//删除匹配的终结符后的
    System.out.println("\n\n\n");
    }
   }

 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -