1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

String auf bestimmte Syntax testen

  • Thorgos
  • 18. April 2008 um 23:08
  • Unerledigt
  • Thorgos
    2
    Thorgos
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 18. April 2008 um 23:08
    • #1

    Hallo liebe Forenleser,

    Ich habe folgendes Problem.
    Es wird ein String eingelesen der aus folgenden Elementen besteht

    [ 0..9 ] [ ( ] [ ) ] [ +,-,/;* ] [ , ]

    Also alle Elemente die ich für einen Taschenrechner brauche :winking_face:

    Sooo
    Nun bekomme Ich meine Eingabe in der Form

    0..9,0.9*(0..9+0..9)

    Wie stelle Ich das nun also am besten an das Ich kontrolliere ob die Syntax des eingebenden Strings stimmt ?

    Ich dachte mir vieleicht Element für Element vorgehen bestimmen welches Zeichen es ist und guck was das nachfolgende ist und gucken ob das erlaubt ist. Das ganze dann rekursiv aufrufen.

    Aber Ich denke das das dann ein riesiges Programm werden würde nur für die Syntaxkontrolle.

    Hoffe auf eure Ideen und Anregungen

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 18. April 2008 um 23:38
    • #2

    Ein simples Beispiel für die Anwendung des Compilerbaus.

    Üblicherweise geht man mehrstufig vor:
    - Ein Tokenizer zerlegt den String in Tokens, also Zahlen, Operatoren, Klammern.
    - Ein Parser überprüft, ob die Syntax in Ordnung ist und kann auch gleich einen Baum erstellen. Bei so einfachen Parsern verwendet man üblicherweise rekursiven Abstieg (LL(n)), bei komplexeren Dingen eher etwas wie LR(n).
    - Diesen Baum wertest du dann aus (z.b. mit einem Visitor oder einer calc()-Methode in jedem Objekt des Baums).

    Für Tokenizer und Parser kannst du auch Tools verwenden, die dir die meiste Arbeit abnehmen: lex und yacc.

    Im Übrigen ist das ein Standardbeispiel - es sollte genug Literatur dazu im Google geben, wie man so was baut.

    EDIT: Wenn es dir aber nur um die Überprüfung und nicht so sehr um die Auswertung des Strings geht, dann reicht auch eine Regular Expression Library aus.

    Dipper dipper dii dipper dii dipper dii duuu

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 19. April 2008 um 08:55
    • #3

    Wurde eh schon fast alles gesagt was wichtig ist, aber hier noch 2 Anmerkungen:

    • Auf jeden Fall http://www.antlr.org/ evaluieren, bevor Du dich auf lex/yacc stuerzt.
    • Was in deinem Fall vielleicht Sinn machen koennte: Anstatt einen neuen Interpreter fuer eine neue Sprache zu schreiben, kannst Du natuerlich auch einen bestehende Interpreter von einer anderen Sprache verwenden. Mathematische Ausdruecke auswerten koennen ja sehr viele Sprachen. Du koenntest z.b. den Ausdruck von bc oder python oder Rhino oder SQLite auswerten lassen. In diesem Fall wuerde ich aber den Ausdruck zumindest vorher mit einer Regular Expression pruefen, vor allem, wenn die Ausdruecke von einem Benutzer eingegeben werden koennen.

    lg, Benjamin Ferrari, bookworm.at

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 19. April 2008 um 12:16
    • #4

    Antlr evaluieren - auf jeden Fall.

    Aber mir ist er nicht sehr sympathisch. Da mag ich flex/bison schon viel lieber. Mir geht auf die Nerven, dass der von ANTLR erzeugte Parser bei der Auswertung ständig Exceptions wirft - sehr unpraktisch, wenn man im Debugger einen Breakpoint auf Exception throw gesetzt hat.
    Und die Diagnostics versteh ich auch nicht wirklich. Die vom bison sind da schon eher verständlich, wenn man eine Ahnung vom shift/reduce-Mechanismus hat.

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 19. April 2008 um 13:07
    • #5
    Zitat von sauzachn

    EDIT: Wenn es dir aber nur um die Überprüfung und nicht so sehr um die Auswertung des Strings geht, dann reicht auch eine Regular Expression Library aus.

    Nicht wirklich, wenn du auch die Klammerebenen kontrollieren willst. Das ist nämlich nicht regulär, dazu brauchst du schon einen Kellerautomaten.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Leocor
    4
    Leocor
    Mitglied
    Punkte
    165
    Beiträge
    23
    • 19. April 2008 um 18:58
    • #6

    kannst dich noch an eProg erinnern ....

    verwende so einen Operationsbaum:

    3+5*7 =>
    +
    / \
    3 *
    / \
    5 7

    und so weiter das ist das einfachste und wenn mal wo ein blatt felt -> fehler
    oder nach jeden operator keine zahl kommt ....

    http://de.youtube.com/watch?v=H9B4a2KEoGY&feature=related
    http://de.youtube.com/watch?v=HhHsXAVHyaA&feature=related

  • Thorgos
    2
    Thorgos
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 20. April 2008 um 15:30
    • #7

    Sorry aber mit den Lösungen komme Ich nicht zurecht, wahrscheinlich zu dumm,

    Ich möchte am liebsten das alles in EBNF Notation schreiben und dann den string anhand dieser EBNF Notation kontrollieren.

    Nun weiß Ich aber nicht wie Ich das in C++ definiere.
    Mach ich das über Structs oder wie genau mache Ich das.

    Ich weiß das sind sicher Anfängerfragen aber Ich bin in OOP komplett alleine und muss das mit Freitag abgeben und habe keine Ahnung was Ich tun soll.
    Und leider muss man, da Klammer enthalten sein dürfen, stark aufpassen was man tut.

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 20. April 2008 um 17:51
    • #8

    Naja, das geht zB mit boost::spirit. Aber das könnte evtl etwas über die OOP-LVA hinaus gehen.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 20. April 2008 um 18:29
    • #9
    Zitat von Thorgos

    Ich möchte am liebsten das alles in EBNF Notation schreiben und dann den string anhand dieser EBNF Notation kontrollieren.


    Du kannst deine EBNF-Grammatik praktisch 1:1 in einen rekursiven Abstieg ("recursive descent") abbilden.

    Kurz gesagt machst du für jedes Nichtterminal eine Methode dieses Namens in deiner Parser-Klasse, die das überprüft, was bei dem Nichtterminal nach ::= steht.

    Der Body sieht immer recht ähnlich aus. Du schaust dir das nächste Token an und wenn es der Erwartung entspricht, baust du deinen Syntaxbaum (auch AST genannt) weiter auf. Ansonsten gibst du einen Fehler aus o.ä.

    Probleme (im Sinne von Komplexität) gibts beim rekursiven Abstieg immer erst dann, wenn du mehr als ein Zeichen Lookahead brauchst (LL(n) für n >= 2) oder wenn du sehr umfangreiche Grammatiken hast, die man besser mit (automatisch erzeugten, da händisch sehr umständlich zu erstellende FIRST- und FOLLOW-Mengen anstehen) LR(1) erschlägt. In deinem Fall seh ich das Problem aber nicht, da du mit einem Token Lookhead auskommen solltest.

    Dipper dipper dii dipper dii dipper dii duuu

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung