/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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.Enumeration; import java.util.TreeMap; import java.util.Vector; @SuppressWarnings({"rawtypes", "unchecked"}) final class LR1Collection { final LR0Collection collection; final TreeMap[] lookaheads; private final TreeMap[] propagation; LR1Collection(LR0ItemSet set ) { collection = new LR0Collection(set ); // Initialize lookaheads to nothing, propagation to nothing LR0ItemSet[] sets = collection.sets(); lookaheads = new TreeMap[sets.length]; propagation = new TreeMap[sets.length]; for (int i = 0; i < sets.length; i++) { System.out.print("."); lookaheads[i] = new TreeMap(); propagation[i] = new TreeMap(); LR0Item[] items = sets[i].items(); for (int j = 0; j < items.length; j++) { lookaheads[i].put(items[j], new SymbolSet()); propagation[i].put(items[j], new Vector(0)); } } System.out.println(); ((SymbolSet) lookaheads[0].get(set.items()[0])).setTerminal(Grammar.eof); for (int i = 0; i < sets.length; i++) { System.out.print("."); LR0Item[] items = sets[i].items(); for (int j = 0; j < items.length; j++) { LR1ItemSet lr1Set = new LR1ItemSet(); lr1Set.set(new LR1Item(items[j], Grammar.dummy)); LR1Item[] closure = Grammar.CLOSURE(lr1Set).items(); for (int k = 0; k < closure.length; k++) { if (closure[k].terminal != Grammar.dummy) { Symbol[] rightside = Production. production(closure[k].lr0Item.production). rightside(); if (closure[k].lr0Item.position < rightside.length) { Integer destination = collection.GOTO(i, rightside[closure[k].lr0Item.position]); if (destination != null) { ((SymbolSet) lookaheads[destination.intValue()]. get (new LR0Item(closure[k].lr0Item.production, closure[k].lr0Item.position + 1))). setTerminal(closure[k].terminal); /*((SymbolSet) lookaheads[collection.GOTO(i, Production.production(closure[k].lr0Item.production). rightside(closure[k].lr0Item.position)).intValue()]. get(new LR0Item(closure[k].lr0Item.production, closure[k].lr0Item.position + 1))). setTerminal(closure[k].terminal);*/ } } } else { Symbol[] rightside = Production. production(closure[k].lr0Item.production). rightside(); if (closure[k].lr0Item.position < rightside.length) { Integer destination = collection.GOTO(i, rightside[closure[k].lr0Item.position]); if (destination != null) { ((Vector) propagation[i].get(items[j])). addElement(new LR0ItemAndSetPair( new LR0Item(closure[k].lr0Item.production, closure[k].lr0Item.position + 1), destination.intValue())); /*((Vector) propagation[i].get(items[j])). addElement(new LR0ItemAndSetPair( new LR0Item(closure[k].lr0Item.production, closure[k].lr0Item.position + 1), collection.GOTO(i, Production.production(closure[k].lr0Item.production). rightside(closure[k].lr0Item.position)).intValue()));*/ } } } } } } System.out.println(); boolean changed; do { System.out.print("."); changed = false; for (int i = 0; i < sets.length; i++) { LR0Item[] items = sets[i].items(); for (int j = 0; j < items.length; j++) { for (Enumeration e = ((Vector) propagation[i].get(items[j])). elements(); e.hasMoreElements(); ) { LR0ItemAndSetPair pair = (LR0ItemAndSetPair) e.nextElement(); SymbolSet before = (SymbolSet) ((SymbolSet) lookaheads[pair.set].get(pair.item)).clone(); ((SymbolSet) lookaheads[pair.set].get(pair.item)). or((SymbolSet) lookaheads[i].get(items[j])); if (!before.equals(lookaheads[pair.set].get(pair.item))) { changed = true; } } } } } while (changed); System.out.println(); } @Override public String toString() { StringBuffer result = new StringBuffer(); result.append(collection); result.append(System.getProperty("line.separator")); result.append("Lookaheads" + System.getProperty("line.separator")); LR0ItemSet[] sets = collection.sets(); for (int i = 0; i < sets.length; i++) { result.append(i + ":" + System.getProperty("line.separator")); LR0Item[] items = sets[i].items(); for (int j = 0; j < items.length; j++) { result.append(items[j] + ":" + lookaheads[i].get(items[j]) + System.getProperty("line.separator")); } } return result.toString(); } }