top down parser für RegExp selber bauen?

fromongatobomga

Grünschnabel
Hey leute,
ich wollte mal fragen ob jemand ein gutes Totorial oder einen Beispiel-Code für einen selbstgebauten Parser in java kennt. Alles was ich derzeit bei google gefunden habe war nicht wirklich aufschlussreich.

Ich möchte einen Parser für Reguläre Ausdrücke schreiben. Das ganze soll dann in einen DEA überführt werden und für die gegebene Grammatik durch einen String Durchlaufen.

Ich habe schon einen Ansatz, allerdings setzt dieser mir die Folgezustände (Zustandstabelle) nicht richtig. Meine größten Probleme sind bie der behandlung des Oder-Opperators in Klammern und bei der Hüllenbildung (Widerholung).

Wäre nett wenn mir da jemand helfen könnte :/

LG From
 
Also ich hab hier schon mal nen Ansatz, nun weiß ich aber nicht wie ich da nun im Durchlauf des Parsens einen Automaten konstruieren kann !
Wie bekomm ich das hin, das ich mir aus diesem ansatz ne Liste mit Zuständen für einen erkennenden Automaten bastel ? Ich brauch echt hilfe -.- *jammer*

Gramatik:
| = oder
* =Belibig offt wiederholen

Beispiel: a((b|c)*)d = a dann b oder c belibig offt dann ein d ( abbbbbd, acccccd usw.)

Code:
public class Zustand {
    
    public Zustand(int ID, char c, int next1, int next2){
        
        this.ID=ID;
        this.c=c;
        this.next1=next1;
        this.next2=next2;
    }

    public int ID;
    public char c;
    public int next1;
    public int next2;

    public void setnext1(int next){
        next1=next;
    }
    public void setnext2(int next){
        next2=next;
    }

    public int getID(){
        return ID;
    }

    public char getChar(){
        return c;
    }
}

public class Selfmade_Parser {
    
    LinkedList<Zustand> queue = new LinkedList<Zustand>();
    private String expr;
    private int lenght;
    private int position=0;
    private int id=1;

    public Selfmade_Parser(String expression){
        expr=expression;
        lenght=expr.length();
    }
    
    public void parse(){
        expression();
    }

    public void expression(){
       term();
       queue.addFirst(new Zustand(0, ' ', 1, 1));
       queue.addLast(new Zustand(id, ' ', 0, 0))

    }

    public void term(){
    factor();     
    }

    public void factor(){
    if(expr.charAt(position)=='('){
    position++;
    term();
}
    if(expr.charAt(position)!= ')'){
    System.err.println("KLAMMER NICHT GESCHLOSSEN!!");
    System.exit(0);
    }
     position++;
    }
        digit();
    if(expr.charAt(position)=='*'){
      //Keine ahnung wie ich das Implementieren soll
    }
         if(expr.charAt(position)== '|'){
       //Keine ahnung wie ich das Implementieren soll
         }
    }
        
    }

    public void digit(){
        if(isLetter(expr.charAt(position))||isNumber(expr.charAt(position))){
            queue.add(new Zustand(id, expr.charAt(position), (id+1), (id+1)));
            id ++;
            position++;
        }

    }

    private boolean isLetter(char c) {
        char[] letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
        boolean isLetter = false;

        for (int i = 0; i < letters.length; i++) {
            if (letters[i] == c) {
                isLetter = true;
                return isLetter;
            }
        }
        return isLetter;
    }

    private boolean isNumber(char c) {
        char[] numbers = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
        boolean isNumber = false;
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == c) {
                isNumber = true;
            }
        }
        return isNumber;

    }

}
 
Danke das hatte ich auch schon gefunden. Ich hab nur null plan von C++ und der nutzt noch ganz bestommte Bibliotheken. Das hilft mir also nur ein wenig im Verständniss weiter. Ist auch ein ganz anderer ansatz.

trotzdem danke.
 
Danke das hatte ich auch schon gefunden. Ich hab nur null plan von C++ und der nutzt noch ganz bestommte Bibliotheken. Das hilft mir also nur ein wenig im Verständniss weiter. Ist auch ein ganz anderer ansatz.
Ganz bestimmte Bibliotheken? So wie ich das sehe, kommt dort nur die Standardbibliothek von C++ zum Einsatz. Ok, wenn man die nicht kennt, kann das schon eine Hürde sein. Aber ich würde mich eh nicht so am Quellcode festklammern. Im Artikel wird ja alles Wichtige beschrieben.

Grüße,
Matthias
 
Wie gesagt vom Verständniss her hat es mir schon weitergeholfen ^^

Was die Bibliotheken angeht, das hab ich mich verlesen. Er beschreibt wo man eine regexp library herbekommt wenn man sich keine eigene erstellen will. Mein fehler ^^

Dennoch komm ich mit C++ kaum bis garnicht klar :D Davon mal ab ist der Ansatz sehr schwer für mich. Ich verstehe nur die Hälfte. Das liegt weniger an der Sprache (english) sonder mehr an der Umsetzung des Konstruktes. Ich Tue mich da sehr schwer fällt mir auf. Ich hab ähnliche theoretische Ansätze in Deutscher Sprache gefunden. Die Theorie is klar. Auch wie ich aus einem NEA einen DEA ``per hand´´ konstruiere ist mir bewusst, allerdings wie ich das in quellcode umsetzte... da hört es dann auf.

Obwohl ich schon glücklich wäre, eine vernümpftige Top-Down-Syntaxanalyse zu haben xD

LG
 
Hallo,

ich würde an deiner Stelle erst mal einen allgemeinen NEA implementieren. Dann sollte dir die Implementierung des Parsers hoffentlich leichter fallen, weil du dich dann auf eine Sache konzentrieren kannst.

Grüße,
Matthias
 
Ok dann schaue ich mal das ich beb Gerüßt für einen NEA bastel ohen irgendwelche Gedanke an die Nutzung bzw. an das zu verschwenden mit dem er gefüttert wird. Danns ehen wir mal weiter.

Auf jeden fall schon mal eine dickes Danke für die Unterstützung.

LG
 
Zurück