2014-02-21 8 views
8

Ich schreibe einen Compiler für eine eingebettete Skriptsprache, die in meiner Anwendung ausgeführt wird. Ich arbeite derzeit an der semantischen Analyse Teil des Compilers. Ich möchte in der Theorie wissen, wie man überprüft, ob alle Code-Pfade in einem gegebenen Skript einen Wert zurückgeben. Doing a Google search ergibt nur Ergebnisse über Leute, die den Fehler in ihrem eigenen Code sehen, wenn nicht alle Code-Pfade einen Wert zurückgeben (meistens SO-Fragen), so konnte ich keine Quellen finden, die erklären, wie die eigentliche Überprüfung durchgeführt werden kann. Kann mir jemand in die richtige Richtung zeigen?Wie überprüfe ich, ob alle Codepfade einen Wert zurückgeben

HINWEIS: Ich bin speziell auf der Suche nach einer autoritativen Quelle, die einen rigorosen Algorithmus umreißt, wenn überhaupt möglich.

+0

Ein alternativer Ansatz, der meiner Meinung nach erwähnt werden sollte, ist, dass * alle * Anweisungen einen Wert zurückgeben. Dann verschwindet das Problem durch das Design. –

+0

@KubaOber Ich hatte dies berücksichtigt, aber ich bevorzuge die Konvention, den Programmierer zu zwingen, eine Return-Anweisung zu verwenden, um die Wahrscheinlichkeit von Programmierfehlern zu reduzieren. – MrCodeMnky

Antwort

6

Sie können dies mit einem rekursiven Spaziergang über die AST tun. Zum Beispiel:

  • eine Folge von Anweisungen Rückkehr auf allen Steuerpfade, wenn entweder die erste Anweisung Rückkehr auf allen Steuerwege oder der zweiten Anweisung Rückkehr auf allen Steuerpfade.

  • Eine if-Anweisung gibt auf allen Steuerpfaden zurück, wenn die Zweige "if" und "else" auf allen Steuerpfaden zurückgeben oder die "if" -Anweisung immer wahr ist.

  • Eine while-Schleife kehrt nur dann zu allen Steuerpfaden zurück, wenn die Bedingung "while" immer erfüllt ist.

  • Eine Rückgabeanweisung gibt auf allen Steuerpfaden zurück.

Hoffe, das hilft!

+0

Das ist hilfreich, danke. Aber ich hatte auf einen strengeren Algorithmus gehofft, vielleicht etwas aus einem CS-Lehrbuch. Ich konnte nichts im Drachenbuch finden, und andere Compiler-Lehrbücher, die ich gelesen habe. – MrCodeMnky

+0

Was ich beschrieben habe, sollte ziemlich einfach in einen rekursiven Top-Down-Abstieg über AST umgewandelt werden können, genauso wie man Typen für Ausdrücke berechnen würde. – templatetypedef

+0

Ich denke, es wäre einfach, aber ich bin auf der Suche nach strengen. Ich möchte wissen, dass das, was ich implementiere, absolut felsenfest ist. – MrCodeMnky

Verwandte Themen