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);
}
}
相關文章
- LL(1)分析演算法演算法
- 企業展廳設計製作的過程分析
- 讓程式設計快樂起來的過程程式設計
- 構造 LL(1) 分析表的步驟與例題解析
- 淺讀tomcat架構設計和tomcat啟動過程(1)Tomcat架構
- 【圖片+程式碼】:GCC 連結過程中的【重定位】過程分析GC
- Rust 程式設計影片教程(進階)——029_3 過程宏Rust程式設計
- socket程式設計(1)程式設計
- windows核心程式設計--纖程Windows程式設計
- Hive原始碼分析(1)——HiveServer2啟動過程Hive原始碼Server
- Java程式設計知識列表與系統架構演化過程Java程式設計架構
- Rust 程式設計視訊教程(進階)——029_3 過程巨集Rust程式設計
- 「美餐客戶端 3.0」設計過程客戶端
- 程式執行過程記憶體分析詳解記憶體
- HDFS寫過程分析
- Linux Shell程式設計(1)Linux程式設計
- 程式排程案例分析與常見疑惑1:為何不能排程?
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- 好程式設計師大資料培訓分享Hadoop的shuffle過程程式設計師大資料Hadoop
- 記錄一次物理專業程式設計大作業完成過程程式設計
- 風變程式設計邊學習邊實操,讓過程更快樂!程式設計
- Python_非同步程式設計-併發程式設計-協程和futurePython非同步程式設計
- 頁面渲染:過程分析
- Linux 啟動過程分析Linux
- Liferay 啟動過程分析
- 資料需求分析過程
- flink:JobGraph生成過程分析
- Go 併發程式設計 - runtime 協程排程(三)Go程式設計
- Oracle儲存過程-1Oracle儲存過程
- 好程式設計師大資料培訓分享之hive儲存過程程式設計師大資料Hive儲存過程
- 好程式設計師Java培訓分享Java類載入的過程概述程式設計師Java
- Number 1 — 程式設計入門程式設計
- Linux網路程式設計(1)Linux程式設計
- 計算機課程程式設計經驗分享計算機程式設計
- iOS進階課程-Newsstand程式設計iOS程式設計
- 從SpringBoot原始碼分析 主程式配置類載入過程Spring Boot原始碼
- 資料分析過程中後設資料該如何管理
- 程式碼提交過程