/**
 * Implementiert einen DEA, der 0/1-Folgen darauf prüft, ob 
 * sie "gültige Binärzahlen" darstellen. 
 * Gültige Binärzahlen im Sinne dieser Aufgabe beginnen mit 
 * einer 1, auf die eine beliebige Folge von 0/1 folgt. Die
 * einzelne Ziffer 0 ist ebenfalls erlaubt, jedoch keine 
 * Binärzahlen mit "überflüssigen" führenden Nullen. Die 
 * Binärzahl darf außerdem ein Vorzeichen führen (muss aber 
 * nicht).   
 * 
 * Gültig sind beispielsweise:
 * 1
 * 0
 * 101
 * 11
 * 10
 * 1110010010
 * 111
 * -1
 * 1000000000
 * +1
 * 1001001100
 *
 * Ungültig sind beispielsweise:
 * 123
 * 00
 * hallo
 * 0000000011111
 * 1+1
 * Binärzahl
 * abc
 * 321
 * 01010101010101
 * 0101
 * 01
 * 0101010101
 * 
 *  @author Urs Lautebach
 *  @version 2021-Januar
 */


public class BinaerzahlenPruefer extends EndlicherAutomat {
	/* Bei der Implementierung dieser Klasse muss man nur
	 * die Attribute alphabet, uebergaenge und endzustaende
	 * geeignet festlegen -- alles andere macht die 
	 * Vaterklasse "EndlicherAutomat.java".
	 * 
	 * Dort ist auch erklärt, wie die Nummerierung der 
	 * Zustände, des Startzustand und der Übergangstabelle
	 * zu verstehen sind. 
	 */

	// Transitionstabelle anlegen mit den Zuständen auf der  
	// senkrechten und den Alphabetzeichen auf der Rechtsachse:
	private static final int[][] transiTabelle = new int [][] {
		/* die erste Zeile enthaelt die Sprünge heraus aus 
		 * dem Fehlerzustand 0 (den der Automat ja aber gar 
		 * nicht wieder verlassen darf), die also alle 0 sind:
		 */
		{ 0,0,0,0 },              
		{ 2,2,3,4 },
		{ 0,0,3,4 },
		{ 0,0,0,0 },
		{ 0,0,4,4 },
	};

	// Alphabet für diesen Automaten als char[]
	private static final char[] binaerzAlph = new char[] { 
			'-', '+', '0', '1' 
	};

	// Menge der Endzustände:
	private static final int[] endzustaende = new int[] { 
			3, 4 
	};

	/**
	 * Konstruktor für einen BinaerzahlenPruefer:
	 */
	public BinaerzahlenPruefer() {
	    // Aufruf des super-Konstruktors:
		super(binaerzAlph, transiTabelle, endzustaende); 
	}

	/**
	 * Die main-Methode erlaubt den Aufruf von
	 * Binaerzahlenpruefer von der Kommandozeile aus mit
	 * mehreren zu testenden Strings:
	 * 
	 * java BinaerzahlenPruefer 1110101 0001 +1010 abc
	 * 
	 * Die Ausgabe lautet dann
	 * Akzeptiert: "1110101" ist ein gueltiges Binärwort.
	 * FEHLER! "0001" ist kein gültiges Binärwort! 
	 * Akzeptiert: "+1010" ist ein gueltiges Binärwort. 
	 * FEHLER! "abc" ist kein gültiges Binärwort!
	 */
	public static void main(String[] args) {
		// Endlichen Automaten instanziieren:
		EndlicherAutomat binaerzahlenDFA = new BinaerzahlenPruefer();

		for(String wort : args) {
			if(binaerzahlenDFA.gehoertZuSprache(wort)) {
				System.out.println("Akzeptiert: \"" + wort + 
						"\" ist ein gültiges Binärwort.");
			} else {
				System.out.println("FEHLER! \"" + wort + 
						"\" ist kein gültiges Binärwort!");
			}
		}
	}
}
