Bison Parser Generator - Hilfe benötigt



  • Hi Leute,

    kurz und bündig:

    Ich benötige einen Parser für eine bestimmte Syntax, welchen ich mir durch "Bison" bauen lassen will (Bison ist ja angelehnt an "yacc").

    Ich arbeite mich seit Tagen durch die Handbücher, google mir die Finger wund und komme nun nicht mehr weiter.

    Folgender Zustand ist im Moment gegeben:

    Ich habe eine Grammatikdatei erstellt, in welcher ich Testweise eine Grammatik für eine Zeichenkette mit dem inhalt "abc" erstellt habe.

    Hier meine Grammatikdatei ("grammar.y"):

    %%
    
    sentence: char | char_sequence
    		;
    
    char: 'a' | 'b' | 'c'
    		;
    
    char_sequence: char | char char_sequence
    		;
    
    %%
    

    Ich habe mir den Bison Parser für Windows installiert (aus den GNU Windows Tools). Diesen rufe ich nun wie folgt in der Kommandozeile auf:

    C:\Users\xxxxx\Desktop>bison -d grammar.y
    

    als Ausgabe erhalte ich in der Konsole eine Menge Output, der so aussieht:

    m4_init()
    m4_define([b4_actions], 
    [])
    
    m4_define([b4_mergers], 
    [[]])
    
    m4_define([b4_tokens], 
    [])
    
    m4_define([b4_symbol_destructors], 
    [])
    
    m4_define([b4_symbol_printers], 
    [])
    
    m4_define([b4_translate],
    [[     0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     3,     4,     5,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
           2,     2,     2,     2,     2,     2,     1,     2]])
    
    m4_define([b4_use_push_for_pull_flag],
    [[0]])
    
    m4_define([b4_pact_ninf],
    [[-4]])
    
    m4_define([b4_conflict_list_heads],
    [[     0,     0,     0,     0,     0,     0]])
    
    m4_define([b4_toknum_max],
    [[257]])
    
    m4_define([b4_rhs],
    [[     7,     0,    -1,     8,    -1,     9,    -1,     3,    -1,     4,
          -1,     5,    -1,     8,    -1,     8,     9,    -1]])
    
    m4_define([b4_last],
    [[5]])
    
    m4_define([b4_stos_min],
    [[0]])
    
    m4_define([b4_tag_seen_flag],
    [[0]])
    
    m4_define([b4_percent_define_loc(lr.keep_unreachable_states)],
    [[[[[Bison:muscle_percent_define_default]:1.0]], [[[Bison:muscle_percent_define_default]:1.0]]]])
    
    m4_define([b4_parser_file_name],
    [[grammar.tab.c]])
    
    m4_define([b4_table_min],
    [[1]])
    
    m4_define([b4_table],
    [[     1,     2,     3,     7,     5,     6]])
    
    m4_define([b4_conflicting_rules_max],
    [[0]])
    
    m4_define([b4_merger],
    [[     0,     0,     0,     0,     0,     0,     0,     0,     0]])
    
    m4_define([b4_glr_flag],
    [[0]])
    
    m4_define([b4_check_max],
    [[5]])
    
    m4_define([b4_spec_graph_file],
    [[]])
    
    m4_define([b4_rline_min],
    [[0]])
    
    m4_define([b4_toknum],
    [[     0,   256,   257,    97,    98,    99]])
    
    m4_define([b4_defgoto_max],
    [[9]])
    
    m4_define([b4_version],
    [[2.4.1]])
    
    m4_define([b4_translate_min],
    [[0]])
    
    m4_define([b4_pkgdatadir],
    [[C:\Program Files (x86)\GnuWin32/share/bison]])
    
    m4_define([b4_pgoto_min],
    [[-4]])
    
    m4_define([b4_rhs_max],
    [[9]])
    
    m4_define([b4_pgoto],
    [[    -4,    -4,     4,     5]])
    
    m4_define([b4_pact_max],
    [[3]])
    
    m4_define([b4_debug_flag],
    [[0]])
    
    m4_define([b4_yacc_flag],
    [[0]])
    
    m4_define([b4_spec_verbose_file],
    [[grammar.output]])
    
    m4_define([b4_conflict_list_heads_min],
    [[0]])
    
    m4_define([b4_tname],
    [["$][end", "error", "$][undefined", "'a'", "'b'", "'c'", "$][accept",
      "sentence", "char", "char_sequence", ]b4_null[]])
    
    m4_define([b4_defact],
    [[     0,     4,     5,     6,     0,     2,     3,     1,     7,     8]])
    
    m4_define([b4_tokens_number],
    [[6]])
    
    m4_define([b4_stos_max],
    [[9]])
    
    m4_define([b4_merger_min],
    [[0]])
    
    m4_define([b4_table_max],
    [[7]])
    
    m4_define([b4_spec_name_prefix],
    [[]])
    
    m4_define([b4_epilogue],
    [[]b4_syncline(12, [["grammar.y"]])[
    ]])
    
    m4_define([b4_table_ninf],
    [[-1]])
    
    m4_define([b4_prhs],
    [[     0,     0,     3,     5,     7,     9,    11,    13,    15]])
    
    m4_define([b4_check],
    [[     3,     4,     5,     0,     0,     0]])
    
    m4_define([b4_nterms_number],
    [[4]])
    
    m4_define([b4_rline_max],
    [[9]])
    
    m4_define([b4_dprec],
    [[     0,     0,     0,     0,     0,     0,     0,     0,     0]])
    
    m4_define([b4_rline],
    [[     0,     3,     3,     3,     6,     6,     6,     9,     9]])
    
    m4_define([b4_prhs_min],
    [[0]])
    
    m4_define([b4_spec_outfile],
    [[]])
    
    m4_define([b4_translate_max],
    [[5]])
    
    m4_define([b4_percent_define_syncline(lr.keep_unreachable_states)],
    [[]b4_syncline(1, [["[Bison:muscle_percent_define_default]"]])[]])
    
    m4_define([b4_r1_min],
    [[0]])
    
    m4_define([b4_user_token_number_max],
    [[257]])
    
    m4_define([b4_max_left_semantic_context],
    [[0]])
    
    m4_define([b4_pgoto_max],
    [[5]])
    
    m4_define([b4_rules_number],
    [[8]])
    
    m4_define([b4_file_name_all_but_ext],
    [[grammar.tab]])
    
    m4_define([b4_error_verbose_flag],
    [[0]])
    
    m4_define([b4_token_table],
    [[0]])
    
    m4_define([b4_r2_min],
    [[0]])
    
    m4_define([b4_pact],
    [[    -3,    -4,    -4,    -4,     3,    -3,    -4,    -4,    -3,    -4]])
    
    m4_define([b4_dprec_min],
    [[0]])
    
    m4_define([b4_defact_min],
    [[0]])
    
    m4_define([b4_defines_flag],
    [[1]])
    
    m4_define([b4_synclines_flag],
    [[1]])
    
    m4_define([b4_nondeterministic_flag],
    [[0]])
    
    m4_define([b4_conflict_list_heads_max],
    [[0]])
    
    m4_define([b4_dir_prefix],
    [[]])
    
    m4_define([b4_merger_max],
    [[0]])
    
    m4_define([b4_undef_token_number],
    [[2]])
    
    m4_define([b4_prhs_max],
    [[15]])
    
    m4_define([b4_spec_file_prefix],
    [[]])
    
    m4_define([b4_r1_max],
    [[9]])
    
    m4_define([b4_toknum_min],
    [[0]])
    
    m4_define([b4_spec_defines_file],
    [[grammar.tab.h]])
    
    m4_define([b4_conflicting_rules_min],
    [[0]])
    
    m4_define([b4_r1],
    [[     0,     6,     7,     7,     8,     8,     8,     9,     9]])
    
    m4_define([b4_r2],
    [[     0,     2,     1,     1,     1,     1,     1,     1,     2]])
    
    m4_define([b4_percent_define_bison_variables(lr.keep_unreachable_states)],
    [[]])
    
    m4_define([b4_check_min],
    [[0]])
    
    m4_define([b4_states_number],
    [[10]])
    
    m4_define([b4_r2_max],
    [[2]])
    
    m4_define([b4_dprec_max],
    [[0]])
    
    m4_define([b4_defgoto],
    [[    -1,     4,     8,     9]])
    
    m4_define([b4_defact_max],
    [[8]])
    
    m4_define([b4_stos],
    [[     0,     3,     4,     5,     7,     8,     9,     0,     8,     9]])
    
    m4_define([b4_final_state_number],
    [[7]])
    
    m4_define([b4_defgoto_min],
    [[-1]])
    
    m4_define([b4_file_name],
    [["grammar.y"]])
    
    m4_define([b4_locations_flag],
    [[0]])
    
    m4_define([b4_percent_define(lr.keep_unreachable_states)],
    [[false]])
    
    m4_define([b4_rhs_min],
    [[-1]])
    
    m4_define([b4_pact_min],
    [[-4]])
    
    m4_define([b4_conflicting_rules],
    [[     0]])
    

    Im Moment ist das nichtssagend für mich und der Hauptpunkt an dem ich hänge ist:

    WARUM wird keine "grammar.c" Datei erstellt? Ich habe auch mal testweise mit der Option -v eine Datei anlegen lassen die mir zusätzliche Infos zur Grammatik und zum Parser ausgibt, die sieht dann wie folgt aus ("grammar.output"):

    Zustand 5 Konflikte: 1 Reduziere/Reduziere
    
    Grammatik
    
        0 $accept: sentence $end
    
        1 sentence: char
        2         | char_sequence
    
        3 char: 'a'
        4     | 'b'
        5     | 'c'
    
        6 char_sequence: char
        7              | char char_sequence
    
    Terminale und die Regeln, in denen sie verwendet werden
    
    $end (0) 0
    'a' (97) 3
    'b' (98) 4
    'c' (99) 5
    error (256)
    
    Nicht-Terminal und die Regeln, in denen sie verwendet werden
    
    $accept (6)
        auf der linken Seite: 0
    sentence (7)
        auf der linken Seite: 1 2, auf der rechten Seite: 0
    char (8)
        auf der linken Seite: 3 4 5, auf der rechten Seite: 1 6 7
    char_sequence (9)
        auf der linken Seite: 6 7, auf der rechten Seite: 2 7
    
    Zustand 0
    
        0 $accept: . sentence $end
    
        'a'  schiebe und gehe zu Zustand 1 über
        'b'  schiebe und gehe zu Zustand 2 über
        'c'  schiebe und gehe zu Zustand 3 über
    
        sentence       gehe zu Zustand 4 über
        char           gehe zu Zustand 5 über
        char_sequence  gehe zu Zustand 6 über
    
    Zustand 1
    
        3 char: 'a' .
    
        $default  reduziere mit Regel 3 (char)
    
    Zustand 2
    
        4 char: 'b' .
    
        $default  reduziere mit Regel 4 (char)
    
    Zustand 3
    
        5 char: 'c' .
    
        $default  reduziere mit Regel 5 (char)
    
    Zustand 4
    
        0 $accept: sentence . $end
    
        $end  schiebe und gehe zu Zustand 7 über
    
    Zustand 5
    
        1 sentence: char .
        6 char_sequence: char .
        7              | char . char_sequence
    
        'a'  schiebe und gehe zu Zustand 1 über
        'b'  schiebe und gehe zu Zustand 2 über
        'c'  schiebe und gehe zu Zustand 3 über
    
        $end      reduziere mit Regel 1 (sentence)
        $end      [reduziere mit Regel 6 (char_sequence)]
        $default  reduziere mit Regel 1 (sentence)
    
        char           gehe zu Zustand 8 über
        char_sequence  gehe zu Zustand 9 über
    
    Zustand 6
    
        2 sentence: char_sequence .
    
        $default  reduziere mit Regel 2 (sentence)
    
    Zustand 7
    
        0 $accept: sentence $end .
    
        $default  annehmen
    
    Zustand 8
    
        6 char_sequence: char .
        7              | char . char_sequence
    
        'a'  schiebe und gehe zu Zustand 1 über
        'b'  schiebe und gehe zu Zustand 2 über
        'c'  schiebe und gehe zu Zustand 3 über
    
        $default  reduziere mit Regel 6 (char_sequence)
    
        char           gehe zu Zustand 8 über
        char_sequence  gehe zu Zustand 9 über
    
    Zustand 9
    
        7 char_sequence: char char_sequence .
    
        $default  reduziere mit Regel 7 (char_sequence)
    

    Wie gesagt ich erhalte keine "grammar.c" Datei die ich erwarte, stattdessen bekomme ich (wenn ich die Ausgabe Testweise in eine Textdatei umleiten will) die Konsolenausgabe:

    grammar.y: Konflikte: 1 Reduziere/Reduziere
    m4: cannot open `Files': No such file or directory
    m4: cannot open `(x86)\GnuWin32/share/bison': No such file or directory
    m4: cannot open `C:\Program': No such file or directory
    m4: cannot open `Files': No such file or directory
    m4: cannot open `(x86)\GnuWin32/share/bison/m4sugar/m4sugar.m4': No such file or directory
    m4: cannot open `C:\Program': No such file or directory
    m4: cannot open `Files': No such file or directory
    m4: cannot open `(x86)\GnuWin32/share/bison/bison.m4': No such file or directory
    m4: cannot open `C:\Program': No such file or directory
    m4: cannot open `Files': No such file or directory
    m4: cannot open `(x86)\GnuWin32/share/bison/c-skel.m4': No such file or directory
    

    Diese Dateien und verzeichnisse sind aber alle vorhanden. Bison sitzt auch in meiner Umgebungsvariable im "Path".

    Hat Jemand damit schon gearbeitet und kann mir sagen woran es liegt, dass ich keine C-Code Ausgabedatei mit meinem Parser erhalte??

    Gruss

    soylent_green



  • Wenn ich die Datei mit -d aufrufe wird bei mir eine .h Datei erstellt ohne Optionen wird eine .c Datei erstellt. Lass also mal -d weg. Sonst würde ich tippen, dass bei der Installation was schief gegangen ist (arbeite allerdings unter Mac OS X, wo Bison standardmäßig installiert ist).

    Zu dem Konflikt:
    Tausche

    sentence: char | char_sequence
    

    durch

    sentence: char_sequence
    

    sonst hast du zwei Nonterminale die durch char dargestellt werden können.



  • Mir war so, als hätte ich zu diesem Thread schonmal eine Antwort geschrieben. Finde sie aber nicht mehr, also ... (?)

    Dann nochmal: Die Pfadangaben in den Fehlermeldungen,
    "m4: cannot open Files': No such file or directory m4: cannot open(x86)\GnuWin32/share/bison': No such file or directory"

    sehen danach aus, als ob hier irgendwo ein Pfad wie "C:\Program Files (x86)\GnuWin32/share/bison" vorkommt, richtig? Unter Vista heißt das so, soweit ich weiß. Der m4 Makroprozessor, den bison anscheinend intern benutzt, interpretiert das aber als mehrere Argumente, d.h. er sieht "C:\Program", "Files" und "(x86)\GnuWin32..." und versteht nicht, was man von ihm will. Deswegen gibt er erstens Fehlermeldungen aus und lässt zweitens die Ausgabe unverarbeitet (deshalb die ganzen m4_define-etc.-Sachen). Wahrscheinlich ein Fehler in Bison, beim Aufruf fehlen in der Kommandozeile die Anführungsstriche um den Pfad.

    Abhilfe: Den Bug in Bison fixen (lassen) oder das "GnuWin32"-Zeug in einen Pfad ohne Leerzeichen zu installieren. Kannst ja mal bei Bison oder GnuWin32 gucken, ob du denen einen Bugreport schreibst.



  • Hi,

    Danke für Eure Antworten.

    Ich habe mir inzwischen einen anderen Weg gesucht das Ganze hinzubekommen, andere Sprache, anderes Modul.

    Aber ich werde sicherlich nochmal Bison testen und dann denke ich an Eur Tips.

    Danke! 🙂

    Gruss



  • Hi.

    Ich durfte mich mit dem Problem auch vor ein paar Wochen herumschlagen. Die hier vermutete Ursache ist richtig: Es sind die Leerzeichen im Pfad, mit denen die Linux-Software nicht umgehen kann. Um mir den Aufwand der Installation von bison in einen anderen Ordner zu ersparen, habe ich im PATH für bison einfach Progra~2 eingesetzt und schwupp ging's.

    Man darf bei bison/flex & Co. einfach nie vergessen, dass es sich um typische Linux-Software handelt. 😉

    Viele Grüße!


Anmelden zum Antworten