/* * JFLAP - Formal Languages and Automata Package * * * Susan H. Rodger * Computer Science Department * Duke University * August 27, 2009 * Copyright (c) 2002-2009 * All rights reserved. * JFLAP is open source software. Please see the LICENSE for terms. * */ package grammar.parse; import grammar.CNFConverter; import grammar.Grammar; import grammar.LambdaProductionRemover; import grammar.Production; import grammar.UnitProductionRemover; import grammar.UselessProductionRemover; import gui.environment.GrammarEnvironment; import gui.grammar.GrammarInputPane; import gui.grammar.transform.ChomskyPane; import gui.grammar.transform.LambdaController; import gui.grammar.transform.LambdaPane; import gui.grammar.transform.UnitController; import gui.grammar.transform.UnitPane; import gui.grammar.transform.UselessController; import gui.grammar.transform.UselessPane; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.*; import javax.swing.JOptionPane; /** * Class for converting CNF-converted productions back to their original productions * @author Kyung Min (Jason) Lee * */ public class CYKTracer { private Grammar myOriginalGrammar; private ArrayList myTrace; private ArrayList myAnswer; private Production[] myOriginalProductions; private HashMap , Production> myLambdaStepMap; private HashMap , Production> myUnitStepMap; private ArrayList myTempCNF; private HashMap > myCNFMap; public CYKTracer(Grammar grammar, ArrayList trace) { myOriginalGrammar=grammar; myTrace=trace; myAnswer=new ArrayList (); myOriginalProductions=myOriginalGrammar.getProductions(); initializeLambdaStepMap(); } private void initializeLambdaStepMap() { LambdaProductionRemover remover = new LambdaProductionRemover(); Set lambdaDerivers = remover.getCompleteLambdaSet(myOriginalGrammar); Grammar g=myOriginalGrammar; //System.out.println("LD = "+lambdaDerivers); if (lambdaDerivers.size() > 0) { myLambdaStepMap=new HashMap, Production>(); HashMap directLambdaProductions=new HashMap (); HashMap > indirectLambdaProductions=new HashMap >(); GrammarEnvironment env=new GrammarEnvironment(new GrammarInputPane(myOriginalGrammar)); LambdaPane lp = new LambdaPane(env, myOriginalGrammar); LambdaController controller = new LambdaController(lp, myOriginalGrammar); controller.doStep(); for (Production production : (HashSet)controller.getLambdaSet()) { directLambdaProductions.put(production.getLHS(), production); } // //System.out.println("DIRECT = "+directLambdaProductions); Production[] p=lp.getGrammar().getProductions(); for (String key : directLambdaProductions.keySet()) { for (int i=0; i temp=new ArrayList (); temp.add(p[i]); temp.add(directLambdaProductions.get(key)); indirectLambdaProductions.put(p[i].getLHS(), temp); } } } // //System.out.println("INDIRECT = "+indirectLambdaProductions); for (int i=0; i temp=new ArrayList (); if (!p2[j].equals(p[i])) { temp.add(p[i]); ArrayList variables=getDifferentVariable(p[i].getRHS(), p2[j].getRHS()); // //System.out.println(p2[j]+" Variables = "+variables); for (int pp=0; pp " + myCNFMap.get(p)+ " contains "+target); visited=searchForRest(myCNFMap.get(p), p, visited); } } } } } // System.out.println("After Backtracking CNF = "+myAnswer); } private int[] searchForRest(ArrayList list, Production p, int[] visited) { HashSet visitedProd=new HashSet (); // System.out.println("Searching through "+list); int[] original=visited; int count=0; for (int i=0; i