Parser: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 18: Zeile 18:


<code>
<code>
  import gui.GUI;
 
import gui.GUI;
   
   
  '''public class KGBAutomat {'''
  '''public class KGBAutomat {'''
   
   
    private char[] '''alphabet''' = {'0', '1', '2','3','4','5','6','7','8','9'};
  '''private char[] alphabet''' = {'0', '1', '2','3','4','5','6','7','8','9'};
    
    '''public boolean imAlphabet(char pZeichen){'''
   '''public boolean imAlphabet(char pZeichen){'''
        for(char zeichen: alphabet){
      for(char zeichen: alphabet){
            if(zeichen == pZeichen){
          if(zeichen == pZeichen){
                return true;
              return true;
            }
          }
        }
      }
        return false;
      return false;
    }
  }
    
    '''public boolean parse(String pWort){'''
   '''public boolean parse(String pWort){'''
        int zustand = 0;
      char zustand = 'S';
        for(char zeichen: pWort.toCharArray()){
      for(char zeichen: pWort.toCharArray()){
            if(!imAlphabet(zeichen)){
          if(!imAlphabet(zeichen)){
                return false;
              return false;
            }
          }
            switch(zustand){
          switch(zustand){
                case 0: switch(zeichen){
              case 'S': switch(zeichen){
                            case '0': zustand = 1; continue;
                          case '0': zustand = 'A'; continue;
                            default: zustand = 0; continue;
                          default: zustand = 'S'; continue;
                        }
                      }
                
           
                case 1: switch(zeichen){
               case 'A': switch(zeichen){
                            case '0': zustand = 2; continue;
                          case '0': zustand = 'B'; continue;
                            default: zustand = 0; continue;
                          default: zustand = 'S'; continue;
                        }
                      }
                     
                   
                case 2: switch(zeichen){
              case 'B': switch(zeichen){
                            case '0': zustand = 2; continue;
                          case '0': zustand = 'B'; continue;
                            case '7': zustand = 3; continue;
                          case '7': zustand = 'C'; continue;
                            default: zustand = 0; continue;
                          default: zustand = 'S'; continue;
                }
              }
                case 3: switch(zeichen){
              case 'C': switch(zeichen){
                            default: zustand = 3; continue;
                          default: zustand = 'C'; continue;
                }
              }
            }
          }
        }
      }
        return (zustand == 3);
      return (zustand == 'C');
    }
  }
    
    public static void main(String[] args) {
   public static void main(String[] args) {
        new GUI(new KGBAutomat());
      new GUI(new KGBAutomat());
    }
  }
  }
  }
</code>
</code>

Version vom 3. Februar 2015, 18:34 Uhr



Ein Parser zu einer Grammatik ist ein Algorithmus, mit dem sich überprüfen lässt, ob ein Wort zu der von der Grammatik erzeugten Sprache gehört, d.h. ob es syntaktisch korrekt ist. Der Algorithmus lässt sich dann in Java implementieren.

Man könnte auch sagen: Ein Parser simuliert den zu der Grammatik gehörenden Automaten.

Beispiel

Es soll ein Parser für den KGB-Automaten erstellt werden.

Der KGB-Automat erkennt Wörter, die nur aus den Ziffern 0,...,9 bestehen und die irgendwo die Zahlenkette "007" enhalten.

Implementierung

import gui.GUI;

public class KGBAutomat {

  private char[] alphabet = {'0', '1', '2','3','4','5','6','7','8','9'};

  public boolean imAlphabet(char pZeichen){
      for(char zeichen: alphabet){
          if(zeichen == pZeichen){
              return true;
          }
      }
      return false;
  }

  public boolean parse(String pWort){
      char zustand = 'S';
      for(char zeichen: pWort.toCharArray()){
          if(!imAlphabet(zeichen)){
              return false;
          }
          switch(zustand){
              case 'S': switch(zeichen){
                          case '0': zustand = 'A'; continue;
                          default: zustand = 'S'; continue;
                      }
            
              case 'A': switch(zeichen){
                          case '0': zustand = 'B'; continue;
                          default: zustand = 'S'; continue;
                      }
                    
              case 'B': switch(zeichen){
                          case '0': zustand = 'B'; continue;
                          case '7': zustand = 'C'; continue;
                          default: zustand = 'S'; continue;
              }
              case 'C': switch(zeichen){
                          default: zustand = 'C'; continue;
              }
          }
      }
      return (zustand == 'C');
  }

  public static void main(String[] args) {
      new GUI(new KGBAutomat());
  }
}