Ich arbeite an einer neuen Programmiersprache, aber ich war immer darüber erstaunt, dass jeder yaxx / lex verwendet, um den Code zu analysieren, aber ich bin es nicht.
Mein Compiler (der bereits funktioniert) wird in C ++ / STL handcodiert, und ich kann nicht sagen, dass er komplex ist oder zu viel Zeit in Anspruch nimmt. Es hat sowohl eine Art Lexer als auch Parser, aber sie werden nicht automatisch generiert.
Früher schrieb ich einen C-Compiler (nicht vollständige Spezifikation) auf die gleiche Weise - es war in der Lage, das Programm in 1 Durchlauf zu kompilieren, mit all diesen Rückverweisen, die & amp; Preprocessing - das ist definitiv unmöglich mit yacc / lex.
Ich kann mich einfach nicht dazu durchringen, all das zu verwerfen und in yaxx / lex einzutauchen - was vielleicht eine Menge Aufwand erfordert und möglicherweise einige Grammatikeinschränkungen mit sich bringt.
Gibt es etwas, was ich vermisse, wenn ich yacc / lex nicht benutze? Tu ich etwas Böses?
Yacc ist in gewisser Weise unflexibel:
Außerdem habe ich festgestellt, dass der lex / yacc-Objektcode oft größer ist als ein handgeschriebener rekursiver Descent-Parser (der Quellcode neigt dazu, umgekehrt zu sein).
Ich habe ANTLR nicht benutzt, daher kann ich nicht sagen, ob das an diesen Punkten besser ist.
Die Hauptvorteile jeder Art von Lexer / Parser-Generator ist, dass es Ihnen viel mehr Flexibilität gibt, wenn Ihre Sprache sich weiterentwickelt. In einem handcodierten Lexer / Parser (vor allem, wenn Sie in einem einzigen Durchgang viele Funktionen gemischt haben!) Werden Änderungen an der Sprache ziemlich schnell unangenehm, während Sie mit einem Parser-Generator die Änderung erneut ausführen Generator, und mach weiter mit deinem Leben. Es gibt sicherlich keine inhärenten technischen Einschränkungen, um immer nur alles von Hand zu schreiben, aber ich denke, die Evolvabilität und Wartbarkeit der Automatisierung der langweiligen Bits ist es wert!
Der andere große Vorteil der Verwendung von Generatoren ist, dass sie garantiert genau die Sprache verarbeiten, die Sie in der Grammatik angegeben haben. Das kann man von handgeschriebenem Code nicht sagen. Die LR / LALR-Varianten sind auch garantiert O (N), was wiederum nicht von Handkodierung behauptet werden kann, zumindest nicht ohne großen Aufwand beim Erstellen des Beweises.
Ich habe beides geschrieben und habe mit beiden gelebt und ich würde nie wieder Hand-Code schreiben. Ich habe das nur getan, weil ich zu der Zeit nicht yacc auf der Plattform hatte.
Vielleicht verpassen Sie ANTLR , was gut für Sprachen ist, die mit einer rekursiven Abstiegsanalyse-Strategie definiert werden können.
>Es gibt möglicherweise einige Vorteile bei der Verwendung von Yacc / Lex, aber es ist nicht obligatorisch, sie zu verwenden. Es gibt einige Nachteile bei der Verwendung von Yacc / Lex, aber die Vorteile überwiegen in der Regel die Nachteile. Insbesondere ist es oft einfacher, eine Yacc-gesteuerte Grammatik als eine handcodierte zu erhalten, und Sie profitieren von der Automatisierung, die Yacc bietet.
Allerdings ist es nicht schlecht, einen eigenen Parser von Grund auf zu schreiben. Es kann es in Zukunft schwieriger halten, aber es kann es auch leichter machen.
Es hängt sicherlich von der Komplexität Ihrer Sprachgrammatik ab. Eine einfache Grammatik bedeutet, dass es eine einfache Implementierung gibt und Sie können es einfach selbst machen.
Sehen Sie sich vielleicht das denkbar schlechteste Beispiel an: C ++ :) (Kennt jemand eine andere Sprache als natürliche Sprachen, die schwieriger zu analysieren sind?) Auch mit Tools wie Antlr ist es ziemlich schwierig zu bekommen es ist richtig, obwohl es überschaubar ist. Wobei auf der anderen Seite, obwohl es viel schwieriger ist, scheint, dass einige der besten C ++ - Parser, z.B. GCC und LLVM, sind auch meist handgeschrieben.
Wenn Sie nicht zu viel Flexibilität brauchen und Ihre Sprache nicht zu trivial ist, werden Sie mit Hilfe von Antlr sicher etwas Arbeit / Zeit sparen.
Tags und Links programming-languages yacc