gramatyka bezkontekstowa

0

Witam. Pomoże ktoś rozwiązać taki problem: Program, który wypisze na ekranie n łańcuchów z języka opisanego za pomocą gram bezkontekstowej:

S->aB|bA A->a|As|bAA B ->b|bS|aBB

Proszę o pomoc.

1

Ale dowolnych? Jakich n słów? W kolejności rosnących długości?
Samo zadanie trywialne. Zdefiniuj sobie każy nieterminal jako funkcje która zwraca ci odpowiedni ciąg, np:

string S(){
  if(rand()%2){
    return "a"+B();
  }else{
    return "b"+A();
  }
}

string A(){
  choice = rand()%3;
  if(choice == 0){
    return "a";
  }else if(choice ==1){
    return A()+"s";
  }else{
   return "b"+A()+A();
  }
}

To jest chyba najbardziej oczywista implementacja, przy założeniu że chcesz wypisać sobie losowe słowa. Analogicznie dopisz sobie B() a potem wypisz S() w pętli.

0

tak chodzi i o wypisanie posortowanych długosci

0

http://ideone.com/29joBN
Ale to jest C++, w C musisz wywalić "string" i bawić się w ręczne alokowanie pamięci na tablice znaków. No i ten kod wypisuje zupełnie losowe słowa z tego języka. Nad wypisywaniem w kolejności musisz trochę pomyśleć.

0

nie mam pomysłu jak to można zrobić. Chodzi o to żeby nie dzielić tego na funkcję i w jednej main to zrobić czy dalej niech są podzielone na funkcję ?

0

A jakie to ma niby znaczenie? o_O Czy ty w ogóle rozumiesz gdzie w tym zadaniu jest "trudność"? Bo mam wrażenie że nie za bardzo. Biorąc pod uwagę fakt że nie umiałes doprowadzić tego do stanu "kompiluje się" to szczerze wątpię żebyś był w stanie to zadanie rozwiązać.
Zrób sobie takie ćwiczenie na kartce: weź tą gramatykę i ręcznie wypisz sobie rozwiązanie dla n=10 czy n=15 i zobacz w jaki sposób to robisz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1