Frage

Ich habe dabei geholfen, sich vermehren, eine zwanzig Jahre alte proprietäre Sprache, die innerhalb meiner Firma.Es ist eine große, Turing-vollständige Sprache.Übersetzen es zu einer anderen Grammatik-regime (wie Antlr) ist nicht eine option (die ich nicht bekommen, um dies zu entscheiden).

Für die meisten Teil, die Erweiterung der Grammatik hat reibungslos.Aber jeder einmal in eine Weile, ich werde eine reduzieren-verkleinern oder verschieben-zu reduzieren, dass die

  • ist schwer zu beseitigen
  • manchmal ist es einfach nicht sinnvoll ist (nach meinem müden Gehirn)

Nach vielen schmerzhaften und starrte y.Ausgabe Dateien und experimentelle Grammatik refactorings, ich habe in der Regel bekommen, wo ich wollte gehen.Manchmal habe ich, um unbefriedigende Kompromisse.

Also, gibt es irgendwelche tools gibt, die können saugen in einem yacc-Grammatik, die Verbesserung surfen, Experimentieren und ermöglichen das Debuggen von änderungen?

Wenn ich eine Produktion, ich würde gerne mehr sehen, als "atomic die Produktion, dass ist verwendet überall" (denken identifier) "Konflikte mit der Regel foo" (ja, es gibt mehr info, s/r, r/r, als die, aber ich denke, Sie bekommen meine drift).Es wäre schön zu haben, einen Hinweis für das zusammenspiel jenseits putting auf mein denken Kappe und versuchen zu stellen Sie sich ein symbol, Stapel-und Status-Maschine.

Update:Ich glaube, ich sollte klarstellen.Wir verwenden Berkeley Yacc.Ich habe die Prüfung mit einer aktuellen version von Bison.Für die Ausgabe, das ich zusammengestellt habe, die Grammatik mit --report=itemset.

Mein Ziel mit diesem post ist, suchen externe Werkzeuge, die vermehren die Grammatik debug-Möglichkeiten, das Schiff mit yacc.Es tut weh, heute mit dem Standard-set.Mir helfen, bessere interaktive tools, wie diejenigen, die Sie verwenden können, mit Antlr.

War es hilfreich?

Lösung

Sie könnte Holen Sie sich ein wenig Hilfe von yacc -d, die erzeugt debugging-Ausgabe -- es im Grunde gibt eine vollständige Liste der symbol-stack-Staaten und solche.Der Ausgang ist dicht und voluminös, so versucht zu Lesen, es direkt nur selten erreicht, viel (hat nie für mich jedenfalls).Wenn Sie jedoch eine änderung vornehmen, die gibt (zum Beispiel) ein r/r Konflikt, den Sie ausführen können yacc -d auf der alten Grammatik und der "neue", dann "diff" auf die Ergebnisse, um eine viel detailliertere run-down auf, welche Veränderung(en), die den Konflikt verursacht.

Es ist wahrscheinlich erwähnenswert, jedoch, dass der s/r-Konflikte sind oft gutartig-es sei denn, Sie sind sich ziemlich sicher, dass es ein problem ist, versuchen zu "reparieren" ist es oft nicht lohnt.Das ist nicht wahr, gleichen Sie mit r/r die Konflikte aber.Während diese manchmal gutartige, es ist vergleichsweise selten.

Edit:Oops-sorry, das sollte -v.Sie erwähnen, y.Ausgang, so dass Sie anscheinend bereits wissen, wie zu tun, dass ein Teil.Der Punkt ist, dass Sie nicht versuchen, den y.output-Dateien direkt, aber einen Unterschied zwischen der einen, der kam sauber und die, die nicht um einige Details zu bekommen über die tatsächlichen Konflikt (ohne zu starren auf 10 jillion Zeilen von "Zeug", das ist gut so.

Andere Tipps

Dies ist die beste, die ich bekam:http://tldp.org/HOWTO/Lex-YACC-HOWTO-7.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top