📄 ll1up_down.java
字号:
package sun;
import java.util.*;
import javax.swing.JOptionPane;
public class LL1up_down {
/**
* LL(1)文法自上而下分析,判断输入符号串是否是此文法的句子,文法与分析表已知。
* 文法见书本P77例5.6,分析表见书本P79表5.1
*/
public static void main(String[] args) {
Hashtable<String,String> analysisTab=new Hashtable<String,String>();
AnalysisTable analysisTable=new AnalysisTable();
analysisTable.AnalysisTab(analysisTab);
//分析栈
Stack<String> stackAnalysis=new Stack<String>();
//输入串栈
Stack<String> stackLeft=new Stack<String>();
//步骤计数器
int iCount=0;
String left="";
String right="";
String strat=JOptionPane.showInputDialog(null, "输入文法识别符号:", "LL(1)文法", JOptionPane.INFORMATION_MESSAGE);
String strValue=JOptionPane.showInputDialog(null, "输入待分析字符串:", "LL(1)文法", JOptionPane.INFORMATION_MESSAGE);
//初始化分析栈&输入串
stackAnalysis.push("#");
stackAnalysis.push(strat);
System.out.println("分析栈内的字符串为 "+stackAnalysis.toString()+"\n");
strValue+="#";
System.out.println("文法识别符号为 "+strat+"\n");
System.out.println("待分析串为 "+strValue+"\n");
for(int i=strValue.length()-1 ; i>=0 ; i -- ){
stackLeft.push(strValue.substring(i, i+1));
}
System.out.println("符号栈内的字符串为 "+stackLeft.toString()+"\n");
String output="分析表";
output+="------------------------";
System.out.println(output);
//开始分析
while(!stackAnalysis.empty()&& !stackLeft.empty()){
left=stackAnalysis.pop().toString();
right=stackLeft.pop().toString();
iCount++;
if(analysisTab.get(left+right)!=""){
if(!left.equals(right)){
System.out.println(iCount + "\t" + stackAnalysis.toString() + left + "\t\t" +
right+ stackLeft.toString() + "\t"+"寻找产生式"+"\t"+left+" ::= "+analysisTab.get(left+right));
for(int j=analysisTab.get(left+right).length()-1 ; j>=0 ; j--){
//匹配就从右向左依次入栈
String strChar=analysisTab.get(left+right).substring(j,j+1);
if(!strChar.equals("$"))
stackAnalysis.push(strChar);
}
//把取出的字符串仍然送回
stackLeft.push(right);
}
else{
System.out.println(iCount + "\t" + stackAnalysis.toString()+ left + "\t\t"
+ right+stackLeft.toString() + "\t" + "'" + left + "'匹配" );
if(left.equals("#")&&right.equals("#"))
System.out.println(++iCount + "\t" + stackAnalysis.toString() + "\t\t"
+ stackLeft.toString() + "\t" + "分析成功" );
}
}
else{
System.out.println(++iCount + "\t" + stackAnalysis.toString() + left + "\t"
+ right+ stackLeft.toString()+ "\t" + "分析不成功" );
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -