Tokens

Freaky123

Mitglied
Als hier mal die Aufgabenstellung:
Ein Computerprogramm kann als eine Folge von Tokens aufgefasst werden, wobei diese Tokens Schlüsselwörter, Symbole und Variablen im Programm repräsentieren. Diese Tokens können durch Klassen implementiert werden. Schreiben Sie ein Programm, das folgende Schritte ausführt:
1. Einlesen eines Computerprogramms aus einer Textdatei.
2. Generieren der entsprechenden Tokens mit einer HashMap (ohne dabei Informationen zu verlieren).
3. Speichern der Tokens in einer LinkedList.
4. Ausgabe der Liste der Token-Namen (in der Reihenfolge der Einträge).
Für jeden Token-Typ sollten Sie eine Klasse bereitstellen.

Die Tokens für unsere vereinfachte Sprache sind:
• startprog
• endprog
• for
• endfor
• if
• endif
• do
• left
• right
• up
• down
• +
• ‐
• variable
• number

Weiters gilt:
• Alle Variablen sind einzelne Wörter und bestehen ausschließlich aus Kleinbuchstaben.
• Die Tokens können in jeder Reihenfolge angeordnet werden.
• Alle Zahlen sind positive Integerzahlen mit den Zahlen 0-9.
• Leerzeichen und Tabulatoren werden ignoriert.



Also wenn ich einen Text aus einer Datei einlese dann wird er doch einfach durch bestimmte Zeichen (in diesem Fall durch die angefuehrten Zeichen startprog, endprog, for, etc.) abgegrenzt und die einzelnen Zwischenteile koennen in Strings gespeichert werden.
Ich versteh nicht ganz was man hier ueberhaupt machen soll, haette vlt jemand ne Erklaerung dazu?
 

diggaa1984

Top Contributor
na im prinzip hast du ne zuordnung von token zu strings, welche diese repräsentieren (das versteh ich mit der hashmap) .. im fallen von zahlen und variablen kannst das natürlich nicht in der hashmap ablegen, da du hier unendlich viele möglichkeiten hast, wie diese aussehen.

das heisst in der hash landen sozusagen alle schlüsselwörter und die operatoren.

wenn du nun die textdatei liest, brauchst du nur schaun, ob es sich bei einem Textteil um ein schlüsselwort handelt (kommt in der hashmap vor) oder eine variable (regulärer ausdruck für alle kleinbuchstaben) oder eine zahl (regulärer ausdruck für zahlenkombinationen)

in der liste landen dann nach und nach die erkannten token und ausgegeben wird dann aber nur noch der tokentyp (das was du aufgelistet hast)
 

Freaky123

Mitglied
Sorry aber ich haeng im Moment voellig auf der Leitung...
Also wenn ich die Textdatei Lese landen die Woerter
• startprog
• endprog
• for
• endfor
• if
• endif
• do
• left
• right
• up
• down
• +
• ‐
im HashMap!?
Somit waeren diese Tokens jetzt meine Datensaetze in der Hashmap aber was dient als Key?
Kommen die Tokens nur in die HashMap oder auch in die LinkedList?

Diese Tokens wuerden somit nur in die LinkedList kommen:
• variable
• number

Und wie soll denn die Klasse fuer die einzelnen Tokens aussehen?
 

diggaa1984

Top Contributor
ne ich dachte sowas wie:

hashmap als wissensspeicher darüber welche tokenklasse es gibt und wie deren zeichenfolge aussieht (wird initial erstellt, bevor du was einliest) also zB:

"for" wird abgebildet auf das token for .. quasi <Zeichenfolge,Tokentyp> .. somit kannst jeden textschnipsel als key verwenden, wenn er nicht vorkommt, dann sollte es nur noch variable oder zahl sein .. da musst du dann nochmal schauen obs buchstaben oder zahlen sind.

in die liste kommen meiner meinung nach alle gefundenen Token der Reihenfolge nach .. da macht ne Klasse Token Sinn, welche den Tokentyp und das Morphem (also den Inhalt des Tokens, in dem Fall den Textschnipsel) enthält. Ausgegeben wird dann die Liste von vorne nach hinten, wobei du da nur den Tokentyp angeben sollst.

edit: man könnte die hashmap dann wohl auch so aufbauen:
HashMap<String,Token> .. wobei String mit dem Morphem des Tokens entspricht auf das es abgebildet wird. Dient also eigentlich nur dem schnellen aufsuchen des richtigen Tokenobjektes um diese in der Liste abzulegen.
 
Zuletzt bearbeitet:

Freaky123

Mitglied
Somit waeren also in der HashMap immer Key und Datentyp gleich?
z.B. test = HashMap<String, String> => HashMap<"for", "for"> und somit wird mit der HashMap immer nur ueberprueft was es ist (alles ausser Variable und Zahl)

und fuer die Klasse sowas vlt:

Java:
public class Token {


      protected String type;
      protected String message;

      public Token(String type, String message) {

      this.type = type;
      this.message = message;
      }
}
 

diggaa1984

Top Contributor
hab grad mal sowas gebaut .. so in etwa könnte das dann noch laufen:
Java:
import java.util.*;

public class foo {
	private static enum Token {
		FOR("for"),
		IF("if");
		
		private String data;
		
		Token(String data) {
			this.data = data;
		}
		
		public String getData() {
			return data;
		}
	}
	
	
	public static void main(String[] args) {
		HashMap<String,Token> map = new HashMap<String,Token>();
		for(Token t: Token.values()) {
			map.put(t.getData(),t);
		}
		
		for(String key: map.keySet()) {
			System.out.println(map.get(key).getData());
		}
	}
}

enum is praktisch da du das easy erweitern kannst
im prinzip ist ja der tokentyp identisch zum datensatz, ausser eben bei variablen und zahlen .. daher machts eigentlich doch kein sinn, diese information in einer extra variable unterzubringen. daher nur "data"
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben