?? ll.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 + -