tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
632
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    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
     

  2. #2
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    
    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;
     
        }
     
    }
     

  3. #3
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Hallo,

    schau mal hier: http://www.codeproject.com/KB/recipe...onsParser.aspx – ist zwar nicht Java, aber sollte sich ja übertragen lassen.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  4. #4
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    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.
     

  5. #5
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Zitat Zitat von fromongatobomga Beitrag anzeigen
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  6. #6
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    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 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
     

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  8. #8
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    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
     

  9. #9
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Mit ANTLR kann man ganz gut Parser für Java generieren: http://www.antlr.org/wiki/display/AN...etting+Started
     

  10. #10
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    Danke aber das darf ich nicht benutzen, das wäre betrug da es sich um eine studienarbeit handelt
     

  11. #11
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Ahso, sorry hab ich nicht gelesen. Aber schau mal in das Buch rein. Im ersten Teil ist das Prinzip dieser Art von Parser beschrieben.
     

  12. #12
    fromongatobomga fromongatobomga ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    12
    ok danke das is ne coole sache. da werd ich gelich mal reinlesen.

    thx
     

Ähnliche Themen

  1. Problem mit RegExp (BBCode-Parser)
    Von MonGol1992 im Forum PHP
    Antworten: 10
    Letzter Beitrag: 08.01.08, 10:12
  2. Web-Proxy selber bauen
    Von seppi2 im Forum PHP
    Antworten: 0
    Letzter Beitrag: 03.10.05, 17:08
  3. PC selber bauen !
    Von TobGod im Forum Hardware
    Antworten: 2
    Letzter Beitrag: 08.09.04, 21:01
  4. Lüfterregler selber bauen
    Von perihel im Forum Hardware
    Antworten: 1
    Letzter Beitrag: 19.06.04, 18:28
  5. Forum selber bauen wie
    Von boelkstoff im Forum PHP
    Antworten: 18
    Letzter Beitrag: 24.09.03, 16:41