Ich habe einen C-Parser (wie) mit PEG in Ruby geschrieben

Es ist ein Artikel, den ich so etwas wie einen C-Parser in Ruby geschrieben habe. Obwohl ich einen C-Parser geschrieben habe, handelt es sich nicht um einen strengen und sehr vollständigen C-Parser wie den in Python implementierten Pycparser, sondern um eine verschiedene Implementierung, deren Implementierung etwa drei Tage dauerte.

Repository: github.com/hsssnow23/Captain

Stichprobe input:

typedef struct {
    unsigned int id;
    float x;
    float y;
} Actor;

output:

#<CTypedef:0x000000037809a8
 @from=
  #<CStruct:0x0000000376a068
   @body=
    [#<CVariable:0x000000034f0350
      @name="id",
      @type=
       #<CType:0x000000034f3780
        @const=false,
        @name="int",
        @pointer=false,
        @prefix="unsigned">,
      @value=nil>,
     #<CVariable:0x000000035b6ca8
      @name="x",
      @type=
       #<CType:0x000000035ad950
        @const=false,
        @name="float",
        @pointer=false,
        @prefix=nil>,
      @value=nil>,
     #<CVariable:0x000000036a0df8
      @name="y",
      @type=
       #<CType:0x000000036a3a30
        @const=false,
        @name="float",
        @pointer=false,
        @prefix=nil>,
      @value=nil>],
   @name=nil>,
 @to="Actor">

Ursprünglich war es ein Parser, der für ein Tool erstellt wurde, das automatisch Code generiert, indem es C zusätzliche Informationen mit Anmerkungen hinzufügt, aber es ist sehr langsam. Wahrscheinlich liegt der Hauptgrund darin, dass der für die Implementierung verwendete PEG-Parser in meiner Implementierung nicht Packrat Parsing ist. In diesem Artikel möchte ich darüber schreiben, wie es war, als ich den PEG-Parser tatsächlich verwendet habe.

Zuerst grob zusammengefasst

Vorteile von PEG

Nachteile von PEG

Impressionen

einfach. Es ist überwältigend einfach. Ich denke, der große Vorteil gegenüber anderen Parsern ist, dass Sie mit dem Schreiben beginnen können, sobald Sie denken, was einfach ist. Da Sie die Phrasenanalyse überspringen und den Parser schreiben und einen Syntaxbaum erstellen können, ist er meiner Meinung nach am besten geeignet, wenn Sie ihn umfangreicher als reguläre Ausdrücke ausführen möchten, obwohl es sich um einen einfachen Parser handelt. Ich dachte jedoch, es wäre etwas schwierig, einen Parser in PEG zu schreiben, obwohl es sich bereits um eine Spezifikation wie den C-Parser handelt. Viele vorhandene Programmiersprachen werden mit Parser-Generatoren wie Lex und Yacc erstellt, und es ist schwierig, die Konsistenz mit ihnen sicherzustellen. PEG ist noch jung und es ist sehr klar, wie weit es analysiert werden kann. Es scheint, dass es nicht ist. (Ehrlich gesagt bin ich nicht sicher, ob ich es analysieren kann, wenn es sich um eine C-Sprachquelle handelt, die in die Ecke stößt)

Ich hatte jedoch das Gefühl, dass es einfacher sein würde, einen Parser zu schreiben, dessen Parser sich je nach Inhalt der Analyse ändert. (Ich denke, es gibt nur wenige Situationen, in denen es benötigt wird)

Zusammenfassung

Meine letzte Schlussfolgerung ist, dass PEG der am meisten empfohlene Parser ist. Obwohl ich sicher bin, dass ein kleinformatiger Parser, den Sie selbst angeben können, eine gute Wahl ist, dachte ich, dass es subtil sein könnte, ihn an anderer Stelle zu verwenden.

Referenzartikel: http://kmizu.hatenablog.com/entry/20100203/1265183754

Recommended Posts

Ich habe einen C-Parser (wie) mit PEG in Ruby geschrieben
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
Ich habe versucht, Code wie eine Typdeklaration in Ruby zu schreiben
Ich habe ein Kalenderproblem mit Ruby versucht
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Wenn ich ein Gem mit C-Erweiterung in Ruby installiere, möchte ich es schnell mit mehreren CPU-Kernen wie make -j4 fertigstellen
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Erstellen eines Kalenders mit Ruby
Ich habe mit Gem in Ruby nach einem Webframework gesucht
Multiplikation innerhalb eines Ruby-Arrays
Erstellen Sie eine Lotterie mit Ruby
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich habe ein Routensuchprogramm in TDD geschrieben und versucht, es umzugestalten
Schreiben Sie Ruby-Methoden mit C (Teil 1)
Ich habe ein PDF mit Java erstellt.
Implementieren Sie den gRPC-Client in Ruby
Ich habe Gordobachs Theorem in Java geschrieben
Machen Sie einen SOAP-Aufruf in C #
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
Ich habe eine Lambda-Funktion in Java geschrieben und mit SAM bereitgestellt
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Methoden, die ich in Ruby nützlich fand
Ich habe mit Ruby einen riskanten Würfel gemacht
Schreiben Sie Ruby-Methoden mit C (Numo :: NArray)
Implementieren Sie so etwas wie einen Stack in Java
Schreiben Sie Ruby-Methoden mit C ++ (Teil 2) Benchmark
Ich habe versucht, eine Formel in Javadoc einzubetten
Ich habe ein Beispiel erstellt, wie ein Delegat in Swift UI 2.0 mit MapKit geschrieben wird