Parser: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 35: Zeile 35:
Die Zustände werden duch Zahlen (<code>int</code>) abgebildet.
Die Zustände werden duch Zahlen (<code>int</code>) abgebildet.
<code>
<code>
import gui.GUI;
  import gui.GUI;
   
   
  public class KGBAutomat {
  public class KGBAutomat {
Zeile 42: Zeile 42:
   
   
   '''public boolean imAlphabet(char pZeichen){'''
   '''public boolean imAlphabet(char pZeichen){'''
       for(char zeichen: alphabet){
       for(int i=0; i<alphabet.length; i++){
          char zeichen = alphabet[i];
           if(zeichen == pZeichen){
           if(zeichen == pZeichen){
               return true;
               return true;
Zeile 50: Zeile 51:
   }
   }
   
   
   // ueberprueft das Wort nur akzeptierte Buchstaben enthaelt
   // ueberprueft, ob pWort aus Buchstaben des Alphabets besteht
   '''public boolean scan(String pWort){'''
   '''public boolean scan(String pWort){'''
       for(char zeichen: pWort.toCharArray()){
       for(int i=0; i<pWort.length(); i++){
          char zeichen = pWort.charAt(i);
           if(!imAlphabet(zeichen)){
           if(!imAlphabet(zeichen)){
               return false;
               return false;
Zeile 59: Zeile 61:
       return true;
       return true;
   }
   }
 
   
   
  // ueberprueft, ob das Wort vom Automaten akzeptiert wird.
   '''public boolean parse(String pWort){'''
   '''public boolean parse(String pWort){'''
       //erst auf das Alphabet ueberpruefen
       //erst auf das Alphabet ueberpruefen
Zeile 67: Zeile 69:
       }
       }
       int zustand = 0;
       int zustand = 0;
       for(char zeichen: pWort.toCharArray()){
       for(int i=0; i<pWort.length(); i++){
          char zeichen = pWort.charAt(i);
           switch(zustand){
           switch(zustand){
               case 0: switch(zeichen){
               case 0: switch(zeichen){
Zeile 91: Zeile 94:
       return (zustand == 3);
       return (zustand == 3);
   }
   }
 
   public static void main(String[] args) {
   public static void main(String[] args) {
       new GUI(new KGBAutomat());
       new GUI(new KGBAutomat());

Version vom 5. November 2018, 14:29 Uhr


Begriffsklärung: Scanner, Parser, Interpreter

Ein Scanner zu einem Alphabet überprüft, ob ein Wort ausschließlich aus Buchstaben des Alphabets besteht.

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 z.B. in Java implementieren.

Ein Interpreter (im Sinne der Softwaretechnik) ist ein Computerprogramm, das einen Programm-Quellcode einliest, analysiert und ausführt.

Im Umgang mit Programm-Quellcode ergibt sich folgende Arbeitsfolge:

Scanner → Parser → Interpreter

Funktionsweise des Parsers

Ein Parser simuliert den zu der Grammatik gehörenden Automaten.

Beispiel

Übergangsgraph des KGB-Automaten

Es soll ein Parser für den KGB-Automaten (siehe rechts) erstellt werden.

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

Implementierung mit switch-case

Die Implementierung mit switch-case bildet den Automaten ab.

Die Zustände werden duch Zahlen (int) abgebildet.

 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(int i=0; i<alphabet.length; i++){
         char zeichen = alphabet[i];
         if(zeichen == pZeichen){
             return true;
         }
     }
     return false;
 }

 // ueberprueft, ob pWort aus Buchstaben des Alphabets besteht
 public boolean scan(String pWort){
     for(int i=0; i<pWort.length(); i++){
         char zeichen = pWort.charAt(i);
         if(!imAlphabet(zeichen)){
             return false;
         }
     }
     return true;
 }
 

 public boolean parse(String pWort){
     //erst auf das Alphabet ueberpruefen
     if(scan(pWort) == false){
         return false;
     }
     int zustand = 0;
     for(int i=0; i<pWort.length(); i++){
         char zeichen = pWort.charAt(i);
         switch(zustand){
             case 0: switch(zeichen){
                         case '0': zustand = 1; continue;
                         default: zustand = 0; continue;
                     }
          
             case 1: switch(zeichen){
                         case '0': zustand = 2; continue;
                         default: zustand = 0; continue;
                     }
                  
             case 2: switch(zeichen){
                         case '0': zustand = 2; continue;
                         case '7': zustand = 3; continue;
                         default: zustand = 0; continue;
             }
             case 3: switch(zeichen){
                         default: zustand = 3; continue;
             }
         }
     }
     return (zustand == 3);
 }

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