2009-10-28 9 views
10

Ich habe dabei geholfen, eine 20 Jahre alte proprietäre Sprache in meiner Firma zu erweitern. Es ist eine große, Turing-vollständige Sprache. Es zu einer anderen Grammatik zu übersetzen (wie Antlr) ist keine Option (ich kann das nicht entscheiden).Gibt es Yacc-Grammatik-Debugger?

In den meisten Fällen ist die Erweiterung der Grammatik reibungslos verlaufen. Aber jeder einmal in einer Weile werde ich eine Verminderungs reduzieren oder bei gedrückter Umschalttaste reduzieren, dass

  • schwierig ist
  • zu beseitigen manchmal macht einfach keinen Sinn machen (zu meinem schwachen Gehirn)

Nach einer Menge von schmerzhaften starren auf y.output Dateien und experimentelle Grammatik Refactorings, habe ich in der Regel bekommen, wo ich hin wollte. Manchmal musste ich unbefriedigende Kompromisse machen.

Also, gibt es irgendwelche Tools da draußen, die in einer Yacc-Grammatik saugen können, die das Browsen verbessern, experimentieren und das Debuggen von Änderungen erlauben?

Wenn ich eine Produktion hinzufüge, würde ich gerne mehr sehen als "atomare Produktion, die überall verwendet wird" (think identifier) ​​"Konflikte mit Regel foo" (ja, es gibt mehr Infos, s/r, r/r, als das, aber ich denke, du bekommst meine Drift). Es wäre schön, einen Hinweis auf das Wechselspiel zu haben, wenn ich meine Denkkappe nicht auflege und mir einen Symbolstapel und eine Zustandsmaschine vorstellen würde.

Update: Ich denke, ich sollte klären. Wir benutzen Berkeley Yacc. Ich habe mit einer neuen Version von Bison getestet. Zur Ausgabe habe ich die Grammatik mit --report = itemset kompiliert.

Mein Ziel mit diesem Beitrag ist externe Tools zu suchen, die augment die Grammatik-Debugging, die Schiff mit yacc. Es ist heute schmerzhaft mit der Standardeinstellung. Helfen Sie mir, bessere interaktive Tools zu finden, beispielsweise solche, die Sie mit Antlr verwenden können.

Antwort

7

Sie könnte von yacc -d etwas Hilfe bekommen, die Debug-Ausgaben produziert - es gibt im Grunde eine vollständige Auflistung der Symbolstapel Staaten und so. Die Ausgabe ist dicht und voluminös, so dass der Versuch, alles direkt zu lesen, selten viel bewirkt (hat es für mich sowieso nicht). Wenn Sie jedoch eine Änderung vornehmen (z. B. einen R/R-Konflikt), können Sie yacc -d auf der alten und der neuen Grammatik ausführen und dann diff auf den Ergebnissen ausführen, um einen viel detaillierteren Überblick darüber zu erhalten Änderung (en) verursachte den Konflikt.

Es ist jedoch erwähnenswert, dass s/r-Konflikte oft gutartig sind - es sei denn, Sie sind sich ziemlich sicher, dass es ein Problem ist, der Versuch, es zu "reparieren", lohnt sich oft nicht. Das Gleiche gilt jedoch nicht für R/R-Konflikte. Während diese sind manchmal gutartig, es ist vergleichsweise selten.

Bearbeiten: Hoppla - Entschuldigung, das sollte -v sein. Sie erwähnen y.output, also wissen Sie anscheinend schon, wie Sie diesen Teil machen. Der Punkt ist, dass Sie nicht versuchen, die y.output-Dateien direkt zu betrachten, sondern einen Unterschied zwischen dem, der sauber herauskam, und dem, der keine Details über den tatsächlichen Konflikt erhalten hat (ohne auf 10 zu starren) jillion linien von "stuff" das ist einfach in Ordnung.

+0

Ich bin mir nicht sicher, was du meinst. Mit unseren beiden yaccs bedeutet -d "eine Header-Datei für die Token-Makros ausgeben". Ich habe gerade weitere Informationen zur Verwendung des Schalters --report = itemset hinzugefügt. Ist das etwas, was du meinst? Es erzeugt eine Datei, y.output voll von allen Zustandsübergangsinformationen. Ich benutze es, hoffte aber auf ein leistungsfähigeres, interaktives Tool. –

+1

Jerry hat Recht, S/R-Konflikte sind nicht unbedingt Fehler. Fast jede echte Grammatik hat eine Menge von ihnen. – DigitalRoss