版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LL(1)文法判断程序java代码分为两个类import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Stack;public class LL_1 public HashMap<Character, HashSet<Character>> firstSet = new HashMap<Character, HashSet<Character>>();public HashMap<String, HashSet&
2、lt;Character>> firstSetX = new HashMap<String, HashSet<Character>>();public Character S = 'E'public HashMap<Character, HashSet<Character>> followSet = new HashMap<Character, HashSet<Character>>();public HashSet<Character> VnSet = new HashSet<
3、;Character>();public HashSet<Character> VtSet = new HashSet<Character>();public HashMap<Character, ArrayList<String>> experssionSet = new HashMap<Character, ArrayList<String>>();public String inputExperssion = "E->TK", "K->+TK", "
4、K->", "T->FM", "M->*FM", "M->", "F->i", "F->(E)" ;public String table;public Stack<Character> analyzeStatck = new Stack<Character>();public String strInput = "i+i*i#"public String action = ""int
5、index = 0;public void Init() for (String e : inputExperssion) String str = e.split("->");char c = str0.charAt(0);ArrayList<String> list = experssionSet.containsKey(c) ? experssionSet.get(c) : new ArrayList<String>();list.add(str1);experssionSet.put(c, list);for (Character c
6、: VnSet)getFirst(c);for (Character c : VnSet) ArrayList<String> l = experssionSet.get(c);for (String s : l)getFirst(s);getFollow(S);for (Character c : VnSet) getFollow(c);public void getNvNt() for (String e : inputExperssion) String str = e.split("->");VnSet.add(str0.charAt(0);for
7、 (String e : inputExperssion) String str = e.split("->");String right = str1;for (int i = 0; i < right.length(); i+)if (!VnSet.contains(right.charAt(i)VtSet.add(right.charAt(i);public void getFirst(Character c) ArrayList<String> list = experssionSet.get(c);HashSet<Character&
8、gt; set = firstSet.containsKey(c) ? firstSet.get(c) : new HashSet<Character>();/ c为终结符 直接添加if (VtSet.contains(c) set.add(c);firstSet.put(c, set);return;/ c为非终结符 处理其每条产生式for (String s : list) / c 推出空串 直接添加if (s = Character.toString('') set.add('');/ X -> Y1Y2Y3 情况else / 从左往右扫
9、描生成式右部int i = 0;while (i < s.length() char tn = s.charAt(i);/ 先处理防止未初始化getFirst(tn);HashSet<Character> tvSet = firstSet.get(tn);/ 将其first集加入左部for (Character tmp : tvSet)set.add(tmp);/ 若包含空串 处理下一个符号if (tvSet.contains('')i+;/ 否则退出 处理下一个产生式elsebreak;firstSet.put(c, set);public void get
10、First(String s) HashSet<Character> set = (firstSetX.containsKey(s) ? firstSetX.get(s) : new HashSet<Character>();/ 从左往右扫描该式int i = 0;while (i < s.length() char tn = s.charAt(i);HashSet<Character> tvSet = firstSet.get(tn);/ 将其非空 first集加入左部for (Character tmp : tvSet)if (tmp !=
11、9;')set.add(tmp);/ 若包含空串 处理下一个符号if (tvSet.contains('')i+;/ 否则结束elsebreak;/ 到了尾部 即所有符号的first集都包含空串 把空串加入if (i = s.length() set.add('');firstSetX.put(s, set);public void getFollow(char c) ArrayList<String> list = experssionSet.get(c);HashSet<Character> setA = followSet.
12、containsKey(c) ? followSet.get(c) : new HashSet<Character>();/ 如果是开始符 添加 #if (c = S) setA.add('#');/ 查找输入的所有产生式,确定c的后跟 终结符for (Character ch : VnSet) ArrayList<String> l = experssionSet.get(ch);for (String s : l)for (int i = 0; i < s.length(); i+)if (s.charAt(i) = c &&
13、i + 1 < s.length() && VtSet.contains(s.charAt(i + 1)setA.add(s.charAt(i + 1);followSet.put(c, setA);/ 处理c的每一条产生式for (String s : list) int i = s.length() - 1;while (i >= 0) char tn = s.charAt(i);/ 只处理非终结符if (VnSet.contains(tn) / 都按 A->B 形式处理/ 若不存在 followA 加入 followB/ 若存在,把的非空first集 加
14、入followB/ 若存在 且 first()包含空串 followA 加入 followB/ 若存在if (s.length() - i - 1 > 0) String right = s.substring(i + 1);/ 非空first集 加入 followBHashSet<Character> setF = null;if (right.length() = 1 && firstSet.containsKey(right.charAt(0)setF = firstSet.get(right.charAt(0);else if (!firstSetX.
15、containsKey(right) HashSet<Character> set = new HashSet<Character>();firstSetX.put(right, set);setF = firstSetX.get(right);HashSet<Character> setX = followSet.containsKey(tn) ? followSet.get(tn): new HashSet<Character>();for (Character var : setF)if (var != '')setX.ad
16、d(var);followSet.put(tn, setX);/ 若first()包含空串 followA 加入 followBif (setF.contains('') if (tn != c) HashSet<Character> setB = followSet.containsKey(tn) ? followSet.get(tn): new HashSet<Character>();for (Character var : setA)setB.add(var);followSet.put(tn, setB);/ 若不存在 followA 加入 f
17、ollowBelse / A和B相同不添加if (tn != c) HashSet<Character> setB = followSet.containsKey(tn) ? followSet.get(tn): new HashSet<Character>();for (Character var : setA)setB.add(var);followSet.put(tn, setB);i-;/ 如果是终结符往前看 如 A->aaaBCDaaaa 此时为 CDaaaaelsei-;public void createTable() Object VtArray
18、= VtSet.toArray();Object VnArray = VnSet.toArray();/ 预测分析表初始化table = new StringVnArray.length + 1VtArray.length + 1;table00 = "Vn/Vt"/ 初始化首行首列for (int i = 0; i < VtArray.length; i+)table0i + 1 = (VtArrayi.toString().charAt(0) = '') ? "#" : VtArrayi.toString();for (int
19、i = 0; i < VnArray.length; i+)tablei + 10 = VnArrayi + ""/ 全部置errorfor (int i = 0; i < VnArray.length; i+)for (int j = 0; j < VtArray.length; j+)tablei + 1j + 1 = "error"/ 插入生成式for (char A : VnSet) ArrayList<String> l = experssionSet.get(A);for (String s : l) HashS
20、et<Character> set = firstSetX.get(s);for (char a : set)insert(A, a, s);if (set.contains('') HashSet<Character> setFollow = followSet.get(A);if (setFollow.contains('#')insert(A, '#', s);for (char b : setFollow)insert(A, b, s);public void analyzeLL() System.out.prin
21、tln(" Stack Input Action");analyzeStatck.push('#');analyzeStatck.push('E');displayLL();char X = analyzeStatck.peek();while (X != '#') char a = strInput.charAt(index);if (X = a) action = "匹配 " + analyzeStatck.peek();analyzeStatck.pop();index+; else if (VtSe
22、t.contains(X)return;else if (find(X, a).equals("error")return;else if (find(X, a).equals("") analyzeStatck.pop();action = X + "->" else String str = find(X, a);if (str != "") action = X + "->" + str;analyzeStatck.pop();int len = str.length();fo
23、r (int i = len - 1; i >= 0; i-)analyzeStatck.push(str.charAt(i); else System.out.println("error at '" + strInput.charAt(index) + " in " + index);return;X = analyzeStatck.peek();displayLL();System.out.println("Successful,为LL(1)文法");public String find(char X, char a) for (in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026财信金控“晨星计划”春季全球校园招聘建设笔试参考题库及答案解析
- 2026年4月广西百色市田阳区城镇公益性岗位人员招聘3人建设考试参考试题及答案解析
- 2026年咸阳高新领航学校教师招聘建设笔试参考题库及答案解析
- 2026年湖南益阳安化县公开选调29名公务员(参公人员)建设笔试备考试题及答案解析
- 2026湖北武汉城市公共设施运营管理集团有限公司招聘6人建设笔试参考题库及答案解析
- 2026中国地质调查局局属单位招聘(第二批182人)建设考试备考试题及答案解析
- 2026湖南怀化洪江市事业单位引进高层次及急需紧缺人才39人建设考试参考题库及答案解析
- 2026北京大学马克思主义学院招聘劳动合同制工作人员1人建设考试参考试题及答案解析
- 2026安徽省岳顺人力资源服务有限公司招聘8人建设笔试备考试题及答案解析
- 2026浙江金隅杭加绿建科技有限公司招聘6人建设考试参考题库及答案解析
- 固体酸催化剂课件
- 2024-2025学年山西省临汾市七年级下学期期中语文试题
- 防汛防洪知识培训课件
- 2025年外贸行业招聘面试及笔试指南
- 主管护师《专业知识》考试真题及答案(2025年新版)
- 《数据可视化技术》全套教学课件
- 苏科版八年级物理上册 第一章《声现象》章节检测卷及答案
- 2025年人教版七年级英语下册期末复习之完形填空25篇(Units1-8单元话题)【答案+解析】
- 2025辽宁铁道职业技术学院单招考试文化素质数学练习题及参考答案详解(完整版)
- 工程技术英语翻译课件
- 矿井瓦斯防治培训课件
评论
0/150
提交评论