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:
Tauschesentence: 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 openFiles': 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!