BuK/IIm10/BuK-Kreativaufgabe06 G1
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Java</language>
=TM-Codierung=
==Aufgabe==
Verwenden Sie kfG Edit aus AtoCC, um die folgende kontextfreie Grammatik G für die Sprache der TM-Codierungen zu definieren. G = (N, T, P, s)
===Grammatik:===
N = {T Mcodierung, Endzustaende, Delta, Uebergang, Kopfbewegung,
L, R, N, Zeichen, Null, Eins, B, Zustand, Einsenfolge}
T = {0, 1}
P = {T Mcodierung → Delta Trenner Endzustaende
Endzustaende → Zustand 0 Endzustaende | Zustand
Delta → Uebergang 0 Delta | Uebergang
Uebergang → Zustand 0 Zeichen 0 Zustand 0 Zeichen 0 Kopfbewegung
Kopfbewegung → N | R | L
L → 1
R → 1 1
N → 1 1 1
Zeichen → B | Eins | Null
Null → 1
Eins → 1 1
B → 1 1 1
Zustand → Einsenfolge
Einsenfolge → 1 | 1 Einsenfolge
}
s = T Mcodierung
Die TM ist folgender Maßen codiert:
[[Bild:Simaschi_Codierung.PNG]]
Folgende TM soll aus der Codierung entstehen:
[[Bild:Simaschi_Automat_m-compiler.PNG]]
==Lösung==
Einen Compiler, der mit AtoCC entwickelt wurde finden Sie hier:
http://michael-hielscher.de/compilerwiki/index.php/Compiler_37822_1_Demo
Einen Compiler, der von Hand programmiert wurde finden Sie hier:
<code>
public class Main {
/**
* @param args
* @throws IOException
*/
static String text="";
static String zustand;
static String zielzustand;
static String read;
static String richtung;
static String write;
static String mitteltext;
static String finalstate1="false";
static String finalstate2="false";
static String finalstate3="false";
static String finalstate4="false";
static String finalstateend;
static String eingang3_ziel="";
static String text5="";
static Boolean gram;
public static void main(String[] args) throws java.io.IOException {
// TODO Auto-generated method stub
mitteltext="";
java.io.FileReader fr = new java.io.FileReader("C:/Users/Snookerms/Desktop/Ablage/input.txt");
java.io.BufferedReader br = new java.io.BufferedReader(fr);
String zeile1 = br.readLine();
System.out.println(zeile1);
br.close();
if(zeile1.startsWith("000")&zeile1.endsWith("000")){
String bestandteile = zeile1.substring(4, zeile1.length()-3);
String [] delta = bestandteile.split("00");
for(int y=0; y<delta.length;y++){
if(delta[y].replaceAll("1", "").length()==4|delta[y].replaceAll("1", "").length()==0){
gram=true;
}
}
}
String eingang = zeile1.substring(3, zeile1.length()-3);
System.out.println(eingang);
String []eingang2 = eingang.split("00");
for(int i=0; i<eingang2.length;i++){
System.out.println(eingang2[i]);
}
int z = eingang2.length;
for (int t=0; t<eingang2.length;t++){
java.util.Pattern p = java.util.Pattern.compile("[0]");
java.io.Matcher m = p.matcher(eingang2[t]);
boolean b = m.matches();
if(b == true){
} else{
if(eingang2[t].equals("1")){
finalstate1="true";
}
if(eingang2[t].equals("11")){
finalstate2="true";
}
if(eingang2[t].equals("111")){
finalstate3="true";
}
if(eingang2[t].equals("1111")){
finalstate4="true";
}
}
}
String text0 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><AUTOMATON><TYPE value=\"TM\"/><ALPHABET><ITEM value=\"0\"/><ITEM value=\"1\"/></ALPHABET><TAPEALPHABET><ITEM value=\"$\"/><ITEM value=\"0\"/><ITEM value=\"1\"/></TAPEALPHABET>";
for(int u=0; u<z-2;u++){
String [] eingang3 = eingang2[u].split("0");
if(eingang3[0].equals("1")){
zustand = "q_0";
if(eingang3_ziel.equals(zustand)){
text="";
}
else{
if(finalstate1.equals("true")){
finalstate1="true";
}
eingang3_ziel="q_0";
text = "<STATE name=\""+ zustand + "\" finalstate=\""+ finalstate1 +"\">";
}
}
if(eingang3[0].equals("11")){
zustand = "q_1";
if(eingang3_ziel.equals(zustand)){
text="";
}
else{
if(finalstate2.equals("true")){
finalstate2="true";
}
eingang3_ziel="q_1";
text = "</STATE><STATE name=\""+ zustand + "\" finalstate=\""+ finalstate2 +"\">";
}
}
if(eingang3[0].equals("111")){
zustand = "q_2";
if(eingang3_ziel.equals(zustand)){
text="";
}
else{
if(finalstate3.equals("true")){
finalstate3="true";
}
eingang3_ziel="q_2";
text = "</STATE><STATE name=\""+ zustand + "\" finalstate=\""+ finalstate3 +"\">";
}
}
if(eingang3[0].equals("1111")){
zustand = "q_3";
if(eingang3_ziel.equals(zustand)){
text="";
}
else{
if(finalstate4.equals("true")){
finalstate4="true";
}
eingang3_ziel="q_3";
text = "</STATE><STATE name=\""+ zustand + "\" finalstate=\""+ finalstate4 +"\">";
}
}
if(eingang3[1].equals("1")){
read = "0";
}
if(eingang3[1].equals("11")){
read = "1";
}
if(eingang3[3].equals("11")){
write = "1";
}
if(eingang3[3].equals("1")){
write = "0";
}
if(eingang3[4].equals("1")){
richtung = "LEFT";
}
if(eingang3[4].equals("11")){
richtung = "RIGHT";
}
String text3 = "<LABEL read=\""+ read +"\" direction=\""+ richtung +"\" write=\""+ write +"\"/></TRANSITION>";
if(eingang3[2].equals("1")){
zielzustand = "q_0";
}
if(eingang3[2].equals("11")){
zielzustand = "q_1";
}
if(eingang3[2].equals("111")){
zielzustand = "q_2";
}
if(eingang3[2].equals("1111")){
zielzustand = "q_3";
}
String text2 = "<TRANSITION target=\""+ zielzustand +"\">";
mitteltext=mitteltext+text+text2+text3+text5;
}
String text4 = "</STATE><INITIALSTATE value=\"q_0\"/><TAPEINITIALCHAR value=\"$\"/></AUTOMATON>";
String endtext = text0+mitteltext+text4;
if(gram=true){
System.out.println("Eingabe entspricht der Grammatik!");
String dateiName = "C:/Users/Snookerms/Desktop/Ablage/ergebnis.xml";
java.io.FileOutputStream schreibeStrom =
new java.io.FileOutputStream(dateiName);
for (int i=0; i < endtext.length(); i++){
schreibeStrom.write((byte)endtext.charAt(i));
}
schreibeStrom.close();
}
else{
System.out.println("Eingabe entspricht nicht der Grammatik!");
}
}
}
</code>
Dabei ist zu beachten, dass der handgeschrieben Compiler nur bis zu maximal 4 Zuständen geht und folgende Codierung verwendet:
<run>
000101101101101100110101010100110110110110110011101101011010010011000</run>