problem mit C grammatik



  • hallo,

    ich würde gerne folgende C grammatik für einen parser verwenden:
    http://kbs.cs.tu-berlin.de/~jutta/c/ANSI-C-grammar-y.html

    allerdings gibt es dort beim nichtterminal "type_specifier" die ableitung zum terminal TYPE_NAME. wenn ich dies in IDENTIFIER umändere bekomme ich etliche shift/reduce und reduce/reduce konflikte:

    C:\>bison -l -d --report=solved test_grammar.y
    test_grammar.y: Konflikte: 6 Schiebe/Reduziere, 32 Reduziere/Reduziere
    test_grammar.y:304.11-20: Warnung: Regel nie reduziert wegen Konflikten: identifier_list: IDENTIFIER

    gibt es einen einfachen weg diese zu vermeiden? ich möchte eigentlich ungerne schon den scanner erkennen lassen ob es sich um einen typ (mit typedef deklariert) oder einen sonstigen bezeichner handelt (falls das überhaupt möglich ist)



  • Du hast da ein Paradebeispiel dafür gefunden, dass die C-Grammatik nicht konfliktfrei ist. Dass das nicht trivial zu lösen ist, siehst du z.B. an diesem Code:

    A * B;
    

    Deklaration oder Ausdruck? Das kann nur beantwortet werden, wenn man weiß, ob A ein Typ ist, du musst also schon ein Stück semantische Analyse einschieben.



  • danke für die schnelle antwort. dieses codebeispiel ist absolut einleuchtend und raubt mir jegliche hoffnung die grammatik passend umzustellen. ich werde mal versuchen das über den scanner zu regeln.



  • Du musst quasi Buch führen.
    Erstell Dir eine Liste, in die die Datentypen eingefügt werden.
    Ich habe TYPEDEF aus storage_class_specifier herausgezogen und mir die Grammatik so umgeschrieben, dass Du den Identifier in der Typendefinition speichern kannst. Im Scanner, prüfst Du dann nur noch, ob der gefundene Identifier in der Datentypliste steht.

    Wenn er drin steht, gibst Du TYPE_NAME an den Parser weiter, ansonsten IDENTIFIER.

    Was willst Du denn mit Deinem Parser machen?


Log in to reply