⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 constructll1table.java

📁 词法和语法分析器
💻 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 + -