Muss die Ausgabe eines Parsers ein Baum sein oder könnte es auch ein allgemeiner Graph sein?
Gibt es darüber hinaus eine Sprache oder eine plausible Sprache, die allgemeine Diagrammdarstellungen anstelle von Bäumen für ihre Syntax verwendet?
Muss die Ausgabe eines Parsers ein Baum sein oder könnte es auch ein allgemeiner Graph sein?
Gibt es darüber hinaus eine Sprache oder eine plausible Sprache, die allgemeine Diagrammdarstellungen anstelle von Bäumen für ihre Syntax verwendet?
Antworten:
Die Ausgabe eines Parsers muss kein Baum sein. Betrachtet man beispielsweise Referenzen von der USE einer Variablen zu ihrer DEFinition, die dem abstrakten Syntaxbaum überlagert sind, so erhält man sofort ein Diagramm.
Die Sache ist, dass das Parsen im Allgemeinen in einem einzigen Durchgang durchgeführt werden soll - dies war aus historischen Gründen wichtig, z. Anschließend schmücken nachfolgende Phasen den Analysebaum mit zusätzlichen Informationen.
Es gibt solche Dinge wie Graph-Grammatiken, obwohl ich nicht weiß, ob sie zum Parsen von Programmiersprachen verwendet werden.
Die Frage des OP ist etwas rückständig gestellt. Natürlich kann ein Parsing-Algorithmus alles ausgeben, was er will. Die Frage ist eher zu verstehen, wozu Parsing dient und ob der Parser ein Ergebnis ausgibt, das dieses Ziel erreicht. Dann kann man sich fragen, welche Darstellung dafür geeignet ist, zum Beispiel ein Baum oder eine Grafik.
Nun, ich vermute, ein Parser ist ein Algorithmus, der Ihnen die syntaktische Struktur eines als Eingabe gegebenen Satzes gemäß einer vorgegebenen formalen Definition der Syntax der Sprache liefert.
Beachten Sie, dass die Leute möglicherweise nicht einverstanden sind, was die Syntax der Sprache ausmacht. Einige beschränken sich möglicherweise auf ein rein formales Sprach-Backbone, während andere möglicherweise etwas semantischere Überlegungen wie Typ, Genre, Nummer oder andere komplexere Überlegungen anstellen (ich unterscheide weder NLP noch Programmiersprachen). Die meisten Sprachen verfügen über Funktionen, die die Darstellung von Grafiken erfordern. Es ist jedoch Sache des "Implementierers" (mangels eines besseren Wortes), zu entscheiden, ob er dies in die Syntax aufnehmen möchte.
Je nachdem, wie Sie die Syntax definieren, müssen Sie möglicherweise eine andere formale Struktur ausgeben.
Im einfachen Fall von reinem kontextfreiem Parsen kann ein Analysebaum ausreichend sein, mit Ausnahme des Problems der Mehrdeutigkeit, das im Folgenden angesprochen wird, oder der Tatsache, dass Sie ihn möglicherweise ein wenig ändern möchten, um einen AST zu erhalten (siehe unten).
In komplexeren Fällen können jedoch unterschiedliche Strukturen erforderlich sein, die häufig durch Verknüpfungen in der Baumstruktur dargestellt werden. Dies führt zu einer Diagrammstruktur. Dies hängt stark von Ihrer Definition der Sprachsyntax ab.
Außerdem ist nicht klar, welchen Baum Sie ausgeben sollen. Wenn Sie den Fall von TAG-Grammatiken (tree-adjoining grammars) annehmen, funktionieren diese so, dass der Syntaxbaum nicht mit dem Ableitungsbaum identisch ist, obwohl ersterer von letzterem abgeleitet werden kann. Was Sie ausgeben möchten, kann eine relevante Frage sein.
Es gibt auch ein anderes Problem in Bezug auf die Mehrdeutigkeit. Ein gegebener Satz, der zu Ihrer Sprache gehört, kann dies auf viele verschiedene Arten tun, und einer syntaktischen Struktur kann auf viele verschiedene Arten zugewiesen werden.
Dann können Sie wählen, ob Sie nur eine dieser Strukturen nach dem Zufallsprinzip oder nach einem genau definierten Kriterium (z. B. nach Ähnlichkeit) ausgeben möchten. Sie können auch mehrere oder alle ausgeben. Wenn Sie mehrere Dateien ausgeben möchten, ist es in der Regel bequem, diese in einer einzigartigen Struktur zu packen, die die Gemeinsamkeiten miteinander teilt. Dies spart Platz und Rechenzeit und die Komplexität kann ein echtes Problem sein.
Wenn Sie sich dafür entscheiden, alle auszugeben, haben Sie keine andere Wahl, als sie zu teilen, da es möglicherweise unendlich viele mögliche Parser gibt. Und unendlich kann man endlich nur darstellen, wenn man irgendwie einen Zyklus in einem Graphen hat. Sie müssen also im Allgemeinen eine Diagrammstruktur erstellen. Die Eigenschaften dieser Diagrammstruktur hängen jedoch von der Art der von Ihnen gewählten formalen Syntax ab.
Nun ging es auch um Abstract Syntax Trees. Ich habe den "abstrakten" Teil übersprungen, da er Verwirrung stiften würde, imho. In der Tat ist die Frage in ihren verschiedenen Darlegungen bereits verwirrend.
In Bezug auf AST in historischer Perspektive haben sie ihren Ursprung in der Sprache Lisp und in Programmmanipulationssystemen in den Jahren 1960-1970. Die Idee war, Programme als große Ausdrücke, als mathematische Formeln zu betrachten, sowohl für Manipulationszwecke als auch um Eigenschaften zu analysieren oder Semantik auf formale Weise zu definieren, was Mathematiker mit Formeln zu tun wissen. Als Formeln waren sie natürlich baumstrukturiert, konnten aber mit verschiedenen Informationen dekoriert werden, die diese Bäume in Graphen verwandelten. Dies war sowohl formal als auch pragmatisch zweckmäßig und wurde von Compilern und Programmiersystemen weiterverwendet.
Ein AST ist also im Grunde genommen ein Baum, wie der Name andeutet, kann aber weitere Informationen enthalten. Der Rest liegt in der Wahl des Implementierers und in den Augen des Betrachters. Ist es eine Grafik oder ein geschmückter Baum? Der grundlegende AS-Baum ist jedoch von Bedeutung, da dies das Gerüst ist, auf dem Sie sowohl in der Theorie als auch in der Programmierung aufbauen.
Beachten Sie, dass sich der AST vom Analysebaum (Syntax war kontextfrei) unterschied, der durch den in der formalen Sprachtheorie untersuchten Analysealgorithmus erzeugt wurde. Der Grund dafür war, dass das Design der Syntax durch die Parsing-Technologie der damaligen Zeit und die geringe verfügbare Rechenleistung eingeschränkt wurde. Das Ergebnis war, dass Syntaxbäume nur gequälte Varianten dessen waren, was man natürlich für die Struktur des Programms halten würde, und die weitere Verarbeitung, die nicht wirklich Teil des grundlegenden formalen Parsingprozesses war, durchgeführt werden musste, um die sauberere und einfachere Version namens AST zu erhalten.
Die Darstellung von Bäumen auf dem Computer, egal ob abstrakt oder nicht, ist jedoch etwas eingeschränkt, wenn Sie alle Strukturen eines mehrdeutigen Satzes darstellen möchten. Dies verbirgt insbesondere Komplexitätsprobleme. Die Beibehaltung von Mehrdeutigkeiten in einer Diagrammstruktur bei der Übersetzung von Analysebäumen in AS-Bäume kann ebenfalls ein Problem darstellen. Wenn Sie sich damit befassen, ist es jedoch häufig möglich, Ihre konkrete Syntax so zu definieren, dass der Analysebaum als AST dienen kann. Dies wird durch die sehr allgemeinen Algorithmen, die mit Mehrdeutigkeiten umgehen, und durch die Leistungsfähigkeit aktueller Computer ermöglicht.
Wenn Sie mit GLR-Analyse (Generalized LR) analysieren und die Analyse der Eingabe mehrdeutig ist (es gibt mehrere Möglichkeiten, die Eingabe zu analysieren), kann das Ergebnis der Analyse als Parsing-DAG und nicht als Parsing-DAG betrachtet werden Baum analysieren. Die Parser-DAG codiert kompakt viele mögliche Parser: mehrere mögliche Parserbäume.
Die Quintessenz bleibt jedoch, wenn Sie eine kontextfreie Grammatik haben und Ihre Eingabezeichenfolge eindeutig syntaktisch analysierbar ist (es gibt nur eine einzige Ableitung in der Grammatik, die diese Eingabezeichenfolge erzeugt) und die Aufgabe des Analysierens darin besteht, zu produzieren diese Herleitung ... dann wird die Ausgabe des Parsings unter diesen Bedingungen immer notwendigerweise ein Analysebaum sein, da jede Produktion einer kontextfreien Grammatik von Natur aus eine Baumstruktur hat.
Ich habe einmal einen Interpreter für C geschrieben, in dem das "AST" für den Operator + = (zum Beispiel) kein Baum war. Überlegen Sie, a[i++] += d
wo a[i++]
ist int
und d
ist double
. Die impliziten Konvertierungs- und Abrufvorgänge waren in der Struktur explizit, sodass das Problem darin besteht, den Abruf a[i++]
und die Konvertierung auf double zu setzen. Unsere Lösung bestand darin, Bäume aufzugeben. Die resultierende "ASG" sah so aus
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
Ich war von dieser selbst verwirrt, bis ich gerade festgestellt habe , dass es nicht der Baum , die abstrakt ist, weder ist es über einen abstrakten „Syntaxbaum“ , aber die Syntax ist abstrakt.
Um Ihre Frage zu beantworten, komme ich zu dem Schluss, dass ein abstrakter Syntaxbaum sowie ein konkreter Syntaxbaum oder ein Entscheidungsbaum oder ein anderer Baum besser ein Baum sein sollte.
Andererseits sollte niemand daran gehindert sein, ein abstraktes Syntaxdiagramm oder ein abstraktes Syntaxdiagramm oder einen abstrakten Syntaxwürfel oder eine abstrakte Syntaxspezifikation zu verwenden.
Ich nehme an, ein abstrakter Syntaxbaum des "abstrakten Syntaxbaums" hätte mir geholfen, die Verwirrung zu vermeiden.