資源簡介
能夠根據用戶給定的任意文法,采用LL分析方法測試句式是否符合給定的語法規范。
改寫文法為等價的LL(1)文法,消除左遞歸,消除左因子,求每個非終結符的First集合和Follow集合,構造預測分析表,輸入測試句式,給出判定結果,并說明判定依據。
參見博客代碼介紹,功能全面。

代碼片段和文件信息
package?ch02;
import?java.io.BufferedReader;
import?java.io.File;
import?java.io.FileReader;
import?java.io.IOException;
import?java.util.ArrayList;
import?java.util.HashMap;
import?java.util.HashSet;
import?java.util.linkedHashSet;
import?java.util.List;
import?java.util.Map;
import?java.util.Set;
import?java.util.Stack;
public?class?Function?{
public?static?List?inputqueue=new?ArrayList();??//存放輸入文法的非終結符順序
public?static?StringBuilder?grammar?=?new?StringBuilder();??????//存放文法
public?static?List?oldListItems?=?new?ArrayList<>();????//存放文法的產生式
public?static?Set?MarkSet=new?HashSet();????????//用來存放已經消除了左遞歸的式子的左側
public?static?List?newList?=?new?ArrayList<>();?????????//存放消除左遞歸后的文法
public?static?List?clearLeftList?=?new?ArrayList<>();???//消除左因子后的文法
public?static?List?oneFirstList?=?new?ArrayList<>();????//存放每一個非終結符的FIRST集
public?static?List?oneFollowList?=?new?ArrayList<>();???//存放每一個非終結符的FOLLOW集
public?static?Stack?analyzeStatck?=?new?Stack();//符號棧
public?static?Set?setLeftString?=?new?linkedHashSet<>();????//用來記錄一個式子是否存在左因子
public?static?Set?marksetfollow=new?HashSet();
public?static?String?action1?=?““;
public?static?String?action2?=?““;
//從指定文件中讀取文法
public?static?String?readGrammarFile(String?path)?throws?IOException?{
File?file?=?new?File(path);
@SuppressWarnings(“resource“)
BufferedReader?bufferedReader?=?new?BufferedReader(new?FileReader(file));
String?readline;
while?((readline?=?bufferedReader.readLine())?!=?null)?{
grammar.append(readline?+?“\n“);
inputqueue.add(readline.charAt(0)+““);
}
return?grammar.toString();
}
//獲得文法的產生式
public?static?List?getGrammar(String?scanner)?{
List?oldList?=?new?ArrayList<>();
String[]?grammarItems?=?scanner.split(“?|\n“);
for?(int?i?=?0;?i? oldList.add(grammarItems[i]);
}
return?oldList;
}
//獲得每一條產生式
public?static?List?getGrammarItems(String?scanner)?{
List?oldList?=?new?ArrayList<>();
String[]?grammarItems?=?scanner.split(“?|\n“);
for?(int?i?=?0;?i? oldList.add(grammarItems[i]);
int?index?=?grammarItems[i].indexOf(“-“);//第一次出現
String?str?=?grammarItems[i].substring(0?index);
String[]?items?=?grammarItems[i].split(“>|\\|“);
//?添加每一條產生式
for?(int?k?=?1;?k? oldListItems.add(str?+?“-->“?+?items[k]);
}
return?oldListItems;
}
//判斷非終結符集合中是否包含了某一個非終結符
public?static?boolean?isContain(List?vn?String?str)?{
for?(int?i?=?0;?i? if?(vn.get(i).equals(str))?{
return?true;
}
}
return?false;
}
//獲得所有非終結符(文件讀入的文法為String)
public?static?List?getVN(String?grammarItems)?{
List?vn?=?new?ArrayList<>();
String[]?string?=?grammarItems.split(“\n“);
for?(int?i?=?0;?i?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-05-30?22:25??ch02\
?????文件?????????301??2019-05-10?22:17??ch02\.classpath
?????文件?????????380??2019-05-10?22:17??ch02\.project
?????目錄???????????0??2019-05-30?20:31??ch02\.settings\
?????文件?????????598??2019-05-10?22:17??ch02\.settings\org.eclipse.jdt.core.prefs
?????文件??????????71??2019-05-12?22:18??ch02\111.txt
?????文件??????????30??2019-05-13?15:52??ch02\222.txt
?????文件??????????41??2019-05-13?20:07??ch02\333.txt
?????文件??????????30??2019-05-13?20:09??ch02\444.txt
?????文件??????????22??2019-05-28?17:26??ch02\555.txt
?????目錄???????????0??2019-05-30?20:47??ch02\bin\
?????目錄???????????0??2019-05-30?20:47??ch02\bin\ch02\
?????文件??????????38??2019-05-11?22:06??ch02\bin\ch02\data.txt
?????文件???????17302??2019-05-13?11:55??ch02\bin\ch02\data1.txt
?????文件???????24272??2019-05-30?22:16??ch02\bin\ch02\Function.class
?????文件????????5701??2019-05-30?22:19??ch02\bin\ch02\MainTest.class
?????目錄???????????0??2019-05-30?20:31??ch02\src\
?????目錄???????????0??2019-05-30?22:25??ch02\src\ch02\
?????文件???????27783??2019-05-30?22:16??ch02\src\ch02\Function.java
?????文件????????4698??2019-05-30?22:19??ch02\src\ch02\MainTest.java
- 上一篇:電力系統課程設計
- 下一篇:工資管理系統數據庫系統設計
評論
共有 條評論