|
public class LOGOfuerArme extends Applet implements
KeyListener
{
TextField rein, raus; // erforderliche
Objekte/Variable incl. Turtle
String eingabe, ausgabe;
Turtle t;
int breite, hoehe;
Image im; // gezeichnet wird im Hintergrund
(double-buffering)
Graphics bg;
public void init() // Oberfläche
erzeugen
{
breite = getSize().width;
hoehe = getSize().height;
setLayout(null);
rein = new TextField("hier
LOGO-Befehle eingeben!");
rein.setBounds(2, hoehe
- 50, breite - 10, 20);
rein.setFont(new Font("Courier",
0, 12));
rein.addKeyListener(this);
add(rein);
raus = new TextField("hier
erscheinen Meldungen!");
raus.setBounds(2, hoehe
- 25, breite - 10, 20);
raus.setFont(new Font("Courier",
0, 12));
add(raus);
hoehe = hoehe - 53;
im = createImage(breite,
hoehe);
bg = im.getGraphics();
t = new Turtle(bg, (int)
Math.round(breite / 2), (int) Math.round(hoehe / 2));
t.clear(breite-5,hoehe);
}
public void update(Graphics g) // alte
Ergebnisse nicht löschen (muss hier nicht sein)
{
paint(g);
}
public void paint(Graphics g)
{
g.drawImage(im, 0, 0, this);
// gespeichertes Bild anzeigen
}
public void keyTyped(KeyEvent e) //
s.o.
{
if ( (int) e.getKeyChar()
== 10)
{
werteAus(rein.getText());
}
}
public void keyPressed(KeyEvent e)
{} // brauchen wir hier nicht, müssen
aber angegeben
public void keyReleased(KeyEvent e)
{} // werden
private String scan(String s)
{
String h = "";
for (int i = 0; i <
s.length(); i++)
{
if (s.charAt(i)
!= ' ') // Leerzeichen rauswerfen
{
h = h + Character.toUpperCase(s.charAt(i)); // Großbuchstaben wählen
}
}
rein.setText(h); // Ergebnis
anzeigen …
return h; // … und zurückgeben
}
private void execute(String s)
{
Turtleinterpreter ti =
new Turtleinterpreter();
ti.fuehreAus(s, t);
}
private boolean parse(String s)
{
Turtleparser tp = new Turtleparser();
//neuen Parser erzeugen
char c;
boolean fertig = false;
String f = "";
boolean result = false;
while ( (s.length() > 0)
&& !fertig) //Zeichenkette abarbeiten
{
c = s.charAt(0);
s = s.substring(1);
tp.verarbeite(c);
//Parser aufrufen
if ( (tp.s
< 10) || (tp.s == 99))
{
f = f + " ";
}
else //ein
Fehler ist aufgetreten
{
f = f + "^ Fehler Nr." + tp.s + ": ";
fertig = true;
}
}
switch (tp.s) //Fehlermeldung
erzeugen …
{
case 20:
{
f = f + "Befehl <u,d,h,c,m,t,r> erwartet!"; break;
}
case 21:
{
f = f + "<;> erwartet!"; break;
}
case 22:
{
f = f + "Ziffer erwartet!"; break;
}
case 23:
{
f = f + "Ziffer oder <;> erwartet!"; break;
}
case 24:
{
f = f + "Ziffer oder <{> erwartet!"; break;
}
case 25:
{
f = f + "Befehl oder <}> erwartet!"; break;
}
case 26:
{
f = f + "keine geschachtelten Schleifen erlaubt!"; break;
}
default:
if (tp.s != 99)
{
f = f + "^ Fehler Nr.99: unerwartetes Ende der Eingabe!";
}
else
{
f = "ok";
}
}
raus.setText(f); //… und
ausgeben
result = tp.s == 99; //Funktionsergebnis
in Abhängigkeit vom erreichten Zustand festlegen
return result;
}
private void werteAus(String s) // s.o.
{
s = scan(s);
if (parse(s))
{
execute(s);
}
repaint();
}
}
|