lr1itemset.java
来自「有关编译器的编译器.」· Java 代码 · 共 234 行
JAVA
234 行
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of SableCC. * * See the file "LICENSE" for copyright information and the * * terms and conditions for copying, distribution and * * modification of SableCC. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */package org.sablecc.sablecc;import java.util.*;import java.util.Vector;final class LR1ItemSet implements Cloneable, Comparable{ private final TreeMap items; private int hashCode = 0; LR1ItemSet() { this.items = new TreeMap(); } private LR1ItemSet(LR1ItemSet set ) { this.items = (TreeMap) set.items.clone(); this.hashCode = set.hashCode; } void set (LR1Item item) { if(items.put(item, item) == null) { hashCode += item.hashCode(); modified_ = true; } } boolean get (LR1Item item) { return items.get(item) != null; } LR1Item[] items_; boolean modified_ = true; private void computeArray() { Vector itemVector = new Vector(0); for(Iterator e = items.keySet().iterator(); e.hasNext();) { itemVector.addElement(e.next()); } items_ = new LR1Item[itemVector.size()]; itemVector.copyInto(items_); modified_ = false; } LR1Item[] items() { if(modified_) { computeArray(); } return items_; } public String toString() { String nl = System.getProperty("line.separator"); StringBuffer result = new StringBuffer(); result.append("{" + nl + "\t"); Production[] productions = Production.productions(); Symbol[] terminals = Symbol.terminals(); boolean comma = false; for(int i = 0; i < productions.length; i++) { int rightsideLength = productions[i].rightside().length; for(int j = 0; j <= rightsideLength; j++) { LR0Item lr0Item = new LR0Item(productions[i].index, j); for(int k = 0; k < terminals.length; k++) { LR1Item item = new LR1Item(lr0Item, terminals[k].index); if(get (item)) { if(comma) { result.append("," + nl + "\t"); } else { comma = true; } result.append(item); } } } } result.append(nl + "}"); return result.toString(); } public String toString(Symbol lookahead) { String nl = System.getProperty("line.separator"); LR1Item[] items = items(); int length = items.length; TreeSet strings = new TreeSet(); for(int i = 0; i < length; i++) { String s = items[i].toString(lookahead); if(s != null) { strings.add(s); } } StringBuffer result = new StringBuffer(); result.append("{"); boolean colon = false; for(Iterator i = strings.iterator(); i.hasNext(); ) { if(colon) { result.append(","); result.append(nl); } else { colon = true; result.append(nl); } result.append("\t"); result.append(i.next()); } result.append(nl); result.append("}"); return result.toString(); } public Object clone() { return new LR1ItemSet(this); } public boolean equals(Object obj) { if((obj == null) || (obj.getClass() != this.getClass())) { return false; } LR1ItemSet set = (LR1ItemSet) obj; if(set.items.size() != items.size()) { return false; } for(Iterator e = items.keySet().iterator(); e.hasNext();) { if(!set.get((LR1Item) e.next())) { return false; } } return true; } public int hashCode() { return hashCode; } public int compareTo(Object object) { LR1ItemSet set = (LR1ItemSet) object; int result = items.size() - set.items.size(); if(result == 0) { Iterator e = items.keySet().iterator(); Iterator f = set.items.keySet().iterator(); while(e.hasNext() && f.hasNext() && (result == 0)) { result = ((LR1Item) e.next()).compareTo(f.next()); } if(result == 0) { if(e.hasNext()) { return 1; } if(f.hasNext()) { return -1; } } } return result; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?