J'ai écrit un analyseur C (comme) en utilisant PEG dans Ruby

C'est un article que j'ai écrit quelque chose comme un analyseur C en Ruby. Même si j'ai écrit un analyseur C, ce n'est pas un analyseur C strict et très complet comme pycparser implémenté en Python, mais c'est une implémentation diverse qui a pris environ 3 jours à implémenter.

Dépôt: github.com/hsssnow23/Captain

échantillon 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">

À l'origine, il s'agissait d'un analyseur créé pour un outil qui génère automatiquement du code en ajoutant des informations supplémentaires en C avec des annotations, mais c'est vraiment lent. La raison principale est probablement que l'analyseur PEG utilisé pour l'implémentation n'est pas Packrat Parsing dans mon implémentation. Donc, dans cet article, j'aimerais écrire sur la façon dont j'ai utilisé l'analyseur PEG.

En gros résumé en premier

Avantages du PEG

Inconvénients du PEG

Impressions

facile. C'est extrêmement facile. Je pense que c'est un gros avantage par rapport aux autres analyseurs que vous pouvez commencer à écrire dès que vous pensez à ce qui est facile. Puisque vous pouvez ignorer l'analyse de phrase et écrire l'analyseur et créer un arbre de syntaxe, je pense que c'est plus approprié lorsque vous voulez le faire plus riche que les expressions régulières même s'il s'agit d'un simple analyseur. Cependant, j'ai pensé que ce serait un peu difficile d'écrire un analyseur en PEG, bien qu'il s'agisse déjà d'une spécification comme l'analyseur C. De nombreux langages de programmation existants sont créés avec des générateurs d'analyseurs tels que lex et yacc, et il est difficile d'assurer la cohérence avec eux, et PEG est encore jeune et il est très clair dans quelle mesure il peut être analysé. Il semble que ce ne soit pas le cas. (Honnêtement, je ne suis pas sûr de pouvoir l'analyser si c'est une source en langage C qui pousse le coin)

Cependant, j'ai senti qu'il serait plus facile d'écrire un analyseur dont l'analyseur lui-même change en fonction du contenu de l'analyse. (Je pense qu'il y a peu de situations où cela est nécessaire)

Résumé

Ma conclusion finale est que PEG est l'analyseur le plus recommandé. Cependant, je pense qu'un analyseur avec un petit format qui vous permet de décider vous-même des spécifications convient parfaitement, mais j'ai pensé qu'il pourrait être subtil à utiliser à d'autres fins.

Article de référence: http://kmizu.hatenablog.com/entry/20100203/1265183754

Recommended Posts

J'ai écrit un analyseur C (comme) en utilisant PEG dans Ruby
J'ai créé une bibliothèque d'extension Ruby en C
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
J'ai essayé un problème de calendrier avec Ruby
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai écrit un programme de factorisation prime en Java
Lors de l'installation d'un gem avec l'extension C dans Ruby, je veux le terminer rapidement en utilisant plusieurs cœurs de processeur comme make -j4
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Créer un calendrier avec Ruby
J'ai recherché un framework web avec Gem en Ruby
Multiplication dans un tableau Ruby
Créer une loterie avec Ruby
Je veux créer un fichier Parquet même en Ruby
J'ai écrit un programme de recherche d'itinéraire dans TDD et j'ai essayé de le refactoriser
Écrire des méthodes Ruby en utilisant C (Partie 1)
J'ai créé un PDF avec Java.
Implémenter le client gRPC dans Ruby
J'ai écrit le théorème de Gordobach en java
Faire un appel SOAP en C #
Comment créer une requête à l'aide de variables dans GraphQL [Utilisation de Ruby on Rails]
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
J'ai essayé d'utiliser l'API Elasticsearch en Java
[Ruby] J'ai créé un simple client Ping
Méthodes que j'ai trouvées utiles dans Ruby
J'ai fait une mort risquée avec Ruby
Écrire des méthodes Ruby en utilisant C (Numo :: NArray)
Implémenter quelque chose comme une pile en Java
Écrire des méthodes Ruby à l'aide de C ++ (Partie 2) Benchmark
J'ai essayé d'incorporer une formule dans Javadoc
J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit