Anonymní profil Čam – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Čam – Programujte.comAnonymní profil Čam – Programujte.com

 

Příspěvky odeslané z IP adresy 81.200.55.–

Čam
Java › Gramatika typu 3Pravá -> Gra…
29. 1. 2012   #153009

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);


  
    
  }
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý