📄 constructll1table.java
字号:
package cminusCompiler;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.ListIterator;
/**
* @author tanfei E-mail:tanfei158876110@163.com
* @version Create Time:2007-12-8 下午01:26:57 description:
*/
public class ConstructLL1Table {
private LinkedList<Nonterminal> nonterminal;
private HashMap<String, Integer> ter;
private HashMap<String, Integer> nont;
private LinkedList[][] table;
private HashMap<Integer, String> nont1;
public ConstructLL1Table(LinkedList<Nonterminal> n,
HashMap<String, Integer> t, LinkedList[][] table,
HashMap<String, Integer> nont, HashMap<Integer, String> nont1) {
nonterminal = n;
ter = t;
this.table = table;
this.nont = nont;
this.nont1 = nont1;
nont = new HashMap<String, Integer>();
calculateTheNont();
}
private void calculateTheNont() {
Nonterminal nont2;
int n = 0;
for (ListIterator i = nonterminal.listIterator(); i.hasNext();) {
nont2 = (Nonterminal) i.next();
nont.put(nont2.getName(), n);
nont1.put(n, nont2.getName());
n++;
}
}
@SuppressWarnings("unchecked")
public void calculateLTable() {
Nonterminal nont1;
LinkedList<String> ll;
for (ListIterator i = nonterminal.listIterator(); i.hasNext();) {
nont1 = (Nonterminal) i.next();
for (ListIterator j = nont1.getFollowElement().listIterator(); j
.hasNext();) {
ll = (LinkedList<String>) j.next();
fillTable(nont1, ll);
}
}
}
private void fillTable(Nonterminal nont1, LinkedList<String> ll) {
String element, element1;
Nonterminal nont2;
LinkedList<String> tempList = new LinkedList<String>(), tempList1;
for (ListIterator i = ll.listIterator(); i.hasNext();) {
element = (String) i.next();
if (ter.containsKey(element)) {
moveLLToLL(nont1, element, ll);
break;
} else if (!element.equals("empty")) {
nont2 = getInstance(element);
tempList = nont2.getFirstSet();
for (ListIterator j = tempList.listIterator(); j.hasNext();) {
element1 = (String) j.next();
if (!element1.equals("empty")) {
moveLLToLL(nont1, element1, ll);
}
}
if (!tempList.contains("empty")) {
break;
}
} else if (element.equals("empty")) {
tempList1 = nont1.getFollowSet();
for (ListIterator k = tempList1.listIterator(); k.hasNext();) {
element1 = (String) k.next();
moveLLToLL(nont1, element1, ll);
}
break;
}
}
if (tempList.contains("empty")) {
tempList1 = nont1.getFollowSet();
for (ListIterator p = tempList1.listIterator(); p.hasNext();) {
element1 = (String) p.next();
moveLLToLL(nont1, element1, ll);
}
}
}
@SuppressWarnings("unchecked")
private void moveLLToLL(Nonterminal n, String t, LinkedList<String> ll) {
int i, j;
String name = n.getName();
String element = "";
i = nont.get(name);
j = ter.get(t);
if(table[i][j].size() != 0){
table[i][j].clear();
}
for(ListIterator m = ll.listIterator(); m.hasNext();){
element = (String)m.next();
table[i][j].add(element);
}
}
private Nonterminal getInstance(String name) {
Nonterminal nont = new Nonterminal(name);
for (ListIterator i = nonterminal.listIterator(); i.hasNext();) {
nont = (Nonterminal) i.next();
if (nont.getName().equals(name))
return nont;
}
return nont;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -