LL(1)分析過程程式設計
LL(1)分析過程程式設計
文法:
E->T{+T}
T->F{*F}
F->i|’(‘E’)’
import java.util.Stack;
public class Demo1 {
private static String[][] M;//預測分析表
private static Stack<Character> stack;//符號棧
static {//初始化預測分析表 與符號棧
stack = new Stack<>();
stack.push('#');
stack.push('E');
M = new String[6][7];
for (int i = 0; i < M.length; i++) {
for (int j = 0; j < M[0].length; j++) {
M[i][j] = "";
}
}
//給預測分析表賦值
M[0][1] = "i";
M[0][2] = "+";
M[0][3] = "*";
M[0][4] = "(";
M[0][5] = ")";
M[0][6] = "#";
M[1][0] = "E";
M[2][0] = "e";
M[3][0] = "T";
M[4][0] = "t";
M[5][0] = "F";
M[1][1] = "Te";
M[3][1] = "Ft";
M[5][1] = "i";
M[2][2] = "+Te";
M[4][2] = " ";
M[4][3] = "*Ft";
M[1][4] = "Te";
M[3][4] = "Ft";
M[5][4] = "(E)";
M[2][5] = " ";
M[4][5] = " ";
M[2][6] = " ";
M[4][6] = " ";
}
//分析過程
public static void method(String string) {
for (int i = 0; i < string.length(); ) {
char input = string.charAt(i);
char peek = stack.peek();
// System.out.println("input:" + input + " peek:" + peek);
if (input == peek && input != '#') {//匹配
printStack();
System.out.printf("%10s",input);
System.out.println("\t\t匹配,彈出棧頂符號" + peek + ",並讀取下一個輸入符號" + string.charAt(i + 1));
stack.pop();//彈出棧頂元素 讀取下一個輸入字元
i++;
continue;
}
if (input == peek && input == '#') {//分析完成
if (stack.size() == 1) {//符號棧中只剩#
printStack();
System.out.printf("%10s",input);
System.out.println("\t\t匹配,分析成功");
break;
}
}
int row = findRow(String.valueOf(peek));//求行
int col = findCloum(String.valueOf(input));//求列
// System.out.println("row " + row + " col" + col);
String s = M[row][col];//分析表中的字串
if (" ".equals(s)) {//當T->空
printStack();
System.out.printf("%10s",input);
System.out.println("\t\t彈出棧頂符號" + peek + ",因為M[" + peek + "," + input + "]中" + peek + "->空,故不壓棧");
stack.pop();
} else if (!s.equals("") && s.length() > 0) {//不為空
printStack();
System.out.printf("%10s",input);
System.out.println("\t\t彈出棧頂符號" + peek + ",將M[" + peek + "," + input + "]中" + peek + "->" + s + "逆序壓棧");
stack.pop();
for (int j = s.length() - 1; j >= 0; j--) {
stack.push(s.charAt(j));
}
}
}
}
//求行數 E在哪一行
public static int findRow(String s) {
for (int i = 1; i < M.length; i++) {
if (s.equals(M[i][0])) {
return i;
}
}
return -1;
}
//求列數 i在哪一列
public static int findCloum(String s) {
for (int i = 1; i < M[0].length; i++) {
if (s.equals(M[0][i])) {
return i;
}
}
return -1;
}
//列印符號棧
public static void printStack() {
int i=0;
for (i = 0; i < stack.size(); i++) {
System.out.print(stack.get(i));
}
for(;i<9;i++){
System.out.printf(" ");
}
}
public static void main(String[] args) {
/* for(int i=0;i<M.length;i++){
for(int j=0;j<M[0].length;j++){
System.out.printf(M[i][j]+" ");
}
System.out.println();
}*/
System.out.println("符號棧\t\t當前輸入符號\t\t說明");
String s = "i+i*i#";
method(s);
}
}
相關文章
- PHP Socket 程式設計過程詳解PHP程式設計
- 自動化的過程(程式設計)程式設計
- Spark計算過程分析Spark
- SSL連線建立過程分析(1)
- 企業展廳設計製作的過程分析
- 讓程式設計快樂起來的過程程式設計
- 構造 LL(1) 分析表的步驟與例題解析
- 編譯原理上機作業2——LL(1)語法分析編譯原理語法分析
- 【圖片+程式碼】:GCC 連結過程中的【重定位】過程分析GC
- UI設計師的面試過程UI面試
- 坑:重構過程中的過度設計
- Hive原始碼分析(1)——HiveServer2啟動過程Hive原始碼Server
- 【Java】程式設計過程中遇到的中文編碼問題Java程式設計
- 程式設計面試過程中常見的10大演算法程式設計面試演算法
- 程式設計師的成長過程中,有哪些階段?程式設計師
- 程式設計師修煉:從新手到專家的過程程式設計師
- 物件導向和麵向過程程式設計的區別?物件程式設計
- socket程式設計(1)程式設計
- 淺讀tomcat架構設計和tomcat啟動過程(1)Tomcat架構
- HDFS寫過程分析
- 「美餐客戶端 3.0」設計過程客戶端
- 資料庫設計:儲存過程資料庫儲存過程
- windows核心程式設計--纖程Windows程式設計
- 網路協程程式設計程式設計
- Windows啟動過程(MBR引導過程分析)Windows
- 程式執行過程記憶體分析詳解記憶體
- Linux核心建立一個程式的過程分析Linux
- Rust 程式設計影片教程(進階)——029_3 過程宏Rust程式設計
- Java程式設計知識列表與系統架構演化過程Java程式設計架構
- 無程式設計基礎利用java學習OO思想的過程程式設計Java
- 專案管理過程中的問題分析方法1(轉)專案管理
- 程式排程案例分析與常見疑惑1:為何不能排程?
- PL/SQL程式設計(1)SQL程式設計
- 程式設計師生產力提升之路——Step1:需求分析程式設計師
- JWT LLJWT
- 設計師圖解TCP連線過程圖解TCP
- 設計並實現倉庫 ETL 過程
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記