Frage

Ich bin neu in der Welt der Compiler, und ich habe kürzlich gehört, über etwas einen Parser-Generator genannt. Von dem, was ich (glaube) ich verstanden habe, nehmen Parser-Generatoren in einer Syntaxdatei und Ausgabe einer Quellcodedatei, die Dateien mit der angegebenen Syntax analysieren kann.

Ein paar Fragen:

  1. Haben verstehe ich das richtig?

  2. Wenn ja, ist Ragel ein solches Werkzeug?

  3. Wenn ja, kann Ragel Ausgang eines D-Parser in D-Quellcode?

Danke!

War es hilfreich?

Lösung

  1. Das ist, im Grunde ist es. Parsergeneratoren verwandelt eine Grammatik in eine Quelldatei, die verwendet werden kann Strings zu erkennen, die Mitglieder der Sprache sind durch die Grammatik definiert. Oft, aber nicht immer, erfordert ein Parser-Generator einen lexikalischen Analysator Text brechen in Token, bevor er seine Arbeit tut. Lex und Yacc sind klassische Beispiele für ein gekoppeltes Lexer und Parser-Generator.

    Moderne Parser-Generatoren bieten zusätzliche Funktionen. Zum Beispiel ANTLR kann Code für lexikalische Analyse, grammatische Analyse, erzeugt und sogar den generierte abstrakten Syntaxbaum gehen. Elkhound erzeugt einen Parser, der die GLR Parsing-Algorithmus. Dies ermöglicht es, ein breiteres Spektrum von Sprachen als nicht-generali Parsing-Algorithmen zu erkennen. PEG Parser keine separate lexikalische Analyse erfordern.

  2. Ragel erzeugt tatsächlich einen lexikalischen Analysator in der Form einer endlichen Zustandsmaschine. Es kann eine reguläre Sprache erkennen, aber keine kontextfreie Sprache. Dies bedeutet, es kann nicht den meisten Programmiersprachen erkennen, einschließlich D.

  3. Ragel tut D-Code generieren, wenn Sie einen schnellen Lexer benötigen.

Um vollständig zu verstehen, was ein Parser-Generator für Sie tut, werden Sie einige formale Sprache und Parsen Theorie benötigen. Es gibt schlimmere Orte zu beginnen, als das The Dragon Buch . Siehe auch:. Learning einen Compiler schreiben

Wenn Sie sich mutig fühlen, sollten Sie das lexing überprüfen und Analysieren von Code verteilt mit dem DMD-Compiler - / DMD2 / src / DMD / -. Lexer.c und parse.c

Andere Tipps

Während Ragel auf regulären Ausdrücken basiert, ist es nicht nur ein regex FSM-Generator. Es erlaubt Rekursion eine zusätzliche Aufruf / Return-Syntax sowie andere Funktionen, die das Parsen nicht-reguläre Sprachen ermöglichen. Während also Ragel FSMs generiert, ermöglicht es, mehrere verschiedene FSMs und stellt Mechanismen erzeugen, an beliebigen Punkten zwischen ihnen für das Springen oder eine spezielle Maschine Übergang Syntax. Es ermöglicht auch beliebigen Code auf Zustandsübergänge ausgeführt werden.

Eine andere Sache, die Ragel einzigartig macht, ist, dass es online ist. Mit anderen Worten, es ist leicht zu Scan-Daten von einer asynchronen Quelle zu verwenden, wie beispielsweise einen nicht-blockierenden Socket. Es ist auch keine dynamischen Ressourcen verwendet, mit der Ausnahme, dass für Call / Return Sie entweder statisch verwenden können, automatische oder dynamische Speicher für den Stack; wie auch immer du willst. Es gibt keinen globalen Zustand, auch nicht.

Ragel ist ziemlich einzigartig. Anders als die meisten (alle?) Traditionelle Generatoren, wurde es für Netzwerk-Programmierung gemacht.

Könnte sein:

MySourceCode -> (Scanner) -> MyScannerDataFile MyScannerDataFile -> (Parser) -> MyParserDataFile MyParserDataFile -> (Codegenerator) -> MyExecutableFile

oder:

MySourceCode -> (ScannerAndParser) -> MyScannerAndParserDataFile MyScannerAndParserDataFile -> (Codegenerator) -> MyExecutableFile

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