ciao lele, grazie per la risposta. dunque, per standalone intendevo un modo per creare un eseguibile doppiocliccabile (un po' come il build and run di alcune IDE per C++). comunque anche provando da prompt come da te detto, in effetti le cose non cambiano. sul codice, in effetti hai ragione, non l'avevo fatto perche' e' un bello denso, ma se ci sara' qualcuno volenteroso di darmi una mano, ogni aiuto sara' bene accetto. premetto che tutto gira magnificamente se la mia stringToCheck e' di 11 caratteri o meno, se e' piu' lunga, ottengo lo stackoverflow.
e comunque, *sicuramente* la ricorsione e' pesantissima e migliorabile, pero' ho notato con alcune prove, che per particolari input in cui devo solo aggiungere elementi allo stack senza toglierne, posso ottenere un funzionamento corretto anche per input molto piu' lunghi (100 e piu' caratteri). dovro' proprio cambiare algoritmo?
codice:
public boolean check(int scanIndex)
{
productionSet = givenGrammar.getProductionSet();
startSymbol = givenGrammar.getStartSymbol();
if(sententialFormStack.isEmpty())
{
for (i = scanIndex; i < productionSet.size(); i++)
{
currentLeftSide = productionSet.elementAt(i).getLeftSide();
currentRightSide = productionSet.elementAt(i).getRightSide();
if (currentLeftSide.equals(startSymbol) && currentRightSide.length() <= stringToCheck.length())
{
if(currentLeftSide.equals(stringToCheck))
{
return true;
}
sententialFormStack.push(new Ancestor(startSymbol, i));
return check(0);
}
}
return false;
}
else
{
currentSententialForm = sententialFormStack.peek().getSententialForm();
currentScanIndex = sententialFormStack.peek().getProductionIndexUsedToUnfold();
for(i = scanIndex; i < productionSet.size(); i++)
{
currentLeftSide = productionSet.elementAt(i).getLeftSide();
currentRightSide = productionSet.elementAt(i).getRightSide();
totalLength = currentSententialForm.length() + currentRightSide.length() - currentLeftSide.length();
if(currentSententialForm.contains(currentLeftSide) && totalLength <= stringToCheck.length())
{
newSententialForm = currentSententialForm.replaceFirst(currentLeftSide, currentRightSide);
if(newSententialForm.equals(stringToCheck))
{
return true;
}
sententialFormStack.peek().setProductionIndexUsedToUnfold(i);
sententialFormStack.push(new Ancestor(newSententialForm, -1));
return check(0);
}
}
if(currentSententialForm.equals(startSymbol))
{
return false;
}
sententialFormStack.removeElementAt(sententialFormStack.size()-1);
currentScanIndex = sententialFormStack.peek().getProductionIndexUsedToUnfold();
sententialFormStack.peek().setProductionIndexUsedToUnfold(-1);
return check(currentScanIndex+1);
}
}