Benutzer-Werkzeuge

Webseiten-Werkzeuge


compilerbau:lexer:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
compilerbau:lexer:start [2021/10/28 20:15] – [Die Klasse Token] Martin Pabstcompilerbau:lexer:start [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 ====== Lexer ====== ====== Lexer ======
 +
 +<WRAP center round tip 60%>
 +Im folgenden findest Du die Beschreibung des Lexers. Den [[.test:start|fertigen Lexer zusammen mit einem direkt im Browser ausführbaren Testprogramm findest Du hier]].
 +</WRAP>
 +
  
 Der Lexer liest den Programmtext Zeichen für Zeichen und fasst diese zu kleinsten syntaktischen Einheiten, sogenannten Tokens, zusammen. Unsere Beispielsprache besteht aus folgenden 8 Tokens: Der Lexer liest den Programmtext Zeichen für Zeichen und fasst diese zu kleinsten syntaktischen Einheiten, sogenannten Tokens, zusammen. Unsere Beispielsprache besteht aus folgenden 8 Tokens:
Zeile 214: Zeile 219:
  
 </code> </code>
 +
 +===== Die Hilfsmethoden lexZahl() und lexText() =====
 +<code java>
 +   /**
 + * Die Methode lexText geht davon aus, dass das nächste zu verarbeitende
 + * Zeichen ein Buchstabe ist. Solange weitere Buchstaben oder Ziffern
 + * kommen, liest sie sie und setzt sie zu einem Variablennamen zusammen.
 + */
 +  private void lexText() {
 + 
 +    String variablenBezeichner = "";
 + 
 +    do {
 +      char c = peek();
 +      variablenBezeichner += c;
 +      position++;
 +    } while(Character.isLetter(peek()) || Character.isDigit(peek()) || peek() == '_');
 + 
 +    tokenListe.add(new Token(variablenBezeichner));
 + 
 +  }
 + 
 + /**
 + * Die Methode lexZahl liest eine Zahl
 + */
 +  private void lexZahl() {
 + 
 +    String zahlAlsString = "";
 + 
 +    do {
 +      char c = peek();
 +      zahlAlsString += c;
 +      position++;
 +    } while(Character.isDigit(peek()) || peek() == '.');
 + 
 + /**
 + * Hier machen wir es uns leicht und lassen Java den String in eine Zahl
 + * konvertieren. Die Methode parseDouble ist für sich genommen natürlich
 + * auch ein Lexer.
 + */
 +    double zahl = Double.parseDouble(zahlAlsString);
 + 
 +    tokenListe.add(new Token(zahl));
 + 
 +  }
 +</code>
 +Zum einfachen Hinzufügen eines Tokens, das weder eine Zahl noch Text darstellt, wird eine kleine Hilfsmethode definiert:
 +<code java>
 +   /**
 + * Fügt der tokenListe das übergebene Token hinzu
 +
 + * @param tokenType
 + */
 +  private void addToken(TokenType tokenType) {
 +    tokenListe.add(new Token(tokenType));
 + 
 +  }
 +</code>
 +Der Zugriff auf den Programmtext geschieht immer über die Methode peek(), damit weniger Fehler beim Programmieren passieren:
 +<code java>
 +/**
 + * peek() liest das nächste Zeichen im Programmtext, erhöht die Variable
 + * position aber nicht. Ruft man peek() mehrmals hintereinander auf, liefert
 + * es also immer dasselbe Zeichen.
 + 
 + * @return nächstes Zeichen im Programmtext
 + */
 +private char peek() {
 +   if(position < text.length()) {
 +      return text.charAt(position);
 +   } else {
 +      return 0x;
 +   }
 +}
 +</code java>
 +
 +Die restlichen Methoden erklären sich von selbst:
 +<code java>
 +/**
 + * Vorsicht: Die übergebene Liste ist nur dann gefüllt, wenn zuvor die
 + * Methode lex aufgerufen wurde.
 + 
 + * @return Liste mit den Tokens, in die der Lexer den Programmtext zerlegt
 +         hat.
 + */
 +public ArrayList<Token> getTokenListe() {
 + return tokenListe;
 +}
 +
 +/**
 + * Nur zu Debuggingzwecken
 + */
 +public String toString() {
 +
 +   String s = "";
 +
 +   for(Token token : tokenListe) {
 +      s += token.toString() + " ";
 +   }
 +
 +   if(!s.isEmpty()) {
 +      s = s.substring(0, s.length() - 1);
 +   }
 +
 +   return s;
 +
 +}
 +</code>
 +
 +[[..:parser:start|Hier geht's weiter zum Parser!]]
  
compilerbau/lexer/start.1635444909.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki