Zdravím, potřeboval bych poradit s programem, který zpracovává Gramatiku typu 3Pravá a podle přepisovacích pravidel (X->&Y, X->e). Program zvládne pokud je zastoupen pouze jeden neterminální znak (velké písmeno). Pokud jsou zastoupeny 2 a více neterminálních znaků, program si neporadí s grafem dosažitelnosti (na co se přepisuje jeden Neterminální znak, na to se musí přepisovat i druhý), viz. přiklady.
vstupem je
A -> aA | B
B -> bB | C
C -> cC | k
graf dosažitelnosti je A-->B-->C
program dává výstup
A -> aA | bB
B -> bB | cC | kD
C -> cC | kD
D -> $
Chybí tam zpracovat, že C je dosažitelné z A. Výstup by tedy měl být
A -> aA | bB | cC | kD
B -> bB | cC | kD
C -> cC | kD
D -> $
Zde je metoda, ve které je podle mého názoru problém. Neměl by někdo prosím nějaký nápad, začínám z toho být docela zoufalý. Děkuji.
/**
* Meotda zpracovava prepisovaci pravidlo N->N.
*
*/
public static void Neterminaly () {
final int konec=5; //konec vyznamnych znaku v retezci
boolean prazdny=false;
for (String aktualniRadek : neterPrav) { // probehne cele pole pravidel
char prvniPismeno = aktualniRadek.charAt(0);
int prvni = najdiPozici(prvniPismeno);
String zvetsitVel= vystupniPole.get(prvni);
if(zvetsitVel.charAt(zvetsitVel.length()-1)=='$') {
String pomoc = "";
for (int k = 0; k < zvetsitVel.length()-konec; k++) { //zvetseni potrebneho vystupu
pomoc=pomoc+zvetsitVel.charAt(k);
prazdny=true;
}
zvetsitVel = pomoc;
}
if (zvetsitVel.length()>4) {
zvetsitVel+=" | ";
}
else {
zvetsitVel+=" -> ";
}
char druhePismeno = aktualniRadek.charAt(1);
int druheCislo = najdiPozici(druhePismeno);
String copyString = vystupniPole.get(druheCislo);
if (copyString.charAt(copyString.length()-1)=='$') {
prazdny=false;
}
for (int i = konec; i < copyString.length(); i++) {
zvetsitVel+=copyString.charAt(i);
}
if (prazdny) {
zvetsitVel+=" | $";
}
vystupniPole.set(prvni, zvetsitVel);
}
}