📄 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 + -