Tokenizer selbst implementieren

Sonnenblume123

Aktives Mitglied
Hallo,

ich soll einen Tokenizer implementieren ohne ein Scanner Generatortool zu nutzen. Dabei hab ich die Methode vorgegeben:
Java:
package scanner;

import java.util.*;


public class TokenScanner {

    public static List<String> functionScanner(String input) {
        List<String> results = new ArrayList<>();
        return results;
    }

Anschaulich an einem Testcase:
Java:
package scanner;

import static org.junit.jupiter.api.Assertions.*;
import java.util.*;

import java.util.List;

import org.junit.jupiter.api.Test;

class TokenScannerTest1 {

    @Test
    void test1() {
        List<String> list1 = Arrays.asList("if", "(","x", ">", "0", ")","{", "y",
                "<=", "7",";", "}");
        
        //TokenScanner test1 = new TokenScanner();
        List<String> results1 = TokenScanner.functionScanner("if (x >0){\ny<=  7;\n}");
        assertEquals(list1, results1);
        
        
    }
    
}

Kommen illegale Zeichen wie = statt <= vor so muss ILLEGAL in der results Liste nur drinstehen.

Ich will keine Lösung. Jedoch hab ich gerade nicht wirklich eine Idee, wie ich es umsetzen soll. Ich dachte zuerst an die split() Methode, aber die entfernt ja alle Übereinstimmungen aus dem String und das ist ja genau das Umgekehrte was ich machen will.

Freue mich über Ansätze🙂
 
Guck dir mal Lookaheads und Lookbehinds an. Damit kann man den Delimiter beim Splitten auch beibehalten.

Zum Beispiel:
Java:
System.out.println(Arrays.toString("if (x >0){\ny<=  7;\n}".split("((?<=\\W)|(?=\\W))")));

Dein Pattern etc. musst du dann an deine Anforderungen anpassen 😉

Alternativ kann sich auch ein Matcher ganz gut eignen.
 

Zurück
Oben