Advertisement
Soulseller

Wortproblem (reguläre Sprache)

Jun 19th, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.11 KB | None | 0 0
  1. import java.util.LinkedList;
  2.  
  3. public class Start2 {
  4.  
  5.     public static void main(String[] args) {
  6.         // TODO Auto-generated method stub
  7.  
  8.         String wort = "aaabbbccc"; //zu überprüfendes Wort
  9.         String start = "S"; //Startsymbol
  10.  
  11.  
  12.         String[][] regeln = new String[][]{{"S","aSBC","aBC","eol"},{"bB","bb","eol"},{"cC","cc","eol"},{"aB","ab","eol"},{"CB","BC","eol"},{"bC","bc","eol"}}; //Nonterminale und ihre möglichen Ableitungen jeweils als Zeile im zweidimensionalen Array
  13.         boolean enthalten = pruefe(wort,start,regeln);
  14.  
  15.         //Ausgabe des Ergebnisses
  16.         if(enthalten==true){
  17.             System.out.println(wort +  " ist Teil der durch die angegebene Grammatik definierte Sprache.");
  18.         }
  19.         else{
  20.             System.out.println(wort + " ist nicht Teil der definierten Sprache.");
  21.         }
  22.     }
  23.  
  24.     private static boolean pruefe(String wort, String start, String[][] regeln)
  25.     {
  26.  
  27.         int n = wort.length();
  28.         LinkedList<String> tAlt = new LinkedList<String>();
  29.         tAlt.add(start);
  30.         LinkedList<String> tNeu = new LinkedList<String>();
  31.        
  32.  
  33.         //maximal m mal den Algorithmus durchlaufen
  34.  
  35.         //alle Elemente von tAlt auf mögliche Ableitungen überprüfen
  36.         //Elemente nacheinander aus tAlt holen
  37.         int i = 0;
  38.  
  39.         while(true)
  40.         {
  41.             tNeu.add(start);
  42.            
  43.             //alle Elemente von tAlt in tNeu übernehmen
  44.             /*for(int h=0;h<tAlt.size();h++)
  45.             {
  46.                 tNeu.add(tAlt.get(h));
  47.             }
  48.             */
  49.             //alle Elemente von tAlt auf mögliche Ableitungen überprüfen
  50.             //Elemente nacheinander aus tAlt holen
  51.             for(int j=0; j<tAlt.size(); j++)
  52.             {
  53.                 String element = tAlt.get(j);
  54.                 //von jedem Nonterminal (regeln[x][0] / 0. Spalte) überprüfen, ob im Element enthalten
  55.                 for (int k=0; k<regeln.length; k++)
  56.                 {
  57.                     String nonterminal = regeln[k][0];
  58.                     //wenn enthalten, alle möglichen Ableitungen tNeu hinzufügen
  59.                     if((element.contains(nonterminal))||(element.equals(nonterminal)))
  60.                     {
  61.                         String ableitung = "";
  62.                         int l = 1;
  63.                         //bilden aller möglichen Ableitungen durch Ablesen aus der Array-Zeile
  64.                         while (!regeln[k][l].equals("eol"))
  65.                         {
  66.                             ableitung = regeln[k][l];
  67.                             String neuesElement = element.replaceFirst(nonterminal, ableitung);
  68.                             //wenn neues Element nicht länger als Wort, zu tNeu hinzufügen
  69.                             if((neuesElement.length()<=n)&&(!tNeu.contains(neuesElement)))
  70.                             {
  71.                                 tNeu.add(neuesElement);
  72.                                 //System.out.println(tNeu);
  73.                             }
  74.                             l++;
  75.                         }
  76.                     }
  77.                 }
  78.             }
  79.            
  80.            
  81.             //Ausgabe von tNeu
  82.  
  83.             System.out.print("T"+(i+1)+" ist: "+tNeu+"\r\n");
  84.             //Überprüfen, ob zu überprüfendes Wort in tNeu enthalten ist
  85.             if(tNeu.contains(wort))
  86.             {
  87.                 System.out.println("T"+(i+1)+" enthält das zu überprüfende Wo rt.");
  88.                 return true;
  89.             }
  90.             i++;
  91.             //tAlt wird zu tNeu für den nächsten Durchlauf
  92.  
  93.             int altGroesse = tAlt.size();
  94.  
  95.             for(int h=0;h<tNeu.size();h++)
  96.             {
  97.                 if(!tAlt.contains(tNeu.get(h)))
  98.                 {
  99.                     tAlt.add(tNeu.get(h));
  100.                 }
  101.             }
  102.             //tNeu leeren
  103.             if(altGroesse == tAlt.size())
  104.             {
  105.                 System.out.println("Die Menge T Ist gleich geblieben");
  106.                 break;
  107.             }
  108.                
  109.             tNeu.clear();
  110.         }
  111.  
  112.         return false;
  113.     }
  114.  
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement